From 6cf20936531dba4d45fa7e6d54e8dd89065f516b Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 15 Mar 2015 14:31:43 +0100 Subject: [PATCH 01/39] - Commit changes to .gitignore --- .gitignore | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.gitignore b/.gitignore index fc97ceb325e..1c42e1654a5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,11 +2,23 @@ *.a *.ctest *.o +*.obj *.reject *.so *.so.* +*.lib +*.exe +*.dll *.spec *~ +*.bak +*.log +*.pdb +*.idb +*.dep +*.exp +*.gch +*.pch .*.swp *.ninja .ninja_* @@ -138,6 +150,7 @@ sql-bench/test-select sql-bench/test-table-elimination sql-bench/test-transactions sql-bench/test-wisconsin +sql/data sql/gen_lex_hash sql/lex_hash.h sql/mysql_tzinfo_to_sql @@ -230,3 +243,18 @@ storage/mroonga/vendor/groonga/src/grnslap storage/mroonga/vendor/groonga/src/groonga storage/mroonga/vendor/groonga/src/groonga-benchmark storage/mroonga/vendor/groonga/src/suggest/groonga-suggest-create-dataset +# From C++.gitignore +# Compiled Object files +*.slo +*.lo +*.o +# Compiled Dynamic libraries +*.so +*.dylib +# Compiled Static libraries +*.lai +*.la +*.a +# Executables +*.out +*.app From 73d042755345bbc113f6711ce03fd932e72aacd7 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Mon, 16 Mar 2015 17:22:50 +0100 Subject: [PATCH 02/39] Changes to avoid compiling error with Visual Studio 2008 Adding files to ignore --- .gitignore | 237 ++++++++++++++++++++++++++-- storage/innobase/dict/dict0mem.cc | 2 +- storage/innobase/include/dict0mem.h | 1 + storage/innobase/os/os0file.cc | 1 + storage/xtradb/dict/dict0mem.cc | 2 +- storage/xtradb/include/dict0mem.h | 1 + storage/xtradb/os/os0file.cc | 1 + 7 files changed, 227 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 1c42e1654a5..e3df21eb17b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,15 @@ +# Edited by Olivier Bertrand *-t *.a *.ctest *.o -*.obj *.reject *.so *.so.* -*.lib -*.exe -*.dll *.spec *~ *.bak *.log -*.pdb -*.idb -*.dep -*.exp -*.gch -*.pch .*.swp *.ninja .ninja_* @@ -27,6 +18,9 @@ errmsg.sys typescript CMakeCache.txt CMakeFiles/ +MakeFile +cmake_install.cmake +install_manifest.txt CPackConfig.cmake CPackSourceConfig.cmake CTestTestfile.cmake @@ -150,7 +144,6 @@ sql-bench/test-select sql-bench/test-table-elimination sql-bench/test-transactions sql-bench/test-wisconsin -sql/data sql/gen_lex_hash sql/lex_hash.h sql/mysql_tzinfo_to_sql @@ -243,18 +236,230 @@ storage/mroonga/vendor/groonga/src/grnslap storage/mroonga/vendor/groonga/src/groonga storage/mroonga/vendor/groonga/src/groonga-benchmark storage/mroonga/vendor/groonga/src/suggest/groonga-suggest-create-dataset -# From C++.gitignore +# C and C++ + # Compiled Object files *.slo *.lo *.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Compiled Static libraries +*.lib +*.a +*.la +*.lai +*.lo + # Compiled Dynamic libraries *.so +*.so.* *.dylib -# Compiled Static libraries -*.lai -*.la -*.a +*.dll + # Executables +*.exe *.out *.app +*.i*86 +*.x86_64 +*.hex + + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates +*.ncb +*.sln + +*.vcproj +*.vcproj.* +*.vcproj.*.* +*.vcproj.*.*.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Roslyn cache directories +*.ide/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +#NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# If using the old MSBuild-Integrated Package Restore, uncomment this: +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +# sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ diff --git a/storage/innobase/dict/dict0mem.cc b/storage/innobase/dict/dict0mem.cc index 58781fce1d4..8b552e8ab3f 100644 --- a/storage/innobase/dict/dict0mem.cc +++ b/storage/innobase/dict/dict0mem.cc @@ -728,7 +728,7 @@ dict_foreign_set_validate( { dict_foreign_not_exists not_exists(fk_set); - dict_foreign_set::iterator it = std::find_if( + dict_foreign_set::const_iterator it = std::find_if( fk_set.begin(), fk_set.end(), not_exists); if (it == fk_set.end()) { diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index 3e0ca662bc5..a0c24e6dce0 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -51,6 +51,7 @@ Created 1/8/1996 Heikki Tuuri #include #include #include +#include /* Forward declaration. */ struct ib_rbt_t; diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 694038c8e37..f5b0d7287e0 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -117,6 +117,7 @@ UNIV_INTERN ulint os_innodb_umask = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; #else /** Umask for creating files */ UNIV_INTERN ulint os_innodb_umask = 0; +#define ECANCELED 125 #endif /* __WIN__ */ #ifndef UNIV_HOTBACKUP diff --git a/storage/xtradb/dict/dict0mem.cc b/storage/xtradb/dict/dict0mem.cc index 997e630dd15..033ef78b366 100644 --- a/storage/xtradb/dict/dict0mem.cc +++ b/storage/xtradb/dict/dict0mem.cc @@ -744,7 +744,7 @@ dict_foreign_set_validate( { dict_foreign_not_exists not_exists(fk_set); - dict_foreign_set::iterator it = std::find_if( + dict_foreign_set::const_iterator it = std::find_if( fk_set.begin(), fk_set.end(), not_exists); if (it == fk_set.end()) { diff --git a/storage/xtradb/include/dict0mem.h b/storage/xtradb/include/dict0mem.h index b691e28f0b5..deea392f9fd 100644 --- a/storage/xtradb/include/dict0mem.h +++ b/storage/xtradb/include/dict0mem.h @@ -54,6 +54,7 @@ Created 1/8/1996 Heikki Tuuri #include #include #include +#include /* Forward declaration. */ struct ib_rbt_t; diff --git a/storage/xtradb/os/os0file.cc b/storage/xtradb/os/os0file.cc index e419b6d3e5c..e841952435c 100644 --- a/storage/xtradb/os/os0file.cc +++ b/storage/xtradb/os/os0file.cc @@ -123,6 +123,7 @@ UNIV_INTERN ulint os_innodb_umask = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; #else /** Umask for creating files */ UNIV_INTERN ulint os_innodb_umask = 0; +#define ECANCELED 125 #endif /* __WIN__ */ #ifndef UNIV_HOTBACKUP From 7733b247e1fae603b8a439cf03bc47c345a88370 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Thu, 19 Mar 2015 12:21:08 +0100 Subject: [PATCH 03/39] Same changes than in version 10.0.17 --- storage/connect/CMakeLists.txt | 8 +- storage/connect/array.h | 1 + storage/connect/checklvl.h | 7 + storage/connect/connect.cc | 5 +- storage/connect/filamap.cpp | 5 +- storage/connect/filamtxt.cpp | 8 +- storage/connect/filamvct.cpp | 8 +- storage/connect/global.h | 2 +- storage/connect/ha_connect.cc | 338 +++++++--- storage/connect/ha_connect.h | 8 +- storage/connect/json.cpp | 187 ++++-- storage/connect/json.h | 36 +- storage/connect/jsonudf.cpp | 626 ++++++++++++++++++ storage/connect/libdoc.cpp | 5 +- storage/connect/myconn.cpp | 5 +- storage/connect/myutil.cpp | 22 +- storage/connect/odbccat.h | 14 +- storage/connect/odbconn.cpp | 159 +++-- storage/connect/odbconn.h | 20 +- storage/connect/plgdbsem.h | 10 +- storage/connect/plgdbutl.cpp | 27 +- storage/connect/plugutil.c | 28 +- storage/connect/reldef.cpp | 33 +- storage/connect/tabdos.h | 1 + storage/connect/tabjson.cpp | 1128 +++++++++++++++++++++++++------- storage/connect/tabjson.h | 56 +- storage/connect/tabmul.cpp | 11 +- storage/connect/tabmysql.cpp | 15 +- storage/connect/taboccur.cpp | 10 +- storage/connect/tabodbc.cpp | 237 +++++-- storage/connect/tabodbc.h | 15 +- storage/connect/tabpivot.cpp | 28 +- storage/connect/tabpivot.h | 3 +- storage/connect/tabtbl.cpp | 14 +- storage/connect/tabutil.cpp | 33 +- storage/connect/tabutil.h | 9 +- storage/connect/tabxcl.cpp | 2 +- storage/connect/tabxcl.h | 1 + storage/connect/valblk.cpp | 9 +- storage/connect/valblk.h | 6 + storage/connect/value.cpp | 11 +- storage/connect/xindex.h | 1 + storage/connect/xobject.cpp | 25 + storage/connect/xobject.h | 1 + storage/connect/xtable.h | 6 +- 45 files changed, 2510 insertions(+), 674 deletions(-) create mode 100644 storage/connect/jsonudf.cpp diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index 931a811d897..2b1e458e242 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -21,10 +21,10 @@ ha_connect.cc connect.cc user_connect.cc mycat.cc fmdlex.c osutil.c plugutil.c rcmsg.c rcmsg.h array.cpp blkfil.cpp colblk.cpp csort.cpp filamap.cpp filamdbf.cpp filamfix.cpp filamtxt.cpp filamvct.cpp filamzip.cpp -filter.cpp json.cpp maputil.cpp myutil.cpp plgdbutl.cpp reldef.cpp tabcol.cpp -tabdos.cpp tabfix.cpp tabfmt.cpp tabjson.cpp table.cpp tabmul.cpp taboccur.cpp -tabpivot.cpp tabsys.cpp tabtbl.cpp tabutil.cpp tabvct.cpp tabvir.cpp -tabxcl.cpp valblk.cpp value.cpp xindex.cpp xobject.cpp +filter.cpp json.cpp jsonudf.cpp maputil.cpp myutil.cpp plgdbutl.cpp reldef.cpp +tabcol.cpp tabdos.cpp tabfix.cpp tabfmt.cpp tabjson.cpp table.cpp tabmul.cpp +taboccur.cpp tabpivot.cpp tabsys.cpp tabtbl.cpp tabutil.cpp tabvct.cpp +tabvir.cpp tabxcl.cpp valblk.cpp value.cpp xindex.cpp xobject.cpp array.h blkfil.h block.h catalog.h checklvl.h colblk.h connect.h csort.h engmsg.h filamap.h filamdbf.h filamfix.h filamtxt.h filamvct.h filamzip.h diff --git a/storage/connect/array.h b/storage/connect/array.h index 4a818414e9c..6fb38ae6b47 100644 --- a/storage/connect/array.h +++ b/storage/connect/array.h @@ -50,6 +50,7 @@ class DllExport ARRAY : public XOBJECT, public CSORT { // Array descblock // void SetCorrel(bool b) {Correlated = b;} // Methods + using XOBJECT::GetIntValue; virtual void Reset(void) {Bot = -1;} virtual int Qcompare(int *, int *); virtual bool Compare(PXOB) {assert(FALSE); return FALSE;} diff --git a/storage/connect/checklvl.h b/storage/connect/checklvl.h index d1e37afbc93..0c234dfb8b8 100644 --- a/storage/connect/checklvl.h +++ b/storage/connect/checklvl.h @@ -40,4 +40,11 @@ enum USETEMP {TMP_NO = 0, /* Never */ TMP_FORCE = 3, /* Forced for MAP tables */ TMP_TEST = 4}; /* Testing value */ +/***********************************************************************/ +/* Following definitions indicate conversion of TEXT columns. */ +/***********************************************************************/ +enum TYPCONV {TPC_NO = 0, /* Never */ + TPC_YES = 1, /* Always */ + TPC_SKIP = 2}; /* Skip TEXT columns */ + #endif // _CHKLVL_DEFINED_ diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index a54d8ebcc44..1b0db6dca6b 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -469,9 +469,12 @@ RCODE CntReadNext(PGLOBAL g, PTDB tdbp) } while (rc == RC_NF); + if (rc == RC_OK) + rc= EvalColumns(g, tdbp, false); + err: g->jump_level--; - return (rc != RC_OK) ? rc : EvalColumns(g, tdbp, false); + return rc; } // end of CntReadNext /***********************************************************************/ diff --git a/storage/connect/filamap.cpp b/storage/connect/filamap.cpp index 08f87e2b836..1e65fa2a413 100644 --- a/storage/connect/filamap.cpp +++ b/storage/connect/filamap.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -207,8 +207,7 @@ bool MAPFAM::OpenTableFile(PGLOBAL g) /*******************************************************************/ fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK)); fp->Type = TYPE_FB_MAP; - fp->Fname = (char*)PlugSubAlloc(g, NULL, strlen(filename) + 1); - strcpy((char*)fp->Fname, filename); + fp->Fname = PlugDup(g, filename); fp->Next = dbuserp->Openlist; dbuserp->Openlist = fp; fp->Count = 1; diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index 675c021fe51..eb4e026ee8a 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -289,8 +289,7 @@ bool TXTFAM::AddListValue(PGLOBAL g, int type, void *val, PPARM *top) pp->Intval = *(int*)val; break; // case TYPE_STRING: -// pp->Value = PlugSubAlloc(g, NULL, strlen((char*)val) + 1); -// strcpy((char*)pp->Value, (char*)val); +// pp->Value = PlugDup(g, (char*)val); // break; case TYPE_PCHAR: pp->Value = val; @@ -325,8 +324,7 @@ int TXTFAM::StoreValues(PGLOBAL g, bool upd) if (Tdbp->PrepareWriting(g)) return RC_FX; - buf = (char*)PlugSubAlloc(g, NULL, strlen(Tdbp->GetLine()) + 1); - strcpy(buf, Tdbp->GetLine()); + buf = PlugDup(g, Tdbp->GetLine()); rc = AddListValue(g, TYPE_PCHAR, buf, &To_Upd); } // endif upd diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index c449347bbcb..e1f11bbf4cf 100755 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -1451,8 +1451,7 @@ bool VCMFAM::OpenTableFile(PGLOBAL g) /*******************************************************************/ fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK)); fp->Type = TYPE_FB_MAP; - fp->Fname = (char*)PlugSubAlloc(g, NULL, strlen(filename) + 1); - strcpy((char*)fp->Fname, filename); + fp->Fname = PlugDup(g, filename); fp->Next = dbuserp->Openlist; dbuserp->Openlist = fp; fp->Count = 1; @@ -2844,8 +2843,7 @@ bool VMPFAM::MapColumnFile(PGLOBAL g, MODE mode, int i) /*******************************************************************/ fp = (PFBLOCK)PlugSubAlloc(g, NULL, sizeof(FBLOCK)); fp->Type = TYPE_FB_MAP; - fp->Fname = (char*)PlugSubAlloc(g, NULL, strlen(filename) + 1); - strcpy((char*)fp->Fname, filename); + fp->Fname = PlugDup(g, filename); fp->Next = dup->Openlist; dup->Openlist = fp; fp->Count = 1; diff --git a/storage/connect/global.h b/storage/connect/global.h index 88e5094d6d2..a67bb605755 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -235,7 +235,7 @@ typedef struct _global { /* Global structure */ void *Xchk; /* indexes in create/alter */ short Alchecked; /* Checked for ALTER */ short Mrr; /* True when doing mrr */ - short Trace; + int N; /* Utility */ int jump_level; jmp_buf jumper[MAX_JUMP + 2]; } GLOBAL; diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index ba594bdafb0..8d7ab3a7652 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -165,23 +165,24 @@ /***********************************************************************/ /* Initialize the ha_connect static members. */ /***********************************************************************/ -#define SZCONV 8192 -#define SZWORK 67108864 // Default work area size 64M -#define SZWMIN 4194304 // Minimum work area size 4M +#define SZCONV 8192 +#define SZWORK 67108864 // Default work area size 64M +#define SZWMIN 4194304 // Minimum work area size 4M +#define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.03.0006 January 13, 2015"; - char compver[]= "Version 1.03.0006 " __DATE__ " " __TIME__; + char version[]= "Version 1.03.0006 March 16, 2015"; #if defined(WIN32) + char compver[]= "Version 1.03.0006 " __DATE__ " " __TIME__; char slash= '\\'; #else // !WIN32 char slash= '/'; #endif // !WIN32 // int trace= 0; // The general trace value - ulong xconv= 0; // The type conversion option - int zconv= 0; // The text conversion size +// ulong xconv= 0; // The type conversion option +// int zconv= 0; // The text conversion size } // extern "C" #if defined(XMAP) @@ -210,11 +211,16 @@ extern "C" { /***********************************************************************/ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info); +PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, + int pretty, int lvl, int mxr, bool info); void PushWarning(PGLOBAL g, THD *thd, int level); bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, const char *db, char *tab, const char *src, int port); bool ExactInfo(void); USETEMP UseTemp(void); +int GetConvSize(void); +TYPCONV GetTypeConv(void); +uint GetJsonGrpSize(void); uint GetWorkSize(void); void SetWorkSize(uint); extern "C" const char *msglang(void); @@ -289,6 +295,44 @@ static MYSQL_THDVAR_UINT(work_size, "Size of the CONNECT work area.", NULL, NULL, SZWORK, SZWMIN, UINT_MAX, 1); +// Size used when converting TEXT columns to VARCHAR +static MYSQL_THDVAR_INT(conv_size, + PLUGIN_VAR_RQCMDARG, // opt + "Size used when converting TEXT columns.", + NULL, NULL, SZCONV, 0, 65500, 1); + +/** + Type conversion: + no: Unsupported types -> TYPE_ERROR + yes: TEXT -> VARCHAR + skip: skip unsupported type columns in Discovery +*/ +const char *xconv_names[]= +{ + "NO", "YES", "SKIP", NullS +}; + +TYPELIB xconv_typelib= +{ + array_elements(xconv_names) - 1, "xconv_typelib", + xconv_names, NULL +}; + +static MYSQL_THDVAR_ENUM( + type_conv, // name + PLUGIN_VAR_RQCMDARG, // opt + "Unsupported types conversion.", // comment + NULL, // check + NULL, // update function + 0, // def (no) + &xconv_typelib); // typelib + +// Estimate max number of rows for JSON aggregate functions +static MYSQL_THDVAR_UINT(json_grp_size, + PLUGIN_VAR_RQCMDARG, // opt + "max number of rows for JSON aggregate functions.", + NULL, NULL, JSONMAX, 1, INT_MAX, 1); + #if defined(XMSG) || defined(NEWMSG) const char *language_names[]= { @@ -317,6 +361,9 @@ static MYSQL_THDVAR_ENUM( extern "C" int GetTraceValue(void) {return THDVAR(current_thd, xtrace);} bool ExactInfo(void) {return THDVAR(current_thd, exact_info);} USETEMP UseTemp(void) {return (USETEMP)THDVAR(current_thd, use_tempfile);} +int GetConvSize(void) {return THDVAR(current_thd, conv_size);} +TYPCONV GetTypeConv(void) {return (TYPCONV)THDVAR(current_thd, type_conv);} +uint GetJsonGrpSize(void) {return THDVAR(current_thd, json_grp_size);} uint GetWorkSize(void) {return THDVAR(current_thd, work_size);} void SetWorkSize(uint n) { @@ -598,7 +645,11 @@ static int connect_init_func(void *p) } #endif // 0 (LINUX) +#if defined(WIN32) sql_print_information("CONNECT: %s", compver); +#else // !WIN32 + sql_print_information("CONNECT: %s", version); +#endif // !WIN32 #ifdef LIBXML2_SUPPORT XmlInitParserLib(); @@ -906,7 +957,7 @@ ulonglong ha_connect::table_flags() const // HA_NULL_IN_KEY | not implemented yet // HA_FAST_KEY_READ | causes error when sorting (???) HA_NO_TRANSACTIONS | HA_DUPLICATE_KEY_NOT_IN_ORDER | - HA_NO_BLOBS | HA_CAN_TABLE_CONDITION_PUSHDOWN; + HA_NO_BLOBS | HA_MUST_USE_TABLE_CONDITION_PUSHDOWN; ha_connect *hp= (ha_connect*)this; PTOS pos= hp->GetTableOptionStruct(); @@ -934,6 +985,9 @@ ulonglong ha_connect::table_flags() const char *GetListOption(PGLOBAL g, const char *opname, const char *oplist, const char *def) { + if (!oplist) + return (char*)def; + char key[16], val[256]; char *pk, *pv, *pn; char *opval= (char*) def; @@ -968,8 +1022,7 @@ char *GetListOption(PGLOBAL g, const char *opname, } // endif pv if (!stricmp(opname, key)) { - opval= (char*)PlugSubAlloc(g, NULL, strlen(val) + 1); - strcpy(opval, val); + opval= PlugDup(g, val); break; } else if (!pn) break; @@ -997,8 +1050,12 @@ char *ha_connect::GetRealString(const char *s) char *sv; if (IsPartitioned() && s) { - sv= (char*)PlugSubAlloc(xp->g, NULL, strlen(s) + strlen(partname)); +// sv= (char*)PlugSubAlloc(xp->g, NULL, strlen(s) + strlen(partname)); + // With wrong string pattern, the size of the constructed string + // can be more than strlen(s) + strlen(partname) + sv= (char*)PlugSubAlloc(xp->g, NULL, 0); sprintf(sv, s, partname); + PlugSubAlloc(xp->g, NULL, strlen(sv) + 1); } else sv= (char*)s; @@ -1064,9 +1121,16 @@ char *ha_connect::GetStringOption(char *opname, char *sdef) } // endif Table_charset - if (!opval && options && options->oplist) + if (!opval && options && options->oplist) { opval= GetListOption(xp->g, opname, options->oplist); + if (opval && (!stricmp(opname, "connect") + || !stricmp(opname, "tabname") + || !stricmp(opname, "filename"))) + opval = GetRealString(opval); + + } // endif opval + if (!opval) { if (sdef && !strcmp(sdef, "*")) { // Return the handler default value @@ -1443,8 +1507,7 @@ PIXDEF ha_connect::GetIndexInfo(TABLE_SHARE *s) // Now get index information pn= (char*)s->keynames.type_names[n]; - name= (char*)PlugSubAlloc(g, NULL, strlen(pn) + 1); - strcpy(name, pn); // This is probably unuseful + name= PlugDup(g, pn); unique= (kp.flags & 1) != 0; pkp= NULL; @@ -1454,8 +1517,7 @@ PIXDEF ha_connect::GetIndexInfo(TABLE_SHARE *s) // Get the the key parts info for (int k= 0; (unsigned)k < kp.user_defined_key_parts; k++) { pn= (char*)kp.key_part[k].field->field_name; - name= (char*)PlugSubAlloc(g, NULL, strlen(pn) + 1); - strcpy(name, pn); // This is probably unuseful + name= PlugDup(g, pn); // Allocate the key part description block kpp= new(g) KPARTDEF(name, k + 1); @@ -2467,6 +2529,8 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) char *body= filp->Body; unsigned int i; bool ismul= false, x= (tty == TYPE_AM_MYX || tty == TYPE_AM_XDBC); + bool nonul= (tty == TYPE_AM_ODBC && (tdbp->GetMode() == MODE_INSERT || + tdbp->GetMode() == MODE_DELETE)); OPVAL vop= OP_XX; if (!cond) @@ -2484,7 +2548,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) if (trace) htrc("Cond: Ftype=%d name=%s\n", cond_item->functype(), - cond_item->func_name()); + cond_item->func_name()); switch (cond_item->functype()) { case Item_func::COND_AND_FUNC: vop= OP_AND; break; @@ -2503,7 +2567,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) for (i= 0; i < arglist->elements; i++) if ((subitem= li++)) { if (!CheckCond(g, filp, tty, subitem)) { - if (vop == OP_OR) + if (vop == OP_OR || nonul) return NULL; else *p2= 0; @@ -2599,6 +2663,8 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) if (trace) { htrc("Field index=%d\n", pField->field->field_index); htrc("Field name=%s\n", pField->field->field_name); + htrc("Field type=%d\n", pField->field->type()); + htrc("Field_type=%d\n", args[i]->field_type()); } // endif trace // IN and BETWEEN clauses should be col VOP list @@ -2618,8 +2684,9 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) char buff[256]; String *res, tmp(buff, sizeof(buff), &my_charset_bin); Item_basic_constant *pval= (Item_basic_constant *)args[i]; + Item::Type type= args[i]->real_type(); - switch (args[i]->real_type()) { + switch (type) { case COND::STRING_ITEM: case COND::INT_ITEM: case COND::REAL_ITEM: @@ -2644,10 +2711,64 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) if (!x) { // Append the value to the filter - if (args[i]->field_type() == MYSQL_TYPE_VARCHAR) - strcat(strncat(strcat(body, "'"), res->ptr(), res->length()), "'"); - else - strncat(body, res->ptr(), res->length()); + switch (args[i]->field_type()) { + case MYSQL_TYPE_TIMESTAMP: + case MYSQL_TYPE_DATETIME: + if (tty == TYPE_AM_ODBC) { + strcat(body, "{ts '"); + strcat(strncat(body, res->ptr(), res->length()), "'}"); + break; + } // endif ODBC + + case MYSQL_TYPE_DATE: + if (tty == TYPE_AM_ODBC) { + strcat(body, "{d '"); + strcat(strncat(body, res->ptr(), res->length()), "'}"); + break; + } // endif ODBC + + case MYSQL_TYPE_TIME: + if (tty == TYPE_AM_ODBC) { + strcat(body, "{t '"); + strcat(strncat(body, res->ptr(), res->length()), "'}"); + break; + } // endif ODBC + + case MYSQL_TYPE_VARCHAR: + if (tty == TYPE_AM_ODBC && i) { + switch (args[0]->field_type()) { + case MYSQL_TYPE_TIMESTAMP: + case MYSQL_TYPE_DATETIME: + strcat(body, "{ts '"); + strncat(body, res->ptr(), res->length()); + strcat(body, "'}"); + break; + case MYSQL_TYPE_DATE: + strcat(body, "{d '"); + strncat(body, res->ptr(), res->length()); + strcat(body, "'}"); + break; + case MYSQL_TYPE_TIME: + strcat(body, "{t '"); + strncat(body, res->ptr(), res->length()); + strcat(body, "'}"); + break; + default: + strcat(body, "'"); + strncat(body, res->ptr(), res->length()); + strcat(body, "'"); + } // endswitch field type + + } else { + strcat(body, "'"); + strncat(body, res->ptr(), res->length()); + strcat(body, "'"); + } // endif tty + + break; + default: + strncat(body, res->ptr(), res->length()); + } // endswitch field type } else { if (args[i]->field_type() == MYSQL_TYPE_VARCHAR) { @@ -2753,7 +2874,7 @@ const COND *ha_connect::cond_push(const COND *cond) } else if (x && cond) tdbp->SetCondFil(filp); // Wrong filter - } else + } else if (tty != TYPE_AM_JSN && tty != TYPE_AM_JSON) tdbp->SetFilter(CondFilter(g, (Item *)cond)); fin: @@ -3232,6 +3353,7 @@ int ha_connect::ReadIndexed(uchar *buf, OPVAL op, const uchar *key, uint key_len if (trace > 1) htrc("ReadIndexed: op=%d rc=%d\n", op, rc); + table->status= (rc == RC_OK) ? 0 : STATUS_NOT_FOUND; return rc; } // end of ReadIndexed @@ -3348,6 +3470,7 @@ int ha_connect::index_first(uchar *buf) else if (indexing < 0) rc= HA_ERR_INTERNAL_ERROR; else if (CntRewindTable(xp->g, tdbp)) { + table->status= STATUS_NOT_FOUND; rc= HA_ERR_INTERNAL_ERROR; } else rc= rnd_next(buf); @@ -3547,6 +3670,7 @@ int ha_connect::rnd_next(uchar *buf) xp->fnd= xp->nfd= 0; } // endif nrd + table->status= (!rc) ? 0 : STATUS_NOT_FOUND; DBUG_RETURN(rc); } // end of rnd_next @@ -3987,6 +4111,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, case SQLCOM_UPDATE_MULTI: case SQLCOM_SELECT: case SQLCOM_OPTIMIZE: + case SQLCOM_SET_OPTION: break; case SQLCOM_LOCK_TABLES: locked= 1; @@ -4612,12 +4737,12 @@ static char *encode(PGLOBAL g, const char *cnm) @return Return 0 if ok */ -static bool add_field(String *sql, const char *field_name, int typ, - int len, int dec, char *key, uint tm, const char *rem, - char *dft, char *xtra, int flag, bool dbf, char v) +static bool add_field(String *sql, const char *field_name, int typ, int len, + int dec, char *key, uint tm, const char *rem, char *dft, + char *xtra, char *fmt, int flag, bool dbf, char v) { char var = (len > 255) ? 'V' : v; - bool error= false; + bool q, error= false; const char *type= PLGtoMYSQLtype(typ, dbf, var); error|= sql->append('`'); @@ -4658,7 +4783,12 @@ static bool add_field(String *sql, const char *field_name, int typ, if (dft && *dft) { error|= sql->append(" DEFAULT "); - if (!IsTypeNum(typ)) { + if (typ == TYPE_DATE) + q = (strspn(dft, "0123456789 -:/") == strlen(dft)); + else + q = !IsTypeNum(typ); + + if (q) { error|= sql->append("'"); error|= sql->append_for_single_quote(dft, strlen(dft)); error|= sql->append("'"); @@ -4678,6 +4808,12 @@ static bool add_field(String *sql, const char *field_name, int typ, error|= sql->append("'"); } // endif rem + if (fmt && *fmt) { + error|= sql->append(" FIELD_FORMAT='"); + error|= sql->append_for_single_quote(fmt, strlen(fmt)); + error|= sql->append("'"); + } // endif flag + if (flag) { error|= sql->append(" FLAG="); error|= sql->append_ulonglong(flag); @@ -4821,13 +4957,16 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, const char *fncn= "?"; const char *user, *fn, *db, *host, *pwd, *sep, *tbl, *src; const char *col, *ocl, *rnk, *pic, *fcl, *skc; - char *tab, *dsn, *shm, *dpath; + char *tab, *dsn, *shm, *dpath, *objn; #if defined(WIN32) char *nsp= NULL, *cls= NULL; #endif // WIN32 int port= 0, hdr= 0, mxr __attribute__((unused))= 0, mxe= 0, rc= 0; - int cop __attribute__((unused)) = 0; + int cop __attribute__((unused))= 0, pty= 2, lrecl= 0, lvl= 0; #if defined(ODBC_SUPPORT) + POPARM sop = NULL; + char *ucnc = NULL; + bool cnc= false; int cto= -1, qto= -1; #endif // ODBC_SUPPORT uint tm, fnc= FNC_NO, supfnc= (FNC_NO | FNC_COL); @@ -4853,7 +4992,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, if (!g) return HA_ERR_INTERNAL_ERROR; - user= host= pwd= tbl= src= col= ocl= pic= fcl= skc= rnk= dsn= NULL; + user= host= pwd= tbl= src= col= ocl= pic= fcl= skc= rnk= dsn= objn= NULL; // Get the useful create options ttp= GetTypeID(topt->type); @@ -4869,10 +5008,12 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, hdr= (int)topt->header; tbl= topt->tablist; col= topt->colist; + lrecl= (int)topt->lrecl; if (topt->oplist) { host= GetListOption(g, "host", topt->oplist, "localhost"); - user= GetListOption(g, "user", topt->oplist, "root"); + user= GetListOption(g, "user", topt->oplist, + (ttp == TAB_ODBC ? NULL : "root")); // Default value db can come from the DBNAME=xxx option. db= GetListOption(g, "database", topt->oplist, db); col= GetListOption(g, "colist", topt->oplist, col); @@ -4882,6 +5023,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, skc= GetListOption(g, "skipcol", topt->oplist, NULL); rnk= GetListOption(g, "rankcol", topt->oplist, NULL); pwd= GetListOption(g, "password", topt->oplist); + objn= GetListOption(g, "Object", topt->oplist, NULL); #if defined(WIN32) nsp= GetListOption(g, "namespace", topt->oplist); cls= GetListOption(g, "class", topt->oplist); @@ -4891,14 +5033,19 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, mxr= atoi(GetListOption(g,"maxres", topt->oplist, "0")); cto= atoi(GetListOption(g,"ConnectTimeout", topt->oplist, "-1")); qto= atoi(GetListOption(g,"QueryTimeout", topt->oplist, "-1")); + + if ((ucnc= GetListOption(g, "UseDSN", topt->oplist))) + cnc= (!*ucnc || *ucnc == 'y' || *ucnc == 'Y' || atoi(ucnc) != 0); #endif mxe= atoi(GetListOption(g,"maxerr", topt->oplist, "0")); #if defined(PROMPT_OK) cop= atoi(GetListOption(g, "checkdsn", topt->oplist, "0")); #endif // PROMPT_OK + pty= atoi(GetListOption(g,"Pretty", topt->oplist, "2")); + lvl= atoi(GetListOption(g,"Level", topt->oplist, "0")); } else { host= "localhost"; - user= "root"; + user= (ttp == TAB_ODBC ? NULL : "root"); } // endif option_list if (!(shm= (char*)db)) @@ -4939,8 +5086,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, goto err; } // endif tbl - tab= (char*)PlugSubAlloc(g, NULL, strlen(tbl) + 1); - strcpy(tab, tbl); + tab= PlugDup(g, tbl); if ((p= strchr(tab, ','))) *p= 0; @@ -4975,10 +5121,18 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, } // endif dsn #endif // PROMPT_OK - } else if (!dsn) + } else if (!dsn) { sprintf(g->Message, "Missing %s connection string", topt->type); - else + } else { + // Store ODBC additional parameters + sop= (POPARM)PlugSubAlloc(g, NULL, sizeof(ODBCPARM)); + sop->User= (char*)user; + sop->Pwd= (char*)pwd; + sop->Cto= cto; + sop->Qto= qto; + sop->UseCnc= cnc; ok= true; + } // endif's supfnc |= (FNC_TABLE | FNC_DSN | FNC_DRIVER); break; @@ -5058,6 +5212,13 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, else strcpy(g->Message, "Missing OEM module or subtype"); + break; + case TAB_JSON: + if (!fn) + sprintf(g->Message, "Missing %s file name", topt->type); + else + ok= true; + break; case TAB_VIR: ok= true; @@ -5080,7 +5241,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, } // endif src if (ok) { - char *cnm, *rem, *dft, *xtra, *key; + char *cnm, *rem, *dft, *xtra, *key, *fmt; int i, len, prec, dec, typ, flg; // if (cat) @@ -5109,15 +5270,15 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, case FNC_NO: case FNC_COL: if (src) { - qrp= ODBCSrcCols(g, dsn, (char*)src, cto, qto); + qrp= ODBCSrcCols(g, dsn, (char*)src, sop); src= NULL; // for next tests } else - qrp= ODBCColumns(g, dsn, shm, tab, NULL, - mxr, cto, qto, fnc == FNC_COL); + qrp= ODBCColumns(g, dsn, shm, tab, NULL, + mxr, fnc == FNC_COL, sop); break; case FNC_TABLE: - qrp= ODBCTables(g, dsn, shm, tab, mxr, cto, qto, true); + qrp= ODBCTables(g, dsn, shm, tab, mxr, true, sop); break; case FNC_DSN: qrp= ODBCDataSources(g, mxr, true); @@ -5169,6 +5330,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, case TAB_VIR: qrp= VirColumns(g, tab, (char*)db, fnc == FNC_COL); break; + case TAB_JSON: + qrp= JSONColumns(g, (char*)db, fn, objn, pty, lrecl, lvl, fnc == FNC_COL); + break; case TAB_OEM: qrp= OEMColumns(g, topt, tab, (char*)db, fnc == FNC_COL); break; @@ -5185,7 +5349,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, if (fnc != FNC_NO || src || ttp == TAB_PIVOT) { // Catalog like table for (crp= qrp->Colresp; !rc && crp; crp= crp->Next) { - cnm= encode(g, crp->Name); + cnm= (ttp == TAB_PIVOT) ? crp->Name : encode(g, crp->Name); typ= crp->Type; len= crp->Length; dec= crp->Prec; @@ -5201,7 +5365,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, NOT_NULL_FLAG, "", flg, dbf, v); #else // !NEW_WAY if (add_field(&sql, cnm, typ, len, dec, NULL, NOT_NULL_FLAG, - NULL, NULL, NULL, flg, dbf, v)) + NULL, NULL, NULL, NULL, flg, dbf, v)) rc= HA_ERR_OUT_OF_MEM; #endif // !NEW_WAY } // endfor crp @@ -5222,7 +5386,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, typ= len= prec= dec= 0; tm= NOT_NULL_FLAG; cnm= (char*)"noname"; - dft= xtra= key= NULL; + dft= xtra= key= fmt= NULL; v= ' '; #if defined(NEW_WAY) rem= ""; @@ -5234,9 +5398,10 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, for (crp= qrp->Colresp; crp; crp= crp->Next) switch (crp->Fld) { case FLD_NAME: - if (ttp == TAB_CSV && topt->data_charset && + if (ttp == TAB_PRX || + (ttp == TAB_CSV && topt->data_charset && (!stricmp(topt->data_charset, "UTF8") || - !stricmp(topt->data_charset, "UTF-8"))) + !stricmp(topt->data_charset, "UTF-8")))) cnm= crp->Kdata->GetCharValue(i); else cnm= encode(g, crp->Kdata->GetCharValue(i)); @@ -5260,6 +5425,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, if (crp->Kdata->GetIntValue(i)) tm= 0; // Nullable + break; + case FLD_FORMAT: + fmt= (crp->Kdata) ? crp->Kdata->GetCharValue(i) : NULL; break; case FLD_REM: rem= crp->Kdata->GetCharValue(i); @@ -5296,9 +5464,18 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, // typ must be PLG type, not SQL type if (!(plgtyp= TranslateSQLType(typ, dec, prec, v))) { - sprintf(g->Message, "Unsupported SQL type %d", typ); - my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); - goto err; + if (GetTypeConv() == TPC_SKIP) { + // Skip this column + sprintf(g->Message, "Column %s skipped (unsupported type %d)", + cnm, typ); + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); + continue; + } else { + sprintf(g->Message, "Unsupported SQL type %d", typ); + my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + goto err; + } // endif type_conv + } else typ= plgtyp; @@ -5306,7 +5483,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, case TYPE_DOUBLE: // Some data sources do not count dec in length (prec) prec += (dec + 2); // To be safe + break; case TYPE_DECIM: + prec= len; break; default: dec= 0; @@ -5327,7 +5506,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, tm, rem, 0, dbf, v); #else // !NEW_WAY if (add_field(&sql, cnm, typ, prec, dec, key, tm, rem, dft, xtra, - 0, dbf, v)) + fmt, 0, dbf, v)) rc= HA_ERR_OUT_OF_MEM; #endif // !NEW_WAY } // endfor i @@ -6338,58 +6517,6 @@ struct st_mysql_storage_engine connect_storage_engine= /***********************************************************************/ /* CONNECT global variables definitions. */ /***********************************************************************/ -// Size used when converting TEXT columns to VARCHAR -#if defined(_DEBUG) -static MYSQL_SYSVAR_INT(conv_size, zconv, - PLUGIN_VAR_RQCMDARG, // opt - "Size used when converting TEXT columns.", - NULL, NULL, SZCONV, 0, 65500, 1); -#else -static MYSQL_SYSVAR_INT(conv_size, zconv, - PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, // opt - "Size used when converting TEXT columns.", - NULL, NULL, SZCONV, 0, 65500, 1); -#endif - -/** - Type conversion: - no: Unsupported types -> TYPE_ERROR - yes: TEXT -> VARCHAR - skip: skip unsupported type columns in Discovery -*/ -const char *xconv_names[]= -{ - "NO", "YES", "SKIP", NullS -}; - -TYPELIB xconv_typelib= -{ - array_elements(xconv_names) - 1, "xconv_typelib", - xconv_names, NULL -}; - -#if defined(_DEBUG) -static MYSQL_SYSVAR_ENUM( - type_conv, // name - xconv, // varname - PLUGIN_VAR_RQCMDARG, // opt - "Unsupported types conversion.", // comment - NULL, // check - NULL, // update function - 0, // def (no) - &xconv_typelib); // typelib -#else -static MYSQL_SYSVAR_ENUM( - type_conv, // name - xconv, // varname - PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, - "Unsupported types conversion.", // comment - NULL, // check - NULL, // update function - 0, // def (no) - &xconv_typelib); // typelib -#endif - #if defined(XMAP) // Using file mapping for indexes if true static MYSQL_SYSVAR_BOOL(indx_map, xmap, PLUGIN_VAR_RQCMDARG, @@ -6422,6 +6549,7 @@ static struct st_mysql_sys_var* connect_system_variables[]= { #if defined(XMSG) MYSQL_SYSVAR(errmsg_dir_path), #endif // XMSG + MYSQL_SYSVAR(json_grp_size), NULL }; @@ -6438,7 +6566,7 @@ maria_declare_plugin(connect) 0x0103, /* version number (1.03) */ NULL, /* status variables */ connect_system_variables, /* system variables */ - "1.03.0005", /* string version */ + "1.03.0006", /* string version */ MariaDB_PLUGIN_MATURITY_BETA /* maturity */ } maria_declare_plugin_end; diff --git a/storage/connect/ha_connect.h b/storage/connect/ha_connect.h index 922a69a3991..abe8fa079fe 100644 --- a/storage/connect/ha_connect.h +++ b/storage/connect/ha_connect.h @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2014 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -56,11 +56,7 @@ public: oldopn= newopn= NULL; oldpix= newpix= NULL;} - inline char *SetName(PGLOBAL g, char *name) { - char *nm= NULL; - if (name) {nm= (char*)PlugSubAlloc(g, NULL, strlen(name) + 1); - strcpy(nm, name);} - return nm;} + inline char *SetName(PGLOBAL g, char *name) {return PlugDup(g, name);} bool oldsep; // Sepindex before create/alter bool newsep; // Sepindex after create/alter diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 983f45d9cee..c3eb58a2260 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -1,5 +1,5 @@ /*************** json CPP Declares Source Code File (.H) ***************/ -/* Name: json.cpp Version 1.0 */ +/* Name: json.cpp Version 1.1 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ /* */ @@ -34,7 +34,7 @@ /***********************************************************************/ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) { - int i; + int i, rc; bool b = false; PJSON jsp = NULL; STRG src; @@ -48,22 +48,33 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) src.str = s; src.len = len; + // Save stack and allocation environment and prepare error return + if (g->jump_level == MAX_JUMP) { + strcpy(g->Message, MSG(TOO_MANY_JUMPS)); + return NULL; + } // endif jump_level + + if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { + goto err; + } // endif rc + for (i = 0; i < len; i++) switch (s[i]) { case '[': if (jsp) { strcpy(g->Message, "More than one item in file"); - return NULL; + goto err; } else if (!(jsp = ParseArray(g, ++i, src))) - return NULL; + goto err; break; case '{': if (jsp) { strcpy(g->Message, "More than one item in file"); - return NULL; + goto err; } else if (!(jsp = ParseObject(g, ++i, src))) - return NULL; + goto err; + break; case ' ': case '\t': @@ -79,7 +90,12 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) } // endif pretty sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty); - return NULL; + goto err; + case '"': + if (!(jsp = ParseValue(g, i, src))) + goto err; + + break; case '(': b = true; break; @@ -92,13 +108,18 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) default: sprintf(g->Message, "Bad '%c' character near %.*s", s[i], ARGS); - return NULL; + goto err; }; // endswitch s[i] if (!jsp) sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); + g->jump_level--; return jsp; + + err: + g->jump_level--; + return NULL; } // end of ParseJson /***********************************************************************/ @@ -312,18 +333,25 @@ err: /***********************************************************************/ char *ParseString(PGLOBAL g, int& i, STRG& src) { - char *p, *s = src.str; - int n = 0, len = src.len; + char *s = src.str; + uchar *p; + int n = 0, len = src.len; + + // Be sure of memory availability + if (len + 1 - i > (signed)((PPOOLHEADER)g->Sarea)->FreeBlk) { + strcpy(g->Message, "ParseString: Out of memory"); + return NULL; + } // endif len // The size to allocate is not known yet - p = (char*)PlugSubAlloc(g, NULL, 0); + p = (uchar*)PlugSubAlloc(g, NULL, 0); for (; i < len; i++) switch (s[i]) { case '"': p[n++] = 0; PlugSubAlloc(g, NULL, n); - return p; + return (char*)p; case '\\': if (++i < len) { if (s[i] == 'u') { @@ -504,8 +532,11 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, FILE *fs, int pretty) err = (b && jp->WriteChr('\t')); err |= SerializeObject(jp, (PJOB)jsp); break; + case TYPE_JVAL: + err = SerializeValue(jp, (PJVAL)jsp); + break; default: - strcpy(g->Message, "json tree is not an Array or an Object"); + strcpy(g->Message, "Invalid json tree"); } // endswitch Type if (fs) { @@ -575,9 +606,9 @@ bool SerializeObject(JOUT *js, PJOB jobp) else if (js->WriteChr(',')) return true; - if (js->WriteChr('\"') || + if (js->WriteChr('"') || js->WriteStr(pair->Key) || - js->WriteChr('\"') || + js->WriteChr('"') || js->WriteChr(':') || SerializeValue(js, pair->Val)) return true; @@ -631,7 +662,7 @@ JOUTSTR::JOUTSTR(PGLOBAL g) : JOUT(g) N = 0; Max = pph->FreeBlk; - Max = (Max > 512) ? Max - 512 : Max; + Max = (Max > 32) ? Max - 32 : Max; Strp = (char*)PlugSubAlloc(g, NULL, 0); // Size not know yet } // end of JOUTSTR constructor @@ -675,12 +706,13 @@ bool JOUTSTR::Escape(const char *s) for (unsigned int i = 0; i < strlen(s); i++) switch (s[i]) { + case '"': + case '\\': case '\t': case '\n': case '\r': case '\b': - case '\f': - case '"': WriteChr('\\'); + case '\f': WriteChr('\\'); // passthru default: WriteChr(s[i]); @@ -723,12 +755,13 @@ bool JOUTFILE::Escape(const char *s) for (unsigned int i = 0; i < strlen(s); i++) switch (s[i]) { - case '\t': fputs("\\t", Stream); break; - case '\n': fputs("\\n", Stream); break; - case '\r': fputs("\\r", Stream); break; - case '\b': fputs("\\b", Stream); break; - case '\f': fputs("\\f", Stream); break; - case '"': fputs("\\\"", Stream); break; + case '"': fputs("\\\"", Stream); break; + case '\\': fputs("\\\\", Stream); break; + case '\t': fputs("\\t", Stream); break; + case '\n': fputs("\\n", Stream); break; + case '\r': fputs("\\r", Stream); break; + case '\b': fputs("\\b", Stream); break; + case '\f': fputs("\\f", Stream); break; default: fputc(s[i], Stream); break; @@ -848,27 +881,26 @@ PJVAL JOBJECT::GetValue(const char* key) /***********************************************************************/ /* Return the text corresponding to all keys (XML like). */ /***********************************************************************/ -PSZ JOBJECT::GetText(PGLOBAL g) +PSZ JOBJECT::GetText(PGLOBAL g, PSZ text) { - char *p, *text = (char*)PlugSubAlloc(g, NULL, 0); - bool b = true; + int n; - if (!First) + if (!text) { + text = (char*)PlugSubAlloc(g, NULL, 0); + text[0] = 0; + n = 1; + } else + n = 0; + + if (!First && n) return NULL; - else for (PJPR jp = First; jp; jp = jp->Next) { - if (!(p = jp->Val->GetString())) - p = "???"; + else for (PJPR jp = First; jp; jp = jp->Next) + jp->Val->GetText(g, text); - if (b) { - strcpy(text, p); - b = false; - } else - strcat(strcat(text, " "), p); + if (n) + PlugSubAlloc(g, NULL, strlen(text) + 1); - } // endfor jp - - PlugSubAlloc(g, NULL, strlen(text) + 1); - return text; + return text + n; } // end of GetValue; /***********************************************************************/ @@ -891,6 +923,18 @@ void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key) } // end of SetValue +/***********************************************************************/ +/* True if void or if all members are nulls. */ +/***********************************************************************/ +bool JOBJECT::IsNull(void) +{ + for (PJPR jp = First; jp; jp = jp->Next) + if (!jp->Val->IsNull()) + return false; + + return true; +} // end of IsNull + /* -------------------------- Class JARRAY --------------------------- */ /***********************************************************************/ @@ -979,6 +1023,18 @@ bool JARRAY::DeleteValue(int n) } // end of DeleteValue +/***********************************************************************/ +/* True if void or if all members are nulls. */ +/***********************************************************************/ +bool JARRAY::IsNull(void) +{ + for (int i = 0; i < Size; i++) + if (!Mvals[i]->IsNull()) + return false; + + return true; +} // end of IsNull + /* -------------------------- Class JVALUE- -------------------------- */ /***********************************************************************/ @@ -1053,3 +1109,54 @@ PSZ JVALUE::GetString(void) return (Value) ? Value->GetCharString(buf) : NULL; } // end of GetString +/***********************************************************************/ +/* Return the Value's String value. */ +/***********************************************************************/ +PSZ JVALUE::GetText(PGLOBAL g, PSZ text) +{ + if (Jsp && Jsp->GetType() == TYPE_JOB) + return Jsp->GetText(g, text); + + char buf[32]; + PSZ s = (Value) ? Value->GetCharString(buf) : NULL; + + if (s) + strcat(strcat(text, " "), s); + else + strcat(text, " ???"); + + return text; +} // end of GetText + +/***********************************************************************/ +/* Set the Value's value as the given integer. */ +/***********************************************************************/ +void JVALUE::SetInteger(PGLOBAL g, int n) +{ + Value = AllocateValue(g, &n, TYPE_INT); +} // end of AddInteger + +/***********************************************************************/ +/* Set the Value's value as the given DOUBLE. */ +/***********************************************************************/ +void JVALUE::SetFloat(PGLOBAL g, double f) +{ + Value = AllocateValue(g, &f, TYPE_DOUBLE, 6); +} // end of AddFloat + +/***********************************************************************/ +/* Set the Value's value as the given string. */ +/***********************************************************************/ +void JVALUE::SetString(PGLOBAL g, PSZ s) +{ + Value = AllocateValue(g, s, TYPE_STRING); +} // end of AddFloat + +/***********************************************************************/ +/* True when its JSON or normal value is null. */ +/***********************************************************************/ +bool JVALUE::IsNull(void) +{ + return (Jsp) ? Jsp->IsNull() : (Value) ? Value->IsZero() : true; +} // end of IsNull + diff --git a/storage/connect/json.h b/storage/connect/json.h index 11e15c3acd4..3684bbddd19 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -1,5 +1,5 @@ /**************** json H Declares Source Code File (.H) ****************/ -/* Name: json.h Version 1.0 */ +/* Name: json.h Version 1.1 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ /* */ @@ -18,7 +18,8 @@ enum JTYP {TYPE_STRG = 1, TYPE_BOOL = 4, TYPE_INTG = 7, TYPE_JSON = 12, - TYPE_JAR, TYPE_JOB, + TYPE_JAR, + TYPE_JOB, TYPE_JVAL}; class JOUT; @@ -122,6 +123,10 @@ class JPAIR : public BLOCK { public: JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} + inline PSZ GetKey(void) {return Key;} + inline PJVAL GetVal(void) {return Val;} + inline PJPR GetNext(void) {return Next;} + protected: PSZ Key; // This pair key name PJVAL Val; // To the value of the pair @@ -143,20 +148,25 @@ class JSON : public BLOCK { virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL) {X return NULL;} virtual PJPR AddPair(PGLOBAL g, PSZ key) {X return NULL;} virtual PJVAL GetValue(const char *key) {X return NULL;} - virtual PJOB GetObject(void) {X return NULL;} - virtual PJAR GetArray(void) {X return NULL;} + virtual PJOB GetObject(void) {return NULL;} + virtual PJAR GetArray(void) {return NULL;} virtual PJVAL GetValue(int i) {X return NULL;} virtual PVAL GetValue(void) {X return NULL;} virtual PJSON GetJson(void) {X return NULL;} + virtual PJPR GetFirst(void) {X return NULL;} virtual int GetInteger(void) {X return 0;} virtual double GetFloat() {X return 0.0;} virtual PSZ GetString() {X return NULL;} - virtual PSZ GetText(PGLOBAL g) {X return NULL;} + virtual PSZ GetText(PGLOBAL g, PSZ text) {X return NULL;} virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) {X return true;} virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X} virtual void SetValue(PVAL valp) {X} virtual void SetValue(PJSON jsp) {X} + virtual void SetString(PGLOBAL g, PSZ s) {X} + virtual void SetInteger(PGLOBAL g, int n) {X} + virtual void SetFloat(PGLOBAL g, double f) {X} virtual bool DeleteValue(int i) {X return true;} + virtual bool IsNull(void) {X return true;} protected: int Size; @@ -171,13 +181,17 @@ class JOBJECT : public JSON { public: JOBJECT(void) : JSON() {First = Last = NULL;} + using JSON::GetValue; + using JSON::SetValue; virtual void Clear(void) {First = Last = NULL; Size = 0;} virtual JTYP GetType(void) {return TYPE_JOB;} + virtual PJPR GetFirst(void) {return First;} virtual PJPR AddPair(PGLOBAL g, PSZ key); virtual PJOB GetObject(void) {return this;} virtual PJVAL GetValue(const char* key); - virtual PSZ GetText(PGLOBAL g); + virtual PSZ GetText(PGLOBAL g, PSZ text); virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); + virtual bool IsNull(void); protected: PJPR First; @@ -192,6 +206,8 @@ class JARRAY : public JSON { public: JARRAY(void) : JSON() {Alloc = 0; First = Last = NULL; Mvals = NULL;} + using JSON::GetValue; + using JSON::SetValue; virtual void Clear(void) {First = Last = NULL; Size = 0;} virtual JTYP GetType(void) {return TYPE_JAR;} virtual PJAR GetArray(void) {return this;} @@ -200,6 +216,7 @@ class JARRAY : public JSON { virtual PJVAL GetValue(int i); virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); virtual bool DeleteValue(int n); + virtual bool IsNull(void); protected: // Members @@ -223,6 +240,8 @@ class JVALUE : public JSON { {Jsp = jsp; Value = NULL; Next = NULL; Del = false;} JVALUE(PGLOBAL g, PVAL valp); + using JSON::GetValue; + using JSON::SetValue; virtual void Clear(void) {Jsp = NULL; Value = NULL; Next = NULL; Del = false; Size = 0;} virtual JTYP GetType(void) {return TYPE_JVAL;} @@ -234,8 +253,13 @@ class JVALUE : public JSON { virtual int GetInteger(void); virtual double GetFloat(void); virtual PSZ GetString(void); + virtual PSZ GetText(PGLOBAL g, PSZ text); virtual void SetValue(PVAL valp) {Value = valp;} virtual void SetValue(PJSON jsp) {Jsp = jsp;} + virtual void SetString(PGLOBAL g, PSZ s); + virtual void SetInteger(PGLOBAL g, int n); + virtual void SetFloat(PGLOBAL g, double f); + virtual bool IsNull(void); protected: PJSON Jsp; // To the json value diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp new file mode 100644 index 00000000000..194cb6defd6 --- /dev/null +++ b/storage/connect/jsonudf.cpp @@ -0,0 +1,626 @@ +/************* jsonudf C++ Program Source Code File (.CPP) *************/ +/* PROGRAM NAME: jsonudf Version 1.0 */ +/* (C) Copyright to the author Olivier BERTRAND 2015 */ +/* This program are the JSON User Defined Functions . */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant sections of the MariaDB header file. */ +/***********************************************************************/ +#include +#include +#include +#include + +#include "global.h" +#include "plgdbsem.h" +#include "json.h" + +#define MEMFIX 512 + +uint GetJsonGrpSize(void); + +extern "C" { +DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport char *Json_Value(UDF_INIT*, UDF_ARGS*, char*, + unsigned long*, char *, char *); +DllExport void Json_Value_deinit(UDF_INIT*); +DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport char *Json_Array(UDF_INIT*, UDF_ARGS*, char*, + unsigned long*, char *, char *); +DllExport void Json_Array_deinit(UDF_INIT*); +DllExport my_bool Json_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport char *Json_Array_Add(UDF_INIT*, UDF_ARGS*, char*, + unsigned long*, char *, char *); +DllExport void Json_Array_Add_deinit(UDF_INIT*); +DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport char *Json_Object(UDF_INIT*, UDF_ARGS*, char*, + unsigned long*, char *, char *); +DllExport void Json_Object_deinit(UDF_INIT*); +DllExport my_bool Json_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport char *Json_Object_Nonull(UDF_INIT*, UDF_ARGS*, char*, + unsigned long*, char *, char *); +DllExport void Json_Object_Nonull_deinit(UDF_INIT*); +DllExport my_bool Json_Array_Grp_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport void Json_Array_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); +DllExport char *Json_Array_Grp(UDF_INIT*, UDF_ARGS*, char*, + unsigned long*, char *, char *); +DllExport void Json_Array_Grp_clear(UDF_INIT *, char *, char *); +DllExport void Json_Array_Grp_deinit(UDF_INIT*); +DllExport my_bool Json_Object_Grp_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport void Json_Object_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); +DllExport char *Json_Object_Grp(UDF_INIT*, UDF_ARGS*, char*, + unsigned long*, char *, char *); +DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *); +DllExport void Json_Object_Grp_deinit(UDF_INIT*); +} // extern "C" + +/***********************************************************************/ +/* Allocate and initialise the memory area. */ +/***********************************************************************/ +static my_bool JsonInit(UDF_INIT *initid, char *message, + unsigned long reslen, unsigned long memlen) +{ + PGLOBAL g = PlugInit(NULL, memlen); + + if (!g) { + strcpy(message, "Allocation error"); + return true; + } else if (g->Sarea_Size == 0) { + strcpy(message, g->Message); + PlugExit(g); + return true; + } else + initid->ptr = (char*)g; + + initid->maybe_null = false; + initid->max_length = reslen; + return false; +} // end of Json_Object_init + +/***********************************************************************/ +/* Returns true if the argument is a JSON string. */ +/***********************************************************************/ +static my_bool IsJson(UDF_ARGS *args, int i) +{ + return (args->arg_type[i] == STRING_RESULT && + !strnicmp(args->attributes[i], "Json_", 5)); +} // end of IsJson + +/***********************************************************************/ +/* Calculate the reslen and memlen needed by a function. */ +/***********************************************************************/ +static my_bool CalcLen(UDF_ARGS *args, my_bool obj, + unsigned long& reslen, unsigned long& memlen) +{ + unsigned long i, k; + reslen = args->arg_count + 2; + + // Calculate the result max length + for (i = 0; i < args->arg_count; i++) { + if (obj) { + if (!(k = args->attribute_lengths[i])) + k = strlen(args->attributes[i]); + + reslen += (k + 3); // For quotes and : + } // endif obj + + switch (args->arg_type[i]) { + case STRING_RESULT: + if (IsJson(args, i)) + reslen += args->lengths[i]; + else + reslen += (args->lengths[i] + 1) * 2; // Pessimistic ! + + break; + case INT_RESULT: + reslen += 20; + break; + case REAL_RESULT: + reslen += 31; + break; + case DECIMAL_RESULT: + reslen += (args->lengths[i] + 7); // 6 decimals + break; + case TIME_RESULT: + case ROW_RESULT: + case IMPOSSIBLE_RESULT: + default: + // What should we do here ? + break; + } // endswitch arg_type + + } // endfor i + + // Calculate the amount of memory needed + memlen = MEMFIX + sizeof(JOUTSTR) + reslen; + + for (i = 0; i < args->arg_count; i++) { + memlen += (args->lengths[i] + sizeof(JVALUE)); + + if (obj) { + if (!(k = args->attribute_lengths[i])) + k = strlen(args->attributes[i]); + + memlen += (k + sizeof(JOBJECT) + sizeof(JPAIR)); + } else + memlen += sizeof(JARRAY); + + switch (args->arg_type[i]) { + case STRING_RESULT: + if (IsJson(args, i)) + memlen += args->lengths[i] * 5; // Estimate parse memory + + memlen += sizeof(TYPVAL); + break; + case INT_RESULT: + memlen += sizeof(TYPVAL); + break; + case REAL_RESULT: + case DECIMAL_RESULT: + memlen += sizeof(TYPVAL); + break; + case TIME_RESULT: + case ROW_RESULT: + case IMPOSSIBLE_RESULT: + default: + // What should we do here ? + break; + } // endswitch arg_type + + } // endfor i + + return false; +} // end of CalcLen + +/***********************************************************************/ +/* Make a zero terminated string from the passed argument. */ +/***********************************************************************/ +static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i) +{ + if (args->args[i]) { + int n = args->lengths[i]; + PSZ s = (PSZ)PlugSubAlloc(g, NULL, n + 1); + + memcpy(s, args->args[i], n); + s[n] = 0; + return s; + } else + return NULL; + +} // end of MakePSZ + +/***********************************************************************/ +/* Make a valid key from the passed argument. */ +/***********************************************************************/ +static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) +{ + int n = args->attribute_lengths[i]; + bool b; // true if attribute is zero terminated + PSZ p, s = args->attributes[i]; + + if (s && *s && (n || *s == '\'')) { + if ((b = (!n || !s[n]))) + n = strlen(s); + + if (n > 5 && IsJson(args, i)) { + s += 5; + n -= 5; + } else if (*s == '\'' && s[n-1] == '\'') { + s++; + n -= 2; + b = false; + } // endif *s + + if (n < 1) + return "Key"; + + if (!b) { + p = (PSZ)PlugSubAlloc(g, NULL, n + 1); + memcpy(p, s, n); + p[n] = 0; + s = p; + } // endif b + + } // endif s + + return s; +} // end of MakeKey + +/***********************************************************************/ +/* Make a JSON value from the passed argument. */ +/***********************************************************************/ +static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, int i) +{ + char *sap = (args->arg_count > (unsigned)i) ? args->args[i] : NULL; + PJSON jsp; + PJVAL jvp = new(g) JVALUE; + + if (sap) switch (args->arg_type[i]) { + case STRING_RESULT: + if (args->lengths[i]) { + if (IsJson(args, i)) { + if (!(jsp = ParseJson(g, sap, args->lengths[i], 0))) + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, + g->Message); + + if (jsp && jsp->GetType() == TYPE_JVAL) + jvp = (PJVAL)jsp; + else + jvp->SetValue(jsp); + + } else + jvp->SetString(g, MakePSZ(g, args, i)); + + } // endif str + + break; + case INT_RESULT: + jvp->SetInteger(g, *(int*)sap); + break; + case REAL_RESULT: + jvp->SetFloat(g, *(double*)sap); + break; + case DECIMAL_RESULT: + jvp->SetFloat(g, atof(MakePSZ(g, args, i))); + break; + case TIME_RESULT: + case ROW_RESULT: + case IMPOSSIBLE_RESULT: + default: + break; + } // endswitch arg_type + + return jvp; +} // end of MakeValue + +/***********************************************************************/ +/* Make a Json value containing the parameter. */ +/***********************************************************************/ +my_bool Json_Value_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count > 1) { + strcpy(message, "Json_Value cannot accept more than 1 argument"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, message, reslen, memlen); +} // end of Json_Value_init + +char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str; + PJVAL jvp; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + jvp = MakeValue(g, args, 0); + + if (!(str = Serialize(g, jvp, NULL, 0))) + str = strcpy(result, g->Message); + + *res_length = strlen(str); + return str; +} // end of Json_Value + +void Json_Value_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Value_deinit + +/***********************************************************************/ +/* Make a Json array containing all the parameters. */ +/***********************************************************************/ +my_bool Json_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + CalcLen(args, false, reslen, memlen); + return JsonInit(initid, message, reslen, memlen); +} // end of Json_Array_init + +char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str; + uint i; + PJAR arp; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + arp = new(g) JARRAY; + + for (i = 0; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); + + arp->InitArray(g); + + if (!(str = Serialize(g, arp, NULL, 0))) + str = strcpy(result, g->Message); + + *res_length = strlen(str); + return str; +} // end of Json_Array + +void Json_Array_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Array_deinit + +/***********************************************************************/ +/* Add values to a Json array. */ +/***********************************************************************/ +my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Json_Value_Add must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Json_Value_Add first argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, message, reslen, memlen); +} // end of Json_Array_Add_init + +char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str; + PJVAL jvp; + PJAR arp; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + jvp = MakeValue(g, args, 0); + + if (jvp->GetValType() != TYPE_JAR) { + arp = new(g) JARRAY; + arp->AddValue(g, jvp); + } else + arp = jvp->GetArray(); + + for (uint i = 1; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); + + arp->InitArray(g); + + if (!(str = Serialize(g, arp, NULL, 0))) + str = strcpy(result, g->Message); + + *res_length = strlen(str); + return str; +} // end of Json_Array_Add + +void Json_Array_Add_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Array_Add_deinit + +/***********************************************************************/ +/* Make a Json Oject containing all the parameters. */ +/***********************************************************************/ +my_bool Json_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + CalcLen(args, true, reslen, memlen); + return JsonInit(initid, message, reslen, memlen); +} // end of Json_Object_init + +char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str; + uint i; + PJOB objp; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + objp = new(g) JOBJECT; + + for (i = 0; i < args->arg_count; i++) + objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); + + if (!(str = Serialize(g, objp, NULL, 0))) + str = strcpy(result, g->Message); + + *res_length = strlen(str); + return str; +} // end of Json_Object + +void Json_Object_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Object_deinit + +/***********************************************************************/ +/* Make a Json Oject containing all not null parameters. */ +/***********************************************************************/ +my_bool Json_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, + char *message) +{ + unsigned long reslen, memlen; + + CalcLen(args, true, reslen, memlen); + return JsonInit(initid, message, reslen, memlen); +} // end of Json_Object_Nonull_init + +char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str; + uint i; + PJOB objp; + PJVAL jvp; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + objp = new(g) JOBJECT; + + for (i = 0; i < args->arg_count; i++) + if (!(jvp = MakeValue(g, args, i))->IsNull()) + objp->SetValue(g, jvp, MakeKey(g, args, i)); + + if (!(str = Serialize(g, objp, NULL, 0))) + str = strcpy(result, g->Message); + + *res_length = strlen(str); + return str; +} // end of Json_Object_Nonull + +void Json_Object_Nonull_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Object_nonull_deinit + +/***********************************************************************/ +/* Make a Json array from values comming from rows. */ +/***********************************************************************/ +my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, n = GetJsonGrpSize(); + + if (args->arg_count != 1) { + strcpy(message, "Json_Array_Grp can only accept 1 argument"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + reslen *= n; + memlen += ((memlen - MEMFIX) * (n - 1)); + + if (JsonInit(initid, message, reslen, memlen)) + return true; + + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + g->Activityp = (PACTIVITY)new(g) JARRAY; + g->N = (int)n; + return false; +} // end of Json_Array_Grp_init + +void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, + char *is_null, char *error) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + PJAR arp = (PJAR)g->Activityp; + + if (g->N-- > 0) + arp->AddValue(g, MakeValue(g, args, 0)); + +} // end of Json_Array_Grp_add + +char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str; + PGLOBAL g = (PGLOBAL)initid->ptr; + PJAR arp = (PJAR)g->Activityp; + + if (g->N < 0) + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, + "Result truncated to json_grp_size values"); + + arp->InitArray(g); + + if (!(str = Serialize(g, arp, NULL, 0))) + str = strcpy(result, g->Message); + + *res_length = strlen(str); + return str; +} // end of Json_Array_Grp + +void Json_Array_Grp_clear(UDF_INIT *initid, char *is_null, char *error) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + g->Activityp = (PACTIVITY)new(g) JARRAY; + g->N = GetJsonGrpSize(); +} // end of Json_Array_Grp_clear + +void Json_Array_Grp_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Array_Grp_deinit + +/***********************************************************************/ +/* Make a Json object from values comming from rows. */ +/***********************************************************************/ +my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, n = GetJsonGrpSize(); + + if (args->arg_count != 2) { + strcpy(message, "Json_Array_Grp can only accept 2 arguments"); + return true; + } else + CalcLen(args, true, reslen, memlen); + + reslen *= n; + memlen += ((memlen - MEMFIX) * (n - 1)); + + if (JsonInit(initid, message, reslen, memlen)) + return true; + + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + g->Activityp = (PACTIVITY)new(g) JOBJECT; + g->N = (int)n; + return false; +} // end of Json_Object_Grp_init + +void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, + char *is_null, char *error) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + PJOB objp = (PJOB)g->Activityp; + + if (g->N-- > 0) + objp->SetValue(g, MakeValue(g, args, 0), MakePSZ(g, args, 1)); + +} // end of Json_Object_Grp_add + +char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str; + PGLOBAL g = (PGLOBAL)initid->ptr; + PJOB objp = (PJOB)g->Activityp; + + if (g->N < 0) + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, + "Result truncated to json_grp_size values"); + + if (!(str = Serialize(g, objp, NULL, 0))) + str = strcpy(result, g->Message); + + *res_length = strlen(str); + return str; +} // end of Json_Object_Grp + +void Json_Object_Grp_clear(UDF_INIT *initid, char *is_null, char *error) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + g->Activityp = (PACTIVITY)new(g) JOBJECT; + g->N = GetJsonGrpSize(); +} // end of Json_Object_Grp_clear + +void Json_Object_Grp_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Object_Grp_deinit + + diff --git a/storage/connect/libdoc.cpp b/storage/connect/libdoc.cpp index e576c1cf5fa..e5c0ee6cfff 100644 --- a/storage/connect/libdoc.cpp +++ b/storage/connect/libdoc.cpp @@ -1,6 +1,6 @@ /******************************************************************/ /* Implementation of XML document processing using libxml2 */ -/* Author: Olivier Bertrand 2007-2013 */ +/* Author: Olivier Bertrand 2007-2015 */ /******************************************************************/ #include "my_global.h" #include @@ -408,8 +408,7 @@ PFBLOCK LIBXMLDOC::LinkXblock(PGLOBAL g, MODE m, int rc, char *fn) xp->Next = (PX2BLOCK)dup->Openlist; dup->Openlist = (PFBLOCK)xp; xp->Type = TYPE_FB_XML2; - xp->Fname = (LPCSTR)PlugSubAlloc(g, NULL, strlen(fn) + 1); - strcpy((char*)xp->Fname, fn); + xp->Fname = (LPCSTR)PlugDup(g, fn); xp->Count = 1; xp->Length = (m == MODE_READ) ? 1 : 0; xp->Retcode = rc; diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index 2f3d75b52fa..47d781d9ff6 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -51,7 +51,8 @@ #define DLL_EXPORT // Items are exported from this DLL #include "myconn.h" -extern "C" int zconv; +//extern "C" int zconv; +int GetConvSize(void); extern MYSQL_PLUGIN_IMPORT uint mysqld_port; extern MYSQL_PLUGIN_IMPORT char *mysqld_unix_port; @@ -265,7 +266,7 @@ PQRYRES MyColumns(PGLOBAL g, THD *thd, const char *host, const char *db, return NULL; } else if (type == TYPE_STRING) { if (v == 'X') { - len = zconv; + len = GetConvSize(); sprintf(g->Message, "Column %s converted to varchar(%d)", colname, len); PushWarning(g, thd); diff --git a/storage/connect/myutil.cpp b/storage/connect/myutil.cpp index 0d9a1e2fe16..fe504bbe422 100644 --- a/storage/connect/myutil.cpp +++ b/storage/connect/myutil.cpp @@ -26,14 +26,16 @@ #include "myutil.h" #define DLL_EXPORT // Items are exported from this DLL -extern "C" int xconv; +//extern "C" int xconv; +TYPCONV GetTypeConv(void); /************************************************************************/ /* Convert from MySQL type name to PlugDB type number */ /************************************************************************/ int MYSQLtoPLG(char *typname, char *var) { - int type; + int type; + TYPCONV xconv = GetTypeConv(); if (!stricmp(typname, "int") || !stricmp(typname, "mediumint") || !stricmp(typname, "integer")) @@ -57,13 +59,13 @@ int MYSQLtoPLG(char *typname, char *var) type = TYPE_TINY; else if (!stricmp(typname, "text") && var) { switch (xconv) { - case 1: + case TPC_YES: type = TYPE_STRING; *var = 'X'; break; - case 2: + case TPC_SKIP: *var = 'K'; - default: + default: // TPC_NO type = TYPE_ERROR; } // endswitch xconv @@ -88,7 +90,7 @@ int MYSQLtoPLG(char *typname, char *var) } else if (type == TYPE_STRING && !stricmp(typname, "varchar")) // This is to make the difference between CHAR and VARCHAR *var = 'V'; - else if (type == TYPE_ERROR && xconv == 2) + else if (type == TYPE_ERROR && xconv == TPC_SKIP) *var = 'K'; else *var = 0; @@ -174,7 +176,7 @@ const char *PLGtoMYSQLtype(int type, bool dbf, char v) /************************************************************************/ int MYSQLtoPLG(int mytype, char *var) { - int type; + int type, xconv = GetTypeConv(); switch (mytype) { case MYSQL_TYPE_SHORT: @@ -221,7 +223,7 @@ int MYSQLtoPLG(int mytype, char *var) case MYSQL_TYPE_LONG_BLOB: if (var) { switch (xconv) { - case 1: + case TPC_YES: if (*var != 'B') { // This is a TEXT column type = TYPE_STRING; @@ -230,9 +232,9 @@ int MYSQLtoPLG(int mytype, char *var) type = TYPE_ERROR; break; - case 2: + case TPC_SKIP: *var = 'K'; // Skip - default: + default: // TPC_NO type = TYPE_ERROR; } // endswitch xconv diff --git a/storage/connect/odbccat.h b/storage/connect/odbccat.h index 8642d915211..1b5febadd3a 100644 --- a/storage/connect/odbccat.h +++ b/storage/connect/odbccat.h @@ -2,6 +2,14 @@ #define DEFAULT_LOGIN_TIMEOUT -1 // means do not set #define DEFAULT_QUERY_TIMEOUT -1 // means do not set +typedef struct odbc_parms { + char *User; // User connect info + char *Pwd; // Password connect info + int Cto; // Connect timeout + int Qto; // Query timeout + bool UseCnc; // Use SQLConnect (!SQLDriverConnect) + } ODBCPARM, *POPARM; + /***********************************************************************/ /* ODBC catalog function prototypes. */ /***********************************************************************/ @@ -10,8 +18,8 @@ char *ODBCCheckConnection(PGLOBAL g, char *dsn, int cop); #endif // PROMPT_OK PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info); PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, - char *colpat, int maxres, int cto, int qto, bool info); -PQRYRES ODBCSrcCols(PGLOBAL g, char *dsn, char *src, int cto, int qto); + char *colpat, int maxres, bool info, POPARM sop); +PQRYRES ODBCSrcCols(PGLOBAL g, char *dsn, char *src, POPARM sop); PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat, - int maxres, int cto, int qto, bool info); + int maxres, bool info, POPARM sop); PQRYRES ODBCDrivers(PGLOBAL g, int maxres, bool info); diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index 3e616ec8f04..2f2f5f38c29 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -1,5 +1,5 @@ /************ Odbconn C++ Functions Source Code File (.CPP) ************/ -/* Name: ODBCONN.CPP Version 2.1 */ +/* Name: ODBCONN.CPP Version 2.2 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ @@ -37,8 +37,8 @@ #include "xobject.h" //#include "kindex.h" #include "xtable.h" -#include "tabodbc.h" #include "odbccat.h" +#include "tabodbc.h" #include "plgcnx.h" // For DB types #include "resource.h" #include "valblk.h" @@ -53,6 +53,8 @@ extern "C" HINSTANCE s_hModule; // Saved module handle #endif // WIN32 +int GetConvSize(); + /***********************************************************************/ /* Some macro's (should be defined elsewhere to be more accessible) */ /***********************************************************************/ @@ -100,7 +102,12 @@ static int GetSQLCType(int type) case TYPE_BIGINT: tp = SQL_C_SBIGINT; break; case TYPE_DOUBLE: tp = SQL_C_DOUBLE; break; case TYPE_TINY : tp = SQL_C_TINYINT; break; +//#if (ODBCVER >= 0x0300) +// case TYPE_DECIM: tp = SQL_C_NUMERIC; break; (CRASH!!!) +//#else case TYPE_DECIM: tp = SQL_C_CHAR; break; +//#endif + } // endswitch type return tp; @@ -122,7 +129,7 @@ int TranslateSQLType(int stp, int prec, int& len, char& v) case SQL_LONGVARCHAR: // (-1) v = 'V'; type = TYPE_STRING; - len = MY_MIN(abs(len), 256); + len = MY_MIN(abs(len), GetConvSize()); break; case SQL_NUMERIC: // 2 case SQL_DECIMAL: // 3 @@ -291,7 +298,7 @@ static void ResetNullValues(CATPARM *cap) /* of an ODBC table that will be retrieved by GetData commands. */ /***********************************************************************/ PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, - char *colpat, int maxres, int cto, int qto, bool info) + char *colpat, int maxres, bool info, POPARM sop) { int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, @@ -310,10 +317,8 @@ PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, /************************************************************************/ if (!info) { ocp = new(g) ODBConn(g, NULL); - ocp->SetLoginTimeout((DWORD)cto); - ocp->SetQueryTimeout((DWORD)qto); - if (ocp->Open(dsn, 10) < 1) // openReadOnly + noODBCdialog + if (ocp->Open(dsn, sop, 10) < 1) // openReadOnly + noODBCdialog return NULL; if (table && !strchr(table, '%')) { @@ -342,7 +347,7 @@ PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, } // endif ocp if (trace) - htrc("ODBCColumns: max=%d len=%d,%d,%d\n", + htrc("ODBCColumns: max=%d len=%d,%d,%d,%d\n", maxres, length[0], length[1], length[2], length[3]); /************************************************************************/ @@ -388,12 +393,13 @@ PQRYRES ODBCColumns(PGLOBAL g, char *dsn, char *db, char *table, /* ODBCSrcCols: constructs the result blocks containing the */ /* description of all the columns of a Srcdef option. */ /**************************************************************************/ -PQRYRES ODBCSrcCols(PGLOBAL g, char *dsn, char *src, int cto, int qto) +PQRYRES ODBCSrcCols(PGLOBAL g, char *dsn, char *src, POPARM sop) { ODBConn *ocp = new(g) ODBConn(g, NULL); - ocp->SetLoginTimeout((DWORD)cto); - ocp->SetQueryTimeout((DWORD)qto); + if (ocp->Open(dsn, sop, 10) < 1) // openReadOnly + noOdbcDialog + return NULL; + return ocp->GetMetaData(g, dsn, src); } // end of ODBCSrcCols @@ -574,7 +580,7 @@ PQRYRES ODBCDataSources(PGLOBAL g, int maxres, bool info) /* an ODBC database that will be retrieved by GetData commands. */ /**************************************************************************/ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat, - int maxres, int cto, int qto, bool info) + int maxres, bool info, POPARM sop) { int buftyp[] = {TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING, TYPE_STRING}; @@ -594,10 +600,8 @@ PQRYRES ODBCTables(PGLOBAL g, char *dsn, char *db, char *tabpat, /* Open the connection with the ODBC data source. */ /**********************************************************************/ ocp = new(g) ODBConn(g, NULL); - ocp->SetLoginTimeout((DWORD)cto); - ocp->SetQueryTimeout((DWORD)qto); - if (ocp->Open(dsn, 2) < 1) // 2 is openReadOnly + if (ocp->Open(dsn, sop, 2) < 1) // 2 is openReadOnly return NULL; if (!maxres) @@ -863,8 +867,7 @@ bool DBX::BuildErrorMessage(ODBConn* pdb, HSTMT hstmt) for (int i = 0; i < MAX_NUM_OF_MSG && (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) && strcmp((char*)state, "00000"); i++) { - m_ErrMsg[i] = (PSZ)PlugSubAlloc(g, NULL, strlen((char*)msg) + 1); - strcpy(m_ErrMsg[i], (char*)msg); + m_ErrMsg[i] = (PSZ)PlugDup(g, (char*)msg); if (trace) htrc("%s: %s, Native=%d\n", state, msg, native); @@ -878,8 +881,7 @@ bool DBX::BuildErrorMessage(ODBConn* pdb, HSTMT hstmt) } else { snprintf((char*)msg, SQL_MAX_MESSAGE_LENGTH + 1, "%s: %s", m_Msg, MSG(BAD_HANDLE_VAL)); - m_ErrMsg[0] = (PSZ)PlugSubAlloc(g, NULL, strlen((char*)msg) + 1); - strcpy(m_ErrMsg[0], (char*)msg); + m_ErrMsg[0] = (PSZ)PlugDup(g, (char*)msg); if (trace) htrc("%s: rc=%hd\n", SVP(m_ErrMsg[0]), m_RC); @@ -924,12 +926,15 @@ ODBConn::ODBConn(PGLOBAL g, TDBODBC *tdbp) m_RowsetSize = (DWORD)((tdbp) ? tdbp->Rows : 10); m_Catver = (tdbp) ? tdbp->Catver : 0; m_Rows = 0; + m_Fetch = 0; m_Connect = NULL; + m_User = NULL; + m_Pwd = NULL; m_Updatable = true; m_Transact = false; m_Scrollable = (tdbp) ? tdbp->Scrollable : false; - m_First = true; m_Full = false; + m_UseCnc = false; m_IDQuoteChar[0] = '"'; m_IDQuoteChar[1] = 0; //*m_ErrMsg = '\0'; @@ -982,7 +987,7 @@ void ODBConn::ThrowDBX(RETCODE rc, PSZ msg, HSTMT hstmt) void ODBConn::ThrowDBX(PSZ msg) { - DBX* xp = new(m_G) DBX(0, msg); + DBX* xp = new(m_G) DBX(0, "Error"); xp->m_ErrMsg[0] = msg; throw xp; @@ -1005,8 +1010,7 @@ PSZ ODBConn::GetStringInfo(ushort infotype) // *buffer = '\0'; } // endif rc - p = (char *)PlugSubAlloc(m_G, NULL, strlen(buffer) + 1); - strcpy(p, buffer); + p = PlugDup(m_G, buffer); return p; } // end of GetStringInfo @@ -1061,7 +1065,7 @@ void ODBConn::OnSetOptions(HSTMT hstmt) /***********************************************************************/ /* Open: connect to a data source. */ /***********************************************************************/ -int ODBConn::Open(PSZ ConnectString, DWORD options) +int ODBConn::Open(PSZ ConnectString, POPARM sop, DWORD options) { PGLOBAL& g = m_G; //ASSERT_VALID(this); @@ -1070,6 +1074,11 @@ int ODBConn::Open(PSZ ConnectString, DWORD options) m_Updatable = !(options & openReadOnly); m_Connect = ConnectString; + m_User = sop->User; + m_Pwd = sop->Pwd; + m_LoginTimeout = sop->Cto; + m_QueryTimeout = sop->Qto; + m_UseCnc = sop->UseCnc; // Allocate the HDBC and make connection try { @@ -1078,18 +1087,21 @@ int ODBConn::Open(PSZ ConnectString, DWORD options) AllocConnect(options); /*ver = GetStringInfo(SQL_ODBC_VER);*/ - if (Connect(options)) { - strcpy(g->Message, MSG(CONNECT_CANCEL)); - return 0; - } // endif + if (!m_UseCnc) { + if (DriverConnect(options)) { + strcpy(g->Message, MSG(CONNECT_CANCEL)); + return 0; + } // endif + + } else // Connect using SQLConnect + Connect(); /*ver = GetStringInfo(SQL_DRIVER_ODBC_VER);*/ // Verify support for required functionality and cache info // VerifyConnect(); Deprecated GetConnectInfo(); } catch(DBX *xp) { -// strcpy(g->Message, xp->m_ErrMsg[0]); - strcpy(g->Message, xp->GetErrorMessage(0)); + sprintf(g->Message, "%s: %s", xp->m_Msg, xp->GetErrorMessage(0)); Close(); // Free(); return -1; @@ -1163,10 +1175,27 @@ void ODBConn::AllocConnect(DWORD Options) return; } // end of AllocConnect +/***********************************************************************/ +/* Connect to data source using SQLConnect. */ +/***********************************************************************/ +void ODBConn::Connect(void) + { + SQLRETURN rc; + SQLSMALLINT ul = (m_User ? SQL_NTS : 0); + SQLSMALLINT pl = (m_Pwd ? SQL_NTS : 0); + + rc = SQLConnect(m_hdbc, (SQLCHAR*)m_Connect, SQL_NTS, + (SQLCHAR*)m_User, ul, (SQLCHAR*)m_Pwd, pl); + + if (!Check(rc)) + ThrowDBX(rc, "SQLConnect"); + + } // end of Connect + /***********************************************************************/ /* Connect to data source using SQLDriverConnect. */ /***********************************************************************/ -bool ODBConn::Connect(DWORD Options) +bool ODBConn::DriverConnect(DWORD Options) { RETCODE rc; SWORD nResult; @@ -1213,7 +1242,7 @@ bool ODBConn::Connect(DWORD Options) // All done return false; - } // end of Connect + } // end of DriverConnect void ODBConn::VerifyConnect() { @@ -1328,7 +1357,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) rc = SQLFreeStmt(m_hstmt, SQL_CLOSE); if (!Check(rc)) - ThrowDBX(rc, "SQLFreeStmt"); + ThrowDBX(rc, "SQLFreeStmt", m_hstmt); m_hstmt = NULL; } // endif m_hstmt @@ -1343,7 +1372,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) (void*)SQL_SCROLLABLE, 0); if (!Check(rc)) - ThrowDBX(rc, "SQLSetStmtAttr"); + ThrowDBX(rc, "Scrollable", hstmt); } // endif m_Scrollable @@ -1394,7 +1423,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) for (n = 0, colp = tocols; colp; colp = (PODBCCOL)colp->GetNext()) if (!colp->IsSpecial()) - n++; + n++; // n can be 0 for query such as Select count(*) from table if (n && n != (UWORD)ncol) @@ -1430,7 +1459,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); - strcpy(m_G->Message, x->GetErrorMessage(0)); + sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); if (b) SQLCancel(hstmt); @@ -1493,7 +1522,7 @@ int ODBConn::GetResultSize(char *sql, ODBCCOL *colp) /***********************************************************************/ /* Fetch next row. */ /***********************************************************************/ -int ODBConn::Fetch() +int ODBConn::Fetch(int pos) { ASSERT(m_hstmt); int irc; @@ -1503,7 +1532,9 @@ int ODBConn::Fetch() try { // do { - if (m_RowsetSize) { + if (pos) { + rc = SQLExtendedFetch(m_hstmt, SQL_FETCH_ABSOLUTE, pos, &crow, NULL); + } else if (m_RowsetSize) { rc = SQLExtendedFetch(m_hstmt, SQL_FETCH_NEXT, 1, &crow, NULL); } else { rc = SQLFetch(m_hstmt); @@ -1516,29 +1547,22 @@ int ODBConn::Fetch() m_hstmt, m_RowsetSize, rc); if (!Check(rc)) - ThrowDBX(rc, "Fetch", m_hstmt); + ThrowDBX(rc, "Fetching", m_hstmt); - irc = (rc == SQL_NO_DATA_FOUND) ? 0 : (int)crow; - - if (m_First) { - // First fetch. Check whether the full table was read - if ((m_Full = irc < (signed)m_RowsetSize)) { - m_Tdb->Memory = 0; // Not needed anymore - m_Rows = irc; // Table size - } // endif m_Full - - m_First = false; - } // endif m_First - - if (m_Tdb->Memory == 1) - m_Rows += irc; + if (rc == SQL_NO_DATA_FOUND) { + m_Full = (m_Fetch == 1); + irc = 0; + } else + irc = (int)crow; + m_Fetch++; + m_Rows += irc; } catch(DBX *x) { if (trace) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); - strcpy(g->Message, x->GetErrorMessage(0)); + sprintf(g->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); irc = -1; } // end try/catch @@ -1574,7 +1598,7 @@ int ODBConn::PrepareSQL(char *sql) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); - strcpy(g->Message, x->GetErrorMessage(0)); + sprintf(g->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); } // end try/catch } // endif Mode @@ -1620,7 +1644,7 @@ int ODBConn::PrepareSQL(char *sql) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); - strcpy(g->Message, x->GetErrorMessage(0)); + sprintf(g->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); if (b) SQLCancel(hstmt); @@ -1672,7 +1696,7 @@ int ODBConn::ExecuteSQL(void) } // endif ncol } catch(DBX *x) { - strcpy(m_G->Message, x->GetErrorMessage(0)); + sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); SQLCancel(m_hstmt); rc = SQLFreeStmt(m_hstmt, SQL_DROP); m_hstmt = NULL; @@ -1709,9 +1733,11 @@ bool ODBConn::BindParam(ODBCCOL *colp) ThrowDBX(rc, "SQLDescribeParam", m_hstmt); } catch(DBX *x) { - strcpy(m_G->Message, x->GetErrorMessage(0)); + sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); colsize = colp->GetPrecision(); sqlt = GetSQLType(buftype); + dec = IsTypeChar(buftype) ? 0 : colp->GetScale(); + nul = SQL_NULLABLE_UNKNOWN; } // end try/catch buf = colp->GetBuffer(0); @@ -1815,7 +1841,7 @@ bool ODBConn::ExecSQLcommand(char *sql) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); - sprintf(g->Message, "Remote: %s", x->GetErrorMessage(0)); + sprintf(g->Message, "Remote %s: %s", x->m_Msg, x->GetErrorMessage(0)); if (b) SQLCancel(hstmt); @@ -1865,9 +1891,6 @@ PQRYRES ODBConn::GetMetaData(PGLOBAL g, char *dsn, char *src) RETCODE rc; HSTMT hstmt; - if (Open(dsn, 10) < 1) // openReadOnly + noOdbcDialog - return NULL; - try { rc = SQLAllocStmt(m_hdbc, &hstmt); @@ -1903,7 +1926,7 @@ PQRYRES ODBConn::GetMetaData(PGLOBAL g, char *dsn, char *src) } // endfor i } catch(DBX *x) { - strcpy(g->Message, x->GetErrorMessage(0)); + sprintf(g->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); goto err; } // end try/catch @@ -1954,7 +1977,7 @@ PQRYRES ODBConn::GetMetaData(PGLOBAL g, char *dsn, char *src) } // endfor i } catch(DBX *x) { - strcpy(g->Message, x->GetErrorMessage(0)); + sprintf(g->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); qrp = NULL; } // end try/catch @@ -2006,7 +2029,7 @@ bool ODBConn::GetDataSources(PQRYRES qrp) } // endfor i } catch(DBX *x) { - strcpy(m_G->Message, x->GetErrorMessage(0)); + sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rv = true; } // end try/catch @@ -2057,7 +2080,7 @@ bool ODBConn::GetDrivers(PQRYRES qrp) } // endfor n } catch(DBX *x) { - strcpy(m_G->Message, x->GetErrorMessage(0)); + sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rv = true; } // end try/catch @@ -2375,7 +2398,7 @@ int ODBConn::GetCatInfo(CATPARM *cap) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); - strcpy(g->Message, x->GetErrorMessage(0)); + sprintf(g->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); irc = -1; } // end try/catch @@ -2479,7 +2502,7 @@ int ODBConn::Rewind(char *sql, ODBCCOL *tocols) rbuf = (int)crow; } catch(DBX *x) { - strcpy(m_G->Message, x->GetErrorMessage(0)); + sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rbuf = -1; } // end try/catch diff --git a/storage/connect/odbconn.h b/storage/connect/odbconn.h index dfdb9fe7f56..41cc2439354 100644 --- a/storage/connect/odbconn.h +++ b/storage/connect/odbconn.h @@ -119,7 +119,7 @@ class ODBConn : public BLOCK { noOdbcDialog = 0x0008, // Don't display ODBC Connect dialog forceOdbcDialog = 0x0010}; // Always display ODBC connect dialog - int Open(PSZ ConnectString, DWORD Options = 0); + int Open(PSZ ConnectString, POPARM sop, DWORD Options = 0); int Rewind(char *sql, ODBCCOL *tocols); void Close(void); PQRYRES AllocateResult(PGLOBAL g); @@ -135,11 +135,13 @@ class ODBConn : public BLOCK { public: // Operations - void SetLoginTimeout(DWORD sec) {m_LoginTimeout = sec;} - void SetQueryTimeout(DWORD sec) {m_QueryTimeout = sec;} +//void SetLoginTimeout(DWORD sec) {m_LoginTimeout = sec;} +//void SetQueryTimeout(DWORD sec) {m_QueryTimeout = sec;} +//void SetUserName(PSZ user) {m_User = user;} +//void SetUserPwd(PSZ pwd) {m_Pwd = pwd;} int GetResultSize(char *sql, ODBCCOL *colp); int ExecDirectSQL(char *sql, ODBCCOL *tocols); - int Fetch(void); + int Fetch(int pos = 0); int PrepareSQL(char *sql); int ExecuteSQL(void); bool BindParam(ODBCCOL *colp); @@ -155,7 +157,7 @@ class ODBConn : public BLOCK { // Implementation public: -// virtual ~ODBConn(); +//virtual ~ODBConn(); // ODBC operations protected: @@ -163,7 +165,8 @@ class ODBConn : public BLOCK { void ThrowDBX(RETCODE rc, PSZ msg, HSTMT hstmt = SQL_NULL_HSTMT); void ThrowDBX(PSZ msg); void AllocConnect(DWORD dwOptions); - bool Connect(DWORD Options); + void Connect(void); + bool DriverConnect(DWORD Options); void VerifyConnect(void); void GetConnectInfo(void); void Free(void); @@ -185,11 +188,14 @@ class ODBConn : public BLOCK { DWORD m_RowsetSize; char m_IDQuoteChar[2]; PSZ m_Connect; + PSZ m_User; + PSZ m_Pwd; int m_Catver; int m_Rows; + int m_Fetch; bool m_Updatable; bool m_Transact; bool m_Scrollable; - bool m_First; + bool m_UseCnc; bool m_Full; }; // end of ODBConn class definition diff --git a/storage/connect/plgdbsem.h b/storage/connect/plgdbsem.h index e61a49ba9f9..4dc8f293070 100644 --- a/storage/connect/plgdbsem.h +++ b/storage/connect/plgdbsem.h @@ -1,7 +1,7 @@ /************** PlgDBSem H Declares Source Code File (.H) **************/ /* Name: PLGDBSEM.H Version 3.6 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ /* This file contains the PlugDB++ application type definitions. */ /***********************************************************************/ @@ -504,9 +504,10 @@ enum XFLD {FLD_NO = 0, /* Not a field definition item */ FLD_EXTRA = 13, /* Field extra info */ FLD_PRIV = 14, /* Field priviledges */ FLD_DATEFMT = 15, /* Field date format */ - FLD_CAT = 16, /* Table catalog */ - FLD_SCHEM = 17, /* Table schema */ - FLD_TABNAME = 18}; /* Column Table name */ + FLD_FORMAT = 16, /* Field format */ + FLD_CAT = 17, /* Table catalog */ + FLD_SCHEM = 18, /* Table schema */ + FLD_TABNAME = 19}; /* Column Table name */ /***********************************************************************/ /* Result of last SQL noconv query. */ @@ -584,6 +585,7 @@ DllExport PCATLG PlgGetCatalog(PGLOBAL g, bool jump = true); DllExport bool PlgSetXdbPath(PGLOBAL g, PSZ, PSZ, char *, int, char *, int); DllExport void PlgDBfree(MBLOCK&); DllExport void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size); +DllExport char *PlgDBDup(PGLOBAL g, const char *str); DllExport void *PlgDBalloc(PGLOBAL, void *, MBLOCK&); DllExport void *PlgDBrealloc(PGLOBAL, void *, MBLOCK&, size_t); DllExport void NewPointer(PTABS, void *, void *); diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index d8009bcc71f..32f6d6f8366 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -294,8 +294,7 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids, #else // !XMSG GetRcString(ids + crp->Ncol, cname, sizeof(cname)); #endif // !XMSG - crp->Name = (PSZ)PlugSubAlloc(g, NULL, strlen(cname) + 1); - strcpy(crp->Name, cname); + crp->Name = (PSZ)PlugDup(g, cname); } else crp->Name = NULL; // Will be set by caller @@ -311,7 +310,7 @@ PQRYRES PlgAllocResult(PGLOBAL g, int ncol, int maxres, int ids, else crp->Kdata = NULL; - if (g->Trace) + if (trace) htrc("Column(%d) %s type=%d len=%d value=%p\n", crp->Ncol, crp->Name, crp->Type, crp->Length, crp->Kdata); @@ -853,8 +852,7 @@ FILE *PlugOpenFile(PGLOBAL g, LPCSTR fname, LPCSTR ftype) htrc(" fp=%p\n", fp); // fname may be in volatile memory such as stack - fp->Fname = (char*)PlugSubAlloc(g, NULL, strlen(fname) + 1); - strcpy((char*)fp->Fname, fname); + fp->Fname = PlugDup(g, fname); fp->Count = 1; fp->Type = TYPE_FB_FILE; fp->File = fop; @@ -1400,6 +1398,23 @@ void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size) return (memp); } // end of PlgDBSubAlloc +/***********************************************************************/ +/* Program for sub-allocating and copying a string in a storage area. */ +/***********************************************************************/ +char *PlgDBDup(PGLOBAL g, const char *str) + { + if (str) { + char *sm = (char*)PlgDBSubAlloc(g, NULL, strlen(str) + 1); + + if (sm) + strcpy(sm, str); + + return sm; + } else + return NULL; + + } // end of PlgDBDup + /***********************************************************************/ /* PUTOUT: Plug DB object typing routine. */ /***********************************************************************/ diff --git a/storage/connect/plugutil.c b/storage/connect/plugutil.c index c77975e5e30..36d115e0096 100644 --- a/storage/connect/plugutil.c +++ b/storage/connect/plugutil.c @@ -6,7 +6,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1993-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1993-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -144,12 +144,12 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) return NULL; } else { g->Sarea_Size = worksize; - g->Trace = 0; g->Createas = 0; g->Alchecked = 0; g->Mrr = 0; g->Activityp = g->ActivityStart = NULL; g->Xchk = NULL; + g->N = 0; strcpy(g->Message, ""); /*******************************************************************/ @@ -228,7 +228,6 @@ BOOL PlugIsAbsolutePath(LPCSTR path) #endif } - /***********************************************************************/ /* Set the full path of a file relatively to a given path. */ /* Note: this routine is not really implemented for Unix. */ @@ -385,8 +384,7 @@ char *PlugReadMessage(PGLOBAL g, int mid, char *m) err: if (g) { // Called by STEP - msg = (char *)PlugSubAlloc(g, NULL, strlen(stmsg) + 1); - strcpy(msg, stmsg); + msg = PlugDup(g, stmsg); } else // Called by MSG or PlgGetErrorMsg msg = stmsg; @@ -421,8 +419,7 @@ char *PlugGetMessage(PGLOBAL g, int mid) if (g) { // Called by STEP - msg = (char *)PlugSubAlloc(g, NULL, strlen(stmsg) + 1); - strcpy(msg, stmsg); + msg = PlugDup(g, stmsg); } else // Called by MSG or PlgGetErrorMsg msg = stmsg; @@ -536,6 +533,22 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size) return (memp); } /* end of PlugSubAlloc */ +/***********************************************************************/ +/* Program for sub-allocating and copying a string in a storage area. */ +/***********************************************************************/ +char *PlugDup(PGLOBAL g, const char *str) + { + if (str) { + char *sm = (char*)PlugSubAlloc(g, NULL, strlen(str) + 1); + + strcpy(sm, str); + return sm; + } else + return NULL; + + } // end of PlugDup + +#if 0 /***********************************************************************/ /* This routine suballocate a copy of the passed string. */ /***********************************************************************/ @@ -552,6 +565,7 @@ char *PlugDup(PGLOBAL g, const char *str) return(buf); } /* end of PlugDup */ +#endif // 0 /***********************************************************************/ /* This routine makes a pointer from an offset to a memory pointer. */ diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 51d777a7d17..c6cbedd9636 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -153,10 +153,9 @@ char *RELDEF::GetStringCatInfo(PGLOBAL g, PSZ what, PSZ sdef) if (s) { if (!Hc->IsPartitioned() || (stricmp(what, "filename") && stricmp(what, "tabname") - && stricmp(what, "connect"))) { - sval= (char*)PlugSubAlloc(g, NULL, strlen(s) + 1); - strcpy(sval, s); - } else + && stricmp(what, "connect"))) + sval= PlugDup(g, s); + else sval= s; } else if (!stricmp(what, "filename")) { @@ -213,8 +212,7 @@ bool TABDEF::Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR am) { int poff = 0; - Name = (PSZ)PlugSubAlloc(g, NULL, strlen(name) + 1); - strcpy(Name, name); + Name = (PSZ)PlugDup(g, name); Cat = cat; Hc = ((MYCAT*)cat)->GetHandler(); Catfunc = GetFuncID(GetStringCatInfo(g, "Catfunc", NULL)); @@ -712,8 +710,7 @@ COLDEF::COLDEF(void) : COLCRT() /***********************************************************************/ int COLDEF::Define(PGLOBAL g, void *memp, PCOLINFO cfp, int poff) { - Name = (PSZ)PlugSubAlloc(g, memp, strlen(cfp->Name) + 1); - strcpy(Name, cfp->Name); + Name = (PSZ)PlugDup(g, cfp->Name); if (!(cfp->Flags & U_SPECIAL)) { Poff = poff; @@ -735,22 +732,16 @@ int COLDEF::Define(PGLOBAL g, void *memp, PCOLINFO cfp, int poff) Key = cfp->Key; Freq = cfp->Freq; - if (cfp->Remark && *cfp->Remark) { - Desc = (PSZ)PlugSubAlloc(g, memp, strlen(cfp->Remark) + 1); - strcpy(Desc, cfp->Remark); - } // endif Remark + if (cfp->Remark && *cfp->Remark) + Desc = (PSZ)PlugDup(g, cfp->Remark); - if (cfp->Datefmt) { - Decode = (PSZ)PlugSubAlloc(g, memp, strlen(cfp->Datefmt) + 1); - strcpy(Decode, cfp->Datefmt); - } // endif Datefmt + if (cfp->Datefmt) + Decode = (PSZ)PlugDup(g, cfp->Datefmt); } // endif special - if (cfp->Fieldfmt) { - Fmt = (PSZ)PlugSubAlloc(g, memp, strlen(cfp->Fieldfmt) + 1); - strcpy(Fmt, cfp->Fieldfmt); - } // endif Fieldfmt + if (cfp->Fieldfmt) + Fmt = (PSZ)PlugDup(g, cfp->Fieldfmt); Flags = cfp->Flags; return (Flags & (U_VIRTUAL|U_SPECIAL)) ? 0 : Long; diff --git a/storage/connect/tabdos.h b/storage/connect/tabdos.h index 156d46b9791..b7150294e9b 100644 --- a/storage/connect/tabdos.h +++ b/storage/connect/tabdos.h @@ -222,6 +222,7 @@ class DllExport DOSCOL : public COLBLK { virtual PVBLK GetDval(void) {return Dval;} // Methods + using COLBLK::Print; virtual bool VarSize(void); virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); virtual void ReadColumn(PGLOBAL g); diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index a3c56965794..9ffa1d6cc78 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -1,5 +1,5 @@ /************* tabjson C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: tabxjson Version 1.0 */ +/* PROGRAM NAME: tabjson Version 1.1 */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ /* This program are the JSON class DB execution routines. */ /***********************************************************************/ @@ -31,12 +31,451 @@ #endif // ZIP_SUPPORT #include "tabmul.h" #include "checklvl.h" +#include "resource.h" +#include "mycat.h" + +/***********************************************************************/ +/* This should be an option. */ +/***********************************************************************/ +#define MAXCOL 200 /* Default max column nb in result */ +#define TYPE_UNKNOWN 12 /* Must be greater than other types */ /***********************************************************************/ /* External function. */ /***********************************************************************/ USETEMP UseTemp(void); +/***********************************************************************/ +/* Make the document tree from a file. */ +/***********************************************************************/ +PJSON MakeJsonTree(PGLOBAL g, char *fn, char *objn, int pty, + PJAR& doc, DWORD& drc) +{ + char *p, *memory, *objpath, *key; + int len, i = 0; + HANDLE hFile; + MEMMAP mm; + PJSON jsp, top; + PJOB objp = NULL; + PJAR arp = NULL; + PJVAL val = NULL; + + /*********************************************************************/ + /* Create the mapping file object. */ + /*********************************************************************/ + hFile = CreateFileMap(g, fn, &mm, MODE_READ, false); + + if (hFile == INVALID_HANDLE_VALUE) { + drc = GetLastError(); + + if (!*g->Message) + sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int)drc, fn); + + return NULL; + } // endif hFile + + /*********************************************************************/ + /* Get the file size (assuming file is smaller than 4 GB) */ + /*********************************************************************/ + len = mm.lenL; + memory = (char *)mm.memory; + + if (!len) { // Empty file + CloseFileHandle(hFile); + CloseMemMap(memory, len); + drc = ENOENT; + return NULL; + } else if (!memory) { + sprintf(g->Message, MSG(MAP_VIEW_ERROR), fn, drc); + CloseFileHandle(hFile); + return NULL; + } // endif Memory + + CloseFileHandle(hFile); // Not used anymore + + /*********************************************************************/ + /* Parse the json file and allocate its tree structure. */ + /*********************************************************************/ + g->Message[0] = 0; + jsp = top = ParseJson(g, memory, len, pty); + CloseMemMap(memory, len); + drc = EBADF; + + if (!jsp && g->Message[0]) + return NULL; + + objpath = PlugDup(g, objn); // NULL if !objn + + /*********************************************************************/ + /* Find the table in the tree structure. */ + /*********************************************************************/ + for (doc = NULL; jsp && objpath; objpath = p) { + if ((p = strchr(objpath, ':'))) + *p++ = 0; + + if (*objpath != '[') { // objpass is a key + if (jsp->GetType() != TYPE_JOB) { + strcpy(g->Message, "Table path does no match json file"); + return NULL; + } // endif Type + + key = objpath; + objp = jsp->GetObject(); + arp = NULL; + val = objp->GetValue(key); + + if (!val || !(jsp = val->GetJson())) { + sprintf(g->Message, "Cannot find object key %s", key); + return NULL; + } // endif val + + } else if (objpath[strlen(objpath)-1] == ']') { + if (jsp->GetType() != TYPE_JAR) { + strcpy(g->Message, "Table path does no match json file"); + return NULL; + } // endif Type + + arp = jsp->GetArray(); + objp = NULL; + i = atoi(objpath+1) - 1; + val = arp->GetValue(i); + + if (!val) { + sprintf(g->Message, "Cannot find array value %d", i); + return NULL; + } // endif val + + } else { + sprintf(g->Message, "Invalid Table path %s", objn); + return NULL; + } // endif objpath + + jsp = val->GetJson(); + } // endfor objpath + + if (jsp && jsp->GetType() == TYPE_JAR) + doc = jsp->GetArray(); + else { + // The table is void or is just one object or one value + doc = new(g) JARRAY; + + if (val) { + doc->AddValue(g, val); + doc->InitArray(g); + } else if (jsp) { + doc->AddValue(g, new(g) JVALUE(jsp)); + doc->InitArray(g); + } // endif val + + if (objp) + objp->SetValue(g, new(g) JVALUE(doc), key); + else if (arp) + arp->SetValue(g, new(g) JVALUE(doc), i); + else + top = doc; + + } // endif jsp + + return top; +} // end of MakeJsonTree + +typedef struct _jncol { + struct _jncol *Next; + char *Name; + char *Fmt; + int Type; + int Len; + int Scale; + bool Cbn; + bool Found; +} JCOL, *PJCL; + +/***********************************************************************/ +/* JSONColumns: construct the result blocks containing the description */ +/* of all the columns of a table contained inside a JSON file. */ +/***********************************************************************/ +PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, + int pretty, int lrecl, int lvl, bool info) +{ + static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, + TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING}; + static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, + FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; + static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; + char filename[_MAX_PATH], colname[65], fmt[129], *buf; + int i, j, n = 0; + int ncol = sizeof(buftyp) / sizeof(int); + FILE *infile; + DWORD drc; + PVAL valp; + JCOL jcol; + PJCL jcp, fjcp = NULL, pjcp = NULL; + PJPR *jrp, jpp; + PJSON jsp; + PJVAL jvp; + PJOB row; + PJAR doc; + PQRYRES qrp; + PCOLRES crp; + + if (info) { + length[0] = 128; + length[7] = 256; + goto skipit; + } // endif info + + if (trace) + htrc("File %s pretty=%d lvl=%d lrecl=%d\n", + SVP(fn), pretty, lvl, lrecl); + + /*********************************************************************/ + /* Open the input file. */ + /*********************************************************************/ + if (!fn) { + strcpy(g->Message, MSG(MISSING_FNAME)); + return NULL; + } else + PlugSetPath(filename, fn, dp); + + if (pretty == 2) { + if (!MakeJsonTree(g, filename, objn, pretty, doc, drc)) + return NULL; + + jsp = (doc) ? doc->GetValue(0) : NULL; + } else { + if (!lrecl) { + sprintf(g->Message, "LRECL must be specified for pretty=%d", pretty); + return NULL; + } else if (!(buf = (char*)PlugSubAlloc(g, NULL, lrecl))) { + sprintf(g->Message, "Alloc error, lrecl=%d", lrecl); + return NULL; + } // endif buf + + if (!(infile = global_fopen(g, MSGID_CANNOT_OPEN, filename, "r"))) + return NULL; + + // Read first record + for (i = 0; i <= pretty; i++) + if (!fgets(buf, lrecl, infile)) { + if (feof(infile)) { + strcpy(g->Message, "Void json table"); + return NULL; + } // endif fgets + + sprintf(g->Message, MSG(READ_ERROR), filename, strerror(0)); + return NULL; + } // endif fgets + + jsp = ParseJson(g, buf, strlen(buf), pretty, NULL); + } // endif pretty + + if (!(row = (jsp) ? jsp->GetObject() : NULL)) { + strcpy(g->Message, "Can only retrieve columns from object rows"); + return NULL; + } // endif row + + jcol.Next = NULL; + jcol.Found = true; + colname[64] = 0; + fmt[128] = 0; + jrp = (PJPR*)PlugSubAlloc(g, NULL, sizeof(PJPR) * lvl); + + /*********************************************************************/ + /* Analyse the JSON tree and define columns. */ + /*********************************************************************/ + for (i = 1; ; i++) { + for (jpp = row->GetFirst(); jpp; jpp = jpp->GetNext()) { + for (j = 0; j < lvl; j++) + jrp[j] = NULL; + + more: + strncpy(colname, jpp->GetKey(), 64); + *fmt = 0; + j = 0; + jvp = jpp->GetVal(); + + retry: + if ((valp = jvp ? jvp->GetValue() : NULL)) { + jcol.Type = valp->GetType(); + jcol.Len = valp->GetValLen(); + jcol.Scale = valp->GetValPrec(); + jcol.Cbn = valp->IsNull(); + } else if (!jvp || jvp->IsNull()) { + jcol.Type = TYPE_UNKNOWN; + jcol.Len = jcol.Scale = 0; + jcol.Cbn = true; + } else if (j < lvl) { + if (!*fmt) + strcpy(fmt, colname); + + jsp = jvp->GetJson(); + + switch (jsp->GetType()) { + case TYPE_JOB: + if (!jrp[j]) + jrp[j] = jsp->GetFirst(); + + strncat(strncat(fmt, ":", 128), jrp[j]->GetKey(), 128); + strncat(strncat(colname, "_", 64), jrp[j]->GetKey(), 64); + jvp = jrp[j]->GetVal(); + j++; + break; + case TYPE_JAR: + strncat(fmt, ":", 128); + jvp = jsp->GetValue(0); + break; + default: + sprintf(g->Message, "Logical error after %s", fmt); + goto err; + } // endswitch jsp + + goto retry; + } else { + jcol.Type = TYPE_STRING; + jcol.Len = 256; + jcol.Scale = 0; + jcol.Cbn = true; + } // endif's + + // Check whether this column was already found + for (jcp = fjcp; jcp; jcp = jcp->Next) + if (!strcmp(colname, jcp->Name)) + break; + + if (jcp) { + if (jcp->Type != jcol.Type) + jcp->Type = TYPE_STRING; + + if (*fmt && (!jcp->Fmt || strlen(jcp->Fmt) < strlen(fmt))) { + jcp->Fmt = PlugDup(g, fmt); + length[7] = MY_MAX(length[7], strlen(fmt)); + } // endif *fmt + + jcp->Len = MY_MAX(jcp->Len, jcol.Len); + jcp->Scale = MY_MAX(jcp->Scale, jcol.Scale); + jcp->Cbn |= jcol.Cbn; + jcp->Found = true; + } else { + // New column + jcp = (PJCL)PlugSubAlloc(g, NULL, sizeof(JCOL)); + *jcp = jcol; + jcp->Cbn |= (i > 1); + jcp->Name = PlugDup(g, colname); + length[0] = MY_MAX(length[0], strlen(colname)); + + if (*fmt) { + jcp->Fmt = PlugDup(g, fmt); + length[7] = MY_MAX(length[7], strlen(fmt)); + } else + jcp->Fmt = NULL; + + if (pjcp) { + jcp->Next = pjcp->Next; + pjcp->Next = jcp; + } else + fjcp = jcp; + + n++; + } // endif jcp + + pjcp = jcp; + + for (j = lvl - 1; j >= 0; j--) + if (jrp[j] && (jrp[j] = jrp[j]->GetNext())) + goto more; + + } // endfor jpp + + // Missing column can be null + for (jcp = fjcp; jcp; jcp = jcp->Next) { + jcp->Cbn |= !jcp->Found; + jcp->Found = false; + } // endfor jcp + + if (pretty != 2) { + // Read next record + if (!fgets(buf, lrecl, infile)) { + if (!feof(infile)) { + sprintf(g->Message, MSG(READ_ERROR), filename, strerror(0)); + return NULL; + } else + jsp = NULL; + + } else if (pretty == 1 && strlen(buf) == 1 && *buf == ']') { + jsp = NULL; + } else + jsp = ParseJson(g, buf, strlen(buf), pretty, NULL); + + } else + jsp = doc->GetValue(i); + + if (!(row = (jsp) ? jsp->GetObject() : NULL)) + break; + + } // endor i + + if (pretty != 2) + fclose(infile); + + skipit: + if (trace) + htrc("CSVColumns: n=%d len=%d\n", n, length[0]); + + /*********************************************************************/ + /* Allocate the structures used to refer to the result set. */ + /*********************************************************************/ + qrp = PlgAllocResult(g, ncol, n, IDS_COLUMNS + 3, + buftyp, fldtyp, length, false, false); + + crp = qrp->Colresp->Next->Next->Next->Next->Next->Next; + crp->Name = "Nullable"; + crp->Next->Name = "Jpath"; + + if (info || !qrp) + return qrp; + + qrp->Nblin = n; + + /*********************************************************************/ + /* Now get the results into blocks. */ + /*********************************************************************/ + for (i = 0, jcp = fjcp; jcp; i++, jcp = jcp->Next) { + if (jcp->Type == TYPE_UNKNOWN) // Void column + jcp->Type = TYPE_STRING; + + crp = qrp->Colresp; // Column Name + crp->Kdata->SetValue(jcp->Name, i); + crp = crp->Next; // Data Type + crp->Kdata->SetValue(jcp->Type, i); + crp = crp->Next; // Type Name + crp->Kdata->SetValue(GetTypeName(jcp->Type), i); + crp = crp->Next; // Precision + crp->Kdata->SetValue(jcp->Len, i); + crp = crp->Next; // Length + crp->Kdata->SetValue(jcp->Len, i); + crp = crp->Next; // Scale (precision) + crp->Kdata->SetValue(jcp->Scale, i); + crp = crp->Next; // Nullable + crp->Kdata->SetValue(jcp->Cbn ? 1 : 0, i); + crp = crp->Next; // Field format + + if (crp->Kdata) + crp->Kdata->SetValue(jcp->Fmt, i); + + } // endfor i + + /*********************************************************************/ + /* Return the result pointer. */ + /*********************************************************************/ + return qrp; + +err: + if (pretty != 2) + fclose(infile); + + return NULL; + } // end of JSONColumns + /* -------------------------- Class JSONDEF -------------------------- */ JSONDEF::JSONDEF(void) @@ -44,7 +483,9 @@ JSONDEF::JSONDEF(void) Jmode = MODE_OBJECT; Objname = NULL; Xcol = NULL; + Pretty = 2; Limit = 1; + Level = 0; ReadMode = 0; } // end of JSONDEF constructor @@ -57,6 +498,7 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Objname = GetStringCatInfo(g, "Object", NULL); Xcol = GetStringCatInfo(g, "Expand", NULL); Pretty = GetIntCatInfo("Pretty", 2); + Level = GetIntCatInfo("Level", 0); Limit = GetIntCatInfo("Limit", 10); return DOSDEF::DefineAM(g, "DOS", poff); } // end of DefineAM @@ -66,6 +508,9 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) { + if (Catfunc == FNC_COL) + return new(g)TDBJCL(this); + PTDBASE tdbp; PTXF txfp = NULL; @@ -117,14 +562,15 @@ TDBJSN::TDBJSN(PJDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp) Jmode = tdp->Jmode; Xcol = tdp->Xcol; Fpos = -1; - Spos = N = 0; +//Spos = 0; + N = 0; Limit = tdp->Limit; - Pretty = tdp->Pretty; - Strict = tdp->Strict; - NextSame = false; - Comma = false; + NextSame = 0; SameRow = 0; Xval = -1; + Pretty = tdp->Pretty; + Strict = tdp->Strict; + Comma = false; } // end of TDBJSN standard constructor TDBJSN::TDBJSN(TDBJSN *tdbp) : TDBDOS(NULL, tdbp) @@ -134,15 +580,15 @@ TDBJSN::TDBJSN(TDBJSN *tdbp) : TDBDOS(NULL, tdbp) Jmode = tdbp->Jmode; Xcol = tdbp->Xcol; Fpos = tdbp->Fpos; - Spos = tdbp->Spos; +//Spos = tdbp->Spos; N = tdbp->N; Limit = tdbp->Limit; - Pretty = tdbp->Pretty; - Strict = tdbp->Strict; NextSame = tdbp->NextSame; - Comma = tdbp->Comma; SameRow = tdbp->SameRow; Xval = tdbp->Xval; + Pretty = tdbp->Pretty; + Strict = tdbp->Strict; + Comma = tdbp->Comma; } // end of TDBJSN copy constructor // Used for update @@ -221,14 +667,9 @@ bool TDBJSN::OpenDB(PGLOBAL g) /*******************************************************************/ /* Table already open replace it at its beginning. */ /*******************************************************************/ - for (PJCOL cp = (PJCOL)Columns; cp; cp = (PJCOL)cp->GetNext()) { - cp->Nx = 0; - cp->Arp = NULL; - } // endfor cp - Fpos= -1; - Spos = 0; - NextSame = false; +// Spos = 0; + NextSame = 0; SameRow = 0; } else { /*******************************************************************/ @@ -292,7 +733,8 @@ int TDBJSN::ReadDB(PGLOBAL g) N++; if (NextSame) { - SameRow++; + SameRow = NextSame; + NextSame = 0; return RC_OK; } else if ((rc = TDBDOS::ReadDB(g)) == RC_OK) if (!IsRead() && ((rc = ReadBuffer(g)) != RC_OK)) { @@ -333,21 +775,20 @@ int TDBJSN::ReadDB(PGLOBAL g) } // end of PrepareWriting -/* ----------------------------- JSNCOL ------------------------------- */ +/* ---------------------------- JSONCOL ------------------------------ */ /***********************************************************************/ -/* JSNCOL public constructor. */ +/* JSONCOL public constructor. */ /***********************************************************************/ JSONCOL::JSONCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : DOSCOL(g, cdp, tdbp, cprec, i, "DOS") { Tjp = (TDBJSN *)(tdbp->GetOrig() ? tdbp->GetOrig() : tdbp); - Arp = NULL; Jpath = cdp->GetFmt(); MulVal = NULL; Nodes = NULL; - Nod = Nx =0; - Ival = -1; + Nod = 0; + Xnod = -1; Xpd = false; Parsed = false; } // end of JSONCOL constructor @@ -359,13 +800,11 @@ JSONCOL::JSONCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) JSONCOL::JSONCOL(JSONCOL *col1, PTDB tdbp) : DOSCOL(col1, tdbp) { Tjp = col1->Tjp; - Arp = col1->Arp; Jpath = col1->Jpath; MulVal = col1->MulVal; Nodes = col1->Nodes; Nod = col1->Nod; - Ival = col1->Ival; - Nx = col1->Nx; + Xnod = col1->Xnod; Xpd = col1->Xpd; Parsed = col1->Parsed; } // end of JSONCOL copy constructor @@ -387,17 +826,16 @@ bool JSONCOL::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) } // end of SetBuffer /***********************************************************************/ -/* Analyse array processing options. */ +/* Check whether this object is expanded. */ /***********************************************************************/ bool JSONCOL::CheckExpand(PGLOBAL g, int i, PSZ nm, bool b) { - if (Tjp->Xcol && nm && !strcmp(nm, Tjp->Xcol) && - (Tjp->Xval < 0 || Tjp->Xval == i)) { + if ((Tjp->Xcol && nm && !strcmp(nm, Tjp->Xcol) && + (Tjp->Xval < 0 || Tjp->Xval == i)) || Xpd) { Xpd = true; // Expandable object - Nodes[i].Op = OP_XX; - Tjp->Xval = i; + Nodes[i].Op = OP_EXP; } else if (b) { - strcpy(g->Message, "Cannot expand more than one array"); + strcpy(g->Message, "Cannot expand more than one branch"); return true; } // endif Xcol @@ -410,7 +848,7 @@ bool JSONCOL::CheckExpand(PGLOBAL g, int i, PSZ nm, bool b) bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) { int n = (int)strlen(p); - bool dg = true; + bool dg = true, b = false; PJNODE jnp = &Nodes[i]; if (*p) { @@ -424,7 +862,8 @@ bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) return true; } // endif p - } // endif *p + } else + b = true; // To check whether a numeric Rank was specified for (int k = 0; dg && p[k]; k++) @@ -434,13 +873,19 @@ bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) // Default specifications if (CheckExpand(g, i, nm, false)) return true; - else if (jnp->Op != OP_XX) - if (!Value->IsTypeNum()) { + else if (jnp->Op != OP_EXP) { + if (b) { + // Return 1st value + jnp->Rank = 1; + jnp->Op = OP_EQ; + } else if (!Value->IsTypeNum()) { jnp->CncVal = AllocateValue(g, (void*)", ", TYPE_STRING); jnp->Op = OP_CNC; } else jnp->Op = OP_ADD; + } // endif OP + } else if (dg) { if (atoi(p) > 0) { // Return nth value @@ -456,13 +901,13 @@ bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) case '*': jnp->Op = OP_MULT; break; case '>': jnp->Op = OP_MAX; break; case '<': jnp->Op = OP_MIN; break; - case '#': jnp->Op = OP_NUM; break; case '!': jnp->Op = OP_SEP; break; // Average + case '#': jnp->Op = OP_NUM; break; case 'x': case 'X': // Expand this array if (!Tjp->Xcol && nm) { Xpd = true; - jnp->Op = OP_XX; + jnp->Op = OP_EXP; Tjp->Xval = i; Tjp->Xcol = nm; } else if (CheckExpand(g, i, nm, true)) @@ -490,6 +935,38 @@ bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) return true; } // endif's + // For calculated arrays, a local Value must be used + switch (jnp->Op) { + case OP_NUM: + jnp->Valp = AllocateValue(g, TYPE_INT); + break; + case OP_ADD: + case OP_MULT: + case OP_SEP: + if (!IsTypeChar(Buf_Type)) + jnp->Valp = AllocateValue(g, Buf_Type, 0, GetPrecision()); + else + jnp->Valp = AllocateValue(g, TYPE_DOUBLE, 0, 2); + + break; + case OP_MIN: + case OP_MAX: + jnp->Valp = AllocateValue(g, Buf_Type, Long, GetPrecision()); + break; + case OP_CNC: + if (IsTypeChar(Buf_Type)) + jnp->Valp = AllocateValue(g, TYPE_STRING, Long, GetPrecision()); + else + jnp->Valp = AllocateValue(g, TYPE_STRING, 512); + + break; + default: + break; + } // endswitch Op + + if (jnp->Valp) + MulVal = AllocateValue(g, jnp->Valp); + return false; } // end of SetArrayOptions @@ -512,8 +989,7 @@ bool JSONCOL::ParseJpath(PGLOBAL g) else if (!Jpath) Jpath = Name; - pbuf = (char*)PlugSubAlloc(g, NULL, strlen(Jpath) + 1); - strcpy(pbuf, Jpath); + pbuf = PlugDup(g, Jpath); // The Jpath must be analyzed for (i = 0, p = pbuf; (p = strchr(p, ':')); i++, p++) @@ -533,6 +1009,9 @@ bool JSONCOL::ParseJpath(PGLOBAL g) if (SetArrayOptions(g, p, i, Nodes[i-1].Key)) return true; + } else if (*p == '*') { + // Return JSON + Nodes[i].Op = OP_XX; } else { Nodes[i].Key = p; Nodes[i].Op = OP_EXIST; @@ -545,60 +1024,262 @@ bool JSONCOL::ParseJpath(PGLOBAL g) return false; } // end of ParseJpath +/***********************************************************************/ +/* MakeJson: Serialize the json item and set value to it. */ +/***********************************************************************/ +PVAL JSONCOL::MakeJson(PGLOBAL g, PJSON jsp) + { + if (Value->IsTypeNum()) { + strcpy(g->Message, "Cannot make Json for a numeric column"); + Value->Reset(); + } else + Value->SetValue_psz(Serialize(g, jsp, NULL, 0)); + + return Value; + } // end of MakeJson + /***********************************************************************/ /* SetValue: Set a value from a JVALUE contains. */ /***********************************************************************/ void JSONCOL::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) { if (val) { - if (Nodes[n].Op == OP_NUM) - vp->SetValue(1); - else { - again: - switch (val->GetValType()) { - case TYPE_STRG: - case TYPE_INTG: - case TYPE_DBL: - vp->SetValue_pval(val->GetValue()); + switch (val->GetValType()) { + case TYPE_STRG: + case TYPE_INTG: + case TYPE_DBL: + vp->SetValue_pval(val->GetValue()); + break; + case TYPE_BOOL: + if (vp->IsTypeNum()) + vp->SetValue(val->GetInteger() ? 1 : 0); + else + vp->SetValue_psz((PSZ)(val->GetInteger() ? "true" : "false")); + + break; + case TYPE_JAR: + SetJsonValue(g, vp, val->GetArray()->GetValue(0), n); + break; + case TYPE_JOB: +// if (!vp->IsTypeNum() || !Strict) { + vp->SetValue_psz(val->GetObject()->GetText(g, NULL)); break; - case TYPE_BOOL: - if (vp->IsTypeNum()) - vp->SetValue(val->GetInteger() ? 1 : 0); - else - vp->SetValue_psz((PSZ)(val->GetInteger() ? "true" : "false")); +// } // endif Type - break; - case TYPE_JAR: - val = val->GetArray()->GetValue(0); - goto again; - case TYPE_JOB: - if (!vp->IsTypeNum()) { - vp->SetValue_psz(val->GetObject()->GetText(g)); - break; - } // endif Type - - default: - vp->Reset(); - } // endswitch Type - - } // endelse + default: + vp->Reset(); + } // endswitch Type } else vp->Reset(); } // end of SetJsonValue +/***********************************************************************/ +/* ReadColumn: */ +/***********************************************************************/ +void JSONCOL::ReadColumn(PGLOBAL g) + { + if (!Tjp->SameRow || Xnod >= Tjp->SameRow) + Value->SetValue_pval(GetColumnValue(g, Tjp->Row, 0)); + + } // end of ReadColumn + +/***********************************************************************/ +/* GetColumnValue: */ +/***********************************************************************/ +PVAL JSONCOL::GetColumnValue(PGLOBAL g, PJSON row, int i) + { + int n = Nod - 1; + bool expd = false; + PJAR arp; + PJVAL val = NULL; + + for (; i < Nod && row; i++) { + if (Nodes[i].Op == OP_NUM) { + Value->SetValue(row->GetType() == TYPE_JAR ? row->size() : 1); + return(Value); + } else if (Nodes[i].Op == OP_XX) { + return MakeJson(g, row); + } else switch (row->GetType()) { + case TYPE_JOB: + if (!Nodes[i].Key) { + // Expected Array was not there + if (i < Nod-1) + continue; + else + val = new(g) JVALUE(row); + + } else + val = ((PJOB)row)->GetValue(Nodes[i].Key); + + break; + case TYPE_JAR: + arp = (PJAR)row; + + if (!Nodes[i].Key) { + if (Nodes[i].Op != OP_NULL) { + if (Nodes[i].Rank) { + val = arp->GetValue(Nodes[i].Rank - 1); + } else if (Nodes[i].Op == OP_EXP) { + return ExpandArray(g, arp, i); + } else + return CalculateArray(g, arp, i); + + } else + val = NULL; + + } else if (i < Nod-1) { + strcpy(g->Message, "Unexpected array"); + val = NULL; // Not an expected array + } else + val = arp->GetValue(0); + + break; + case TYPE_JVAL: + val = (PJVAL)row; + break; + default: + sprintf(g->Message, "Invalid row JSON type %d", row->GetType()); + val = NULL; + } // endswitch Type + + if (i < Nod-1) + row = (val) ? val->GetJson() : NULL; + + } // endfor i + + SetJsonValue(g, Value, val, n); + return Value; + } // end of GetColumnValue + +/***********************************************************************/ +/* ExpandArray: */ +/***********************************************************************/ +PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n) + { + int ars; + PJVAL jvp; + JVALUE jval; + + ars = MY_MIN(Tjp->Limit, arp->size()); + + if (!(jvp = arp->GetValue(Nodes[n].Nx))) { + strcpy(g->Message, "Logical error expanding array"); + longjmp(g->jumper[g->jump_level], 666); + } // endif jvp + + if (n < Nod - 1 && jvp->GetJson()) { + jval.SetValue(GetColumnValue(g, jvp->GetJson(), n + 1)); + jvp = &jval; + } // endif n + + if (n >= Tjp->NextSame) { + if (++Nodes[n].Nx == ars) { + Nodes[n].Nx = 0; + Xnod = 0; + } else + Xnod = n; + + Tjp->NextSame = Xnod; + } // endif NextSame + + SetJsonValue(g, Value, jvp, n); + return Value; + } // end of ExpandArray + +/***********************************************************************/ +/* CalculateArray: */ +/***********************************************************************/ +PVAL JSONCOL::CalculateArray(PGLOBAL g, PJAR arp, int n) + { + int i, ars, nv = 0, nextsame = Tjp->NextSame; + bool err; + OPVAL op = Nodes[n].Op; + PVAL val[2], vp = Nodes[n].Valp; + PJVAL jvrp, jvp; + JVALUE jval; + + vp->Reset(); + ars = MY_MIN(Tjp->Limit, arp->size()); + + for (i = 0; i < ars; i++) { + jvrp = arp->GetValue(i); + + do { + if (n < Nod - 1 && jvrp->GetJson()) { + Tjp->NextSame = nextsame; + jval.SetValue(GetColumnValue(g, jvrp->GetJson(), n + 1)); + jvp = &jval; + } else + jvp = jvrp; + + if (!nv++) { + SetJsonValue(g, vp, jvp, n); + continue; + } else + SetJsonValue(g, MulVal, jvp, n); + + if (!MulVal->IsZero()) { + switch (op) { + case OP_CNC: + if (Nodes[n].CncVal) { + val[0] = Nodes[n].CncVal; + err = vp->Compute(g, val, 1, op); + } // endif CncVal + + val[0] = MulVal; + err = vp->Compute(g, val, 1, op); + break; +// case OP_NUM: + case OP_SEP: + val[0] = Nodes[n].Valp; + val[1] = MulVal; + err = vp->Compute(g, val, 2, OP_ADD); + break; + default: + val[0] = Nodes[n].Valp; + val[1] = MulVal; + err = vp->Compute(g, val, 2, op); + } // endswitch Op + + if (err) + vp->Reset(); + + } // endif Zero + + } while (Tjp->NextSame > nextsame); + + } // endfor i + + if (op == OP_SEP) { + // Calculate average + MulVal->SetValue(nv); + val[0] = vp; + val[1] = MulVal; + + if (vp->Compute(g, val, 2, OP_DIV)) + vp->Reset(); + + } // endif Op + + Tjp->NextSame = nextsame; + return vp; + } // end of CalculateArray + /***********************************************************************/ /* GetRow: Get the object containing this column. */ /***********************************************************************/ -PJSON JSONCOL::GetRow(PGLOBAL g, int mode) +PJSON JSONCOL::GetRow(PGLOBAL g) { PJVAL val; PJAR arp; PJSON nwr, row = Tjp->Row; for (int i = 0; i < Nod-1 && row; i++) { - switch (row->GetType()) { + if (Nodes[i+1].Op == OP_XX) + break; + else switch (row->GetType()) { case TYPE_JOB: if (!Nodes[i].Key) // Expected Array was not there @@ -609,21 +1290,13 @@ PJSON JSONCOL::GetRow(PGLOBAL g, int mode) case TYPE_JAR: if (!Nodes[i].Key) { if (Nodes[i].Op != OP_NULL) { - Ival = i; arp = (PJAR)row; - if (mode < 2) // First pass - Arp = arp; + if (Nodes[i].Rank) + val = arp->GetValue(Nodes[i].Rank - 1); + else + val = arp->GetValue(Nodes[i].Nx); - if (Nodes[i].Op != OP_XX) { - if (Nodes[i].Rank) - val = arp->GetValue(Nodes[i].Rank - 1); - else - val = arp->GetValue(arp == Arp ? Nx : 0); - - } else - val = arp->GetValue(Tjp->SameRow); - } else val = NULL; @@ -643,15 +1316,16 @@ PJSON JSONCOL::GetRow(PGLOBAL g, int mode) if (val) { row = val->GetJson(); - } else if (mode == 1) { // mode write + } else { // Construct missing objects for (i++; row && i < Nod; i++) { - if (!Nodes[i].Key) { + if (Nodes[i].Op == OP_XX) + break; + else if (!Nodes[i].Key) // Construct intermediate array nwr = new(g) JARRAY; - } else { + else nwr = new(g) JOBJECT; - } // endif Nodes if (row->GetType() == TYPE_JOB) { ((PJOB)row)->SetValue(g, new(g) JVALUE(nwr), Nodes[i-1].Key); @@ -667,139 +1341,13 @@ PJSON JSONCOL::GetRow(PGLOBAL g, int mode) } // endfor i break; - } else - row = NULL; + } // endelse } // endfor i return row; } // end of GetRow -/***********************************************************************/ -/* ReadColumn: */ -/***********************************************************************/ -void JSONCOL::ReadColumn(PGLOBAL g) - { - int mode = 0, n = Nod - 1; - PJSON row; - PJVAL val = NULL; - - evenmore: - row = GetRow(g, mode); - - more: - if (row) switch (row->GetType()) { - case TYPE_JOB: - if (Nodes[n].Key) - val = row->GetValue(Nodes[n].Key); - else - val = new(g) JVALUE(row); - - break; - case TYPE_JAR: - // Multiple column ? - if (Nodes[n].Op != OP_NULL) { - Arp = (PJAR)row; - val = Arp->GetValue(Nodes[n].Rank > 0 ? - Nodes[n].Rank - 1 : - Nodes[n].Op == OP_XX ? Tjp->SameRow : Nx); - Ival = n; - } else - val = NULL; - - break; - case TYPE_JVAL: - val = (PJVAL)row; - break; - default: - sprintf(g->Message, "Wrong return value type %d", row->GetType()); - Value->Reset(); - return; - } // endswitch Type - - if (!Nx /*|| (Xpd)*/) - SetJsonValue(g, Value, val, n); - - if (Arp) { - // Multiple column - int ars = (Nodes[Ival].Rank > 0) ? 1 : MY_MIN(Tjp->Limit, Arp->size()); - - if (Nodes[Ival].Op == OP_XX) { - if (ars > Tjp->SameRow + 1) - Tjp->NextSame = true; // More to come - else { - Tjp->NextSame = false; - Arp = NULL; - } // endelse - - } else { - if (Nx && val) { - SetJsonValue(g, MulVal, val, Ival); - - if (!MulVal->IsZero()) { - PVAL val[2]; - bool err; - - switch (Nodes[Ival].Op) { - case OP_CNC: - if (Nodes[Ival].CncVal) { - val[0] = Nodes[Ival].CncVal; - err = Value->Compute(g, val, 1, Nodes[Ival].Op); - } // endif CncVal - - val[0] = MulVal; - err = Value->Compute(g, val, 1, Nodes[Ival].Op); - break; - case OP_NUM: - case OP_SEP: - val[0] = Value; - val[1] = MulVal; - err = Value->Compute(g, val, 2, OP_ADD); - break; - default: - val[0] = Value; - val[1] = MulVal; - err = Value->Compute(g, val, 2, Nodes[Ival].Op); - } // endswitch Op - - if (err) - Value->Reset(); - - } // endif Zero - - } // endif Nx - - if (ars > ++Nx) { - if (Ival != n) { - mode = 2; - goto evenmore; - } else - goto more; - - } else { - if (Nodes[Ival].Op == OP_SEP) { - // Calculate average - PVAL val[2]; - - MulVal->SetValue(ars); - val[0] = Value; - val[1] = MulVal; - - if (Value->Compute(g, val, 2, OP_DIV)) - Value->Reset(); - - } // endif Op - - Arp = NULL; - Nx = 0; - } // endif ars - - } // endif Op - - } // endif Arp - - } // end of ReadColumn - /***********************************************************************/ /* WriteColumn: */ /***********************************************************************/ @@ -817,10 +1365,11 @@ void JSONCOL::WriteColumn(PGLOBAL g) if (Value->IsNull() && Tjp->Mode == MODE_INSERT) return; + char *s; PJOB objp = NULL; PJAR arp = NULL; PJVAL jvp = NULL; - PJSON row = GetRow(g, 1); + PJSON jsp, row = GetRow(g); JTYP type = row->GetType(); switch (row->GetType()) { @@ -832,6 +1381,32 @@ void JSONCOL::WriteColumn(PGLOBAL g) if (row) switch (Buf_Type) { case TYPE_STRING: + if (Nodes[Nod-1].Op == OP_XX) { + s = Value->GetCharValue(); + + if (!(jsp = ParseJson(g, s, (int)strlen(s), 0))) { + strcpy(g->Message, s); + longjmp(g->jumper[g->jump_level], 666); + } // endif jsp + + if (arp) { + if (Nod > 1 && Nodes[Nod-2].Rank) + arp->SetValue(g, new(g) JVALUE(jsp), Nodes[Nod-2].Rank-1); + else + arp->AddValue(g, new(g) JVALUE(jsp)); + + arp->InitArray(g); + } else if (objp) { + if (Nod > 1 && Nodes[Nod-2].Key) + objp->SetValue(g, new(g) JVALUE(jsp), Nodes[Nod-2].Key); + + } else if (jvp) + jvp->SetValue(jsp); + + break; + } // endif Op + + // Passthru case TYPE_DATE: case TYPE_INT: case TYPE_DOUBLE: @@ -959,6 +1534,38 @@ int TDBJSON::MakeNewDoc(PGLOBAL g) return RC_OK; } // end of MakeNewDoc +/***********************************************************************/ +/* Make the document tree from a file. */ +/***********************************************************************/ +int TDBJSON::MakeDocument(PGLOBAL g) + { + char filename[_MAX_PATH]; + DWORD drc; + + if (Done) + return RC_OK; + else + Done = true; + + // Now open the JSON file + PlugSetPath(filename, Txfp->To_File, GetPath()); + + /*********************************************************************/ + /* Get top of the parsed tree and the inside table document. */ + /*********************************************************************/ + Top = MakeJsonTree(g, filename, Objname, Pretty, Doc, drc); + + if (!Top) { + if (drc != ENOENT || Mode != MODE_INSERT) + return RC_FX; + + return MakeNewDoc(g); + } // endif !Top + + return RC_OK; + } // end of MakeDocument + +#if 0 /***********************************************************************/ /* Make the document tree from a file. */ /***********************************************************************/ @@ -1034,11 +1641,7 @@ int TDBJSON::MakeDocument(PGLOBAL g) if (!jsp && g->Message[0]) return RC_FX; - if (Objname) { - objpath = (char*)PlugSubAlloc(g, NULL, strlen(Objname) + 1); - strcpy(objpath, Objname); - } else - objpath = NULL; + objpath = PlugDup(g, Objname); /*********************************************************************/ /* Find the table in the tree structure. */ @@ -1112,6 +1715,7 @@ int TDBJSON::MakeDocument(PGLOBAL g) return RC_OK; } // end of MakeDocument +#endif // 0 /***********************************************************************/ /* JSON Cardinality: returns table size in number of rows. */ @@ -1166,6 +1770,51 @@ int TDBJSON::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) } // end of MakeIndex +/***********************************************************************/ +/* Return the position in the table. */ +/***********************************************************************/ +int TDBJSON::GetRecpos(void) + { +#if 0 + union { + uint Rpos; + BYTE Spos[4]; + }; + + Rpos = htonl(Fpos); + Spos[0] = (BYTE)NextSame; + return Rpos; +#endif // 0 + return Fpos; + } // end of GetRecpos + +/***********************************************************************/ +/* Set the position in the table. */ +/***********************************************************************/ +bool TDBJSON::SetRecpos(PGLOBAL g, int recpos) + { +#if 0 + union { + uint Rpos; + BYTE Spos[4]; + }; + + Rpos = recpos; + NextSame = Spos[0]; + Spos[0] = 0; + Fpos = (signed)ntohl(Rpos); + +//if (Fpos != (signed)ntohl(Rpos)) { +// Fpos = ntohl(Rpos); +// same = false; +//} else +// same = true; +#endif // 0 + + Fpos = recpos - 1; + return false; + } // end of SetRecpos + /***********************************************************************/ /* JSON Access Method opening routine. */ /***********************************************************************/ @@ -1175,13 +1824,7 @@ bool TDBJSON::OpenDB(PGLOBAL g) /*******************************************************************/ /* Table already open replace it at its beginning. */ /*******************************************************************/ - for (PJCOL cp = (PJCOL)Columns; cp; cp = (PJCOL)cp->GetNext()) { - cp->Nx = 0; - cp->Arp = NULL; - } // endfor cp - Fpos= -1; - Spos = 0; NextSame = false; SameRow = 0; return false; @@ -1217,7 +1860,8 @@ int TDBJSON::ReadDB(PGLOBAL g) N++; if (NextSame) { - SameRow++; + SameRow = NextSame; + NextSame = false; rc = RC_OK; } else if (++Fpos < (signed)Doc->size()) { Row = Doc->GetValue(Fpos); @@ -1257,9 +1901,10 @@ int TDBJSON::WriteDB(PGLOBAL g) return RC_FX; } else { // if (Jmode == MODE_VALUE) - if (Mode == MODE_INSERT) + if (Mode == MODE_INSERT) { Doc->AddValue(g, (PJVAL)Row); - else if (Doc->SetValue(g, (PJVAL)Row, Fpos)) + Row = new(g) JVALUE; + } else if (Doc->SetValue(g, (PJVAL)Row, Fpos)) return RC_FX; } // endif Jmode @@ -1319,4 +1964,27 @@ void TDBJSON::CloseDB(PGLOBAL g) } // end of CloseDB -/* -------------------------- End of json --------------------------- */ +/* ---------------------------TDBJCL class --------------------------- */ + +/***********************************************************************/ +/* TDBJCL class constructor. */ +/***********************************************************************/ +TDBJCL::TDBJCL(PJDEF tdp) : TDBCAT(tdp) + { + Fn = tdp->GetFn(); + Objn = tdp->Objname; + Pretty = tdp->Pretty; + Lrecl = tdp->Lrecl; + lvl = tdp->Level; + } // end of TDBJCL constructor + +/***********************************************************************/ +/* GetResult: Get the list the JSON file columns. */ +/***********************************************************************/ +PQRYRES TDBJCL::GetResult(PGLOBAL g) + { + return JSONColumns(g, ((PTABDEF)To_Def)->GetPath(), Fn, Objn, + Pretty, Lrecl, lvl, false); + } // end of GetResult + +/* --------------------------- End of json --------------------------- */ diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 68f79a1526a..20683a67971 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -1,5 +1,5 @@ /*************** tabjson H Declares Source Code File (.H) **************/ -/* Name: tabjson.h Version 1.0 */ +/* Name: tabjson.h Version 1.1 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ /* */ @@ -16,8 +16,6 @@ typedef class JSONDEF *PJDEF; typedef class TDBJSON *PJTDB; typedef class JSONCOL *PJCOL; -class TDBJSN; - /***********************************************************************/ /* The JSON tree node. Can be an Object or an Array. */ /***********************************************************************/ @@ -25,7 +23,9 @@ typedef struct _jnode { PSZ Key; // The key used for object OPVAL Op; // Operator used for this node PVAL CncVal; // To cont value used for OP_CNC + PVAL Valp; // The internal array VALUE int Rank; // The rank in array + int Nx; // Same row number } JNODE, *PJNODE; /***********************************************************************/ @@ -34,6 +34,7 @@ typedef struct _jnode { class JSONDEF : public DOSDEF { /* Table description */ friend class TDBJSON; friend class TDBJSN; + friend class TDBJCL; public: // Constructor JSONDEF(void); @@ -52,6 +53,7 @@ class JSONDEF : public DOSDEF { /* Table description */ char *Xcol; /* Name of expandable column */ int Limit; /* Limit of multiple values */ int Pretty; /* Depends on file structure */ + int Level; /* Used for catalog table */ bool Strict; /* Strict syntax checking */ }; // end of JSONDEF @@ -77,7 +79,7 @@ class TDBJSN : public TDBDOS { virtual PTDB CopyOne(PTABS t); virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); - virtual int RowNumber(PGLOBAL g, BOOL b = FALSE) + virtual int RowNumber(PGLOBAL g, bool b = FALSE) {return (b) ? N : Fpos + 1;} // Database routines @@ -94,15 +96,15 @@ class TDBJSN : public TDBDOS { JMODE Jmode; // MODE_OBJECT by default char *Xcol; // Name of expandable column int Fpos; // The current row index - int Spos; // DELETE start index +//int Spos; // DELETE start index int N; // The current Rownum int Limit; // Limit of multiple values int Pretty; // Depends on file structure - bool Strict; // Strict syntax checking - bool NextSame; // Same next row - bool Comma; // Row has final comma + int NextSame; // Same next row int SameRow; // Same row nb int Xval; // Index of expandable array + bool Strict; // Strict syntax checking + bool Comma; // Row has final comma }; // end of class TDBJSN /* -------------------------- JSONCOL class -------------------------- */ @@ -130,8 +132,12 @@ class JSONCOL : public DOSCOL { protected: bool CheckExpand(PGLOBAL g, int i, PSZ nm, bool b); bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); - PJSON GetRow(PGLOBAL g, int mode); + PVAL GetColumnValue(PGLOBAL g, PJSON row, int i); + PVAL ExpandArray(PGLOBAL g, PJAR arp, int n); + PVAL CalculateArray(PGLOBAL g, PJAR arp, int n); + PVAL MakeJson(PGLOBAL g, PJSON jsp); void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n); + PJSON GetRow(PGLOBAL g); // Default constructor not to be used JSONCOL(void) {} @@ -139,12 +145,10 @@ class JSONCOL : public DOSCOL { // Members TDBJSN *Tjp; // To the JSN table block PVAL MulVal; // To value used by multiple column - PJAR Arp; // The intermediate array char *Jpath; // The json path - JNODE *Nodes ; // The intermediate objects + JNODE *Nodes; // The intermediate objects int Nod; // The number of intermediate objects - int Ival; // Index of multiple values - int Nx; // The last read sub-row + int Xnod; // Index of multiple values bool Xpd; // True for expandable column bool Parsed; // True when parsed }; // end of class JSONCOL @@ -172,7 +176,9 @@ class TDBJSON : public TDBJSN { virtual int Cardinality(PGLOBAL g); virtual int GetMaxSize(PGLOBAL g); virtual void ResetSize(void); - virtual int GetRecpos(void) {return Fpos;} + virtual int GetProgCur(void) {return N;} + virtual int GetRecpos(void); + virtual bool SetRecpos(PGLOBAL g, int recpos); virtual bool OpenDB(PGLOBAL g); virtual int ReadDB(PGLOBAL g); virtual bool PrepareWriting(PGLOBAL g) {return false;} @@ -195,3 +201,25 @@ class TDBJSON : public TDBJSN { bool Done; // True when document parsing is done bool Changed; // After Update, Insert or Delete }; // end of class TDBJSON + +/***********************************************************************/ +/* This is the class declaration for the JSON catalog table. */ +/***********************************************************************/ +class TDBJCL : public TDBCAT { + public: + // Constructor + TDBJCL(PJDEF tdp); + + protected: + // Specific routines + virtual PQRYRES GetResult(PGLOBAL g); + + // Members +//char *Dp; + const char *Fn; + char *Objn; + int Pretty; + int Lrecl; + int lvl; + }; // end of class TDBJCL + diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 415a1523d30..e903bad91c0 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to PlugDB Software Development 2003 - 2012 */ +/* (C) Copyright to PlugDB Software Development 2003 - 2015 */ /* Author: Olivier BERTRAND */ /* */ /* WHAT THIS PROGRAM DOES: */ @@ -172,8 +172,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) while (n < PFNZ) { strcat(strcat(strcpy(filename, drive), direc), FileData.cFileName); - pfn[n] = (char*)PlugSubAlloc(g, NULL, strlen(filename) + 1); - strcpy(pfn[n++], filename); + pfn[n++] = PlugDup(g, filename); if (!FindNextFile(hSearch, &FileData)) { rc = GetLastError(); @@ -239,8 +238,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) continue; // Not a match strcat(strcpy(filename, direc), entry->d_name); - pfn[n] = (char*)PlugSubAlloc(g, NULL, strlen(filename) + 1); - strcpy(pfn[n++], filename); + pfn[n] = PlugDup(g, filename); if (trace) htrc("Adding pfn[%d] %s\n", n, filename); @@ -292,8 +290,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) *(++p) = '\0'; // Suballocate the file name - pfn[n] = (char*)PlugSubAlloc(g, NULL, strlen(filename) + 1); - strcpy(pfn[n++], filename); + pfn[n++] = PlugDup(g, filename); } // endfor n } // endif Mul diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 54627ba43fd..33a4dd67d38 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -1141,19 +1141,16 @@ int TDBMYSQL::WriteDB(PGLOBAL g) int rc; uint len = Query->GetLength(); char buf[64]; - bool b, oom = false; + bool oom = false; // Make the Insert command value list for (PCOL colp = Columns; colp; colp = colp->GetNext()) { if (!colp->GetValue()->IsNull()) { - if ((b = colp->GetResultType() == TYPE_STRING || - colp->GetResultType() == TYPE_DATE)) - oom |= Query->Append('\''); - - oom |= Query->Append(colp->GetValue()->GetCharString(buf)); - - if (b) - oom |= Query->Append('\''); + if (colp->GetResultType() == TYPE_STRING || + colp->GetResultType() == TYPE_DATE) + oom |= Query->Append_quoted(colp->GetValue()->GetCharString(buf)); + else + oom |= Query->Append(colp->GetValue()->GetCharString(buf)); } else oom |= Query->Append("NULL"); diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index 86f0bd20d47..82c4f888833 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -1,7 +1,7 @@ /************ TabOccur CPP Declares Source Code File (.CPP) ************/ /* Name: TABOCCUR.CPP Version 1.1 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2013 */ +/* (C) Copyright to the author Olivier BERTRAND 2013 - 2015 */ /* */ /* OCCUR: Table that provides a view of a source table where the */ /* contain of several columns of the source table is placed in only */ @@ -93,8 +93,7 @@ bool OcrColumns(PGLOBAL g, PQRYRES qrp, const char *col, } // endif col // Prepare the column list - colist = (char*)PlugSubAlloc(g, NULL, strlen(col) + 1); - strcpy(colist, col); + colist = PlugDup(g, col); m = PrepareColist(colist); if ((rk = (rank && *rank))) { @@ -191,8 +190,7 @@ bool OcrSrcCols(PGLOBAL g, PQRYRES qrp, const char *col, } // endif col // Prepare the column list - colist = (char*)PlugSubAlloc(g, NULL, strlen(col) + 1); - strcpy(colist, col); + colist = PlugDup(g, col); m = PrepareColist(colist); if ((rk = (rank && *rank))) @@ -355,7 +353,7 @@ bool TDBOCCUR::MakeColumnList(PGLOBAL g) for (colp = Columns; colp; colp = colp->GetNext()) if (colp->GetAmType() == TYPE_AM_PRX) - if (((PPRXCOL)colp)->Init(g)) + if (((PPRXCOL)colp)->Init(g, NULL)) return true; Col = (PCOL*)PlugSubAlloc(g, NULL, Mult * sizeof(PCOL)); diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index 2b771bcbead..3bf1238cebc 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -66,8 +66,8 @@ #include "plgdbsem.h" #include "mycat.h" #include "xtable.h" -#include "tabodbc.h" #include "odbccat.h" +#include "tabodbc.h" #include "tabmul.h" #include "reldef.h" #include "tabcol.h" @@ -93,9 +93,10 @@ bool ExactInfo(void); /***********************************************************************/ ODBCDEF::ODBCDEF(void) { - Connect= Tabname= Tabschema= Tabcat= Srcdef= Qchar= Qrystr= Sep= NULL; + Connect = Tabname = Tabschema = Username = Password = NULL; + Tabcat = Srcdef = Qchar = Qrystr = Sep = NULL; Catver = Options = Cto = Qto = Quoted = Maxerr = Maxres = 0; - Scrollable = Memory = Xsrc = false; + Scrollable = Memory = Xsrc = UseCnc = false; } // end of ODBCDEF constructor /***********************************************************************/ @@ -117,6 +118,8 @@ bool ODBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Tabschema = GetStringCatInfo(g, "Schema", Tabschema); Tabcat = GetStringCatInfo(g, "Qualifier", NULL); Tabcat = GetStringCatInfo(g, "Catalog", Tabcat); + Username = GetStringCatInfo(g, "User", NULL); + Password = GetStringCatInfo(g, "Password", NULL); if ((Srcdef = GetStringCatInfo(g, "Srcdef", NULL))) Read_Only = true; @@ -132,8 +135,16 @@ bool ODBCDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) //Options = ODBConn::noOdbcDialog | ODBConn::useCursorLib; Cto= GetIntCatInfo("ConnectTimeout", DEFAULT_LOGIN_TIMEOUT); Qto= GetIntCatInfo("QueryTimeout", DEFAULT_QUERY_TIMEOUT); - Scrollable = GetBoolCatInfo("Scrollable", false); - Memory = GetBoolCatInfo("Memory", false); + + if ((Scrollable = GetBoolCatInfo("Scrollable", false)) && !Elemt) + Elemt = 1; // Cannot merge SQLFetch and SQLExtendedFetch + + UseCnc = GetBoolCatInfo("UseDSN", false); + + // Memory was Boolean, it is now integer + if (!(Memory = GetIntCatInfo("Memory", 0))) + Memory = GetBoolCatInfo("Memory", false) ? 1 : 0; + Pseudo = 2; // FILID is Ok but not ROWID return false; } // end of DefineAM @@ -190,34 +201,40 @@ TDBODBC::TDBODBC(PODEF tdp) : TDBASE(tdp) Connect = tdp->Connect; TableName = tdp->Tabname; Schema = tdp->Tabschema; + Ops.User = tdp->Username; + Ops.Pwd = tdp->Password; Catalog = tdp->Tabcat; Srcdef = tdp->Srcdef; Qrystr = tdp->Qrystr; Sep = tdp->GetSep(); Options = tdp->Options; - Cto = tdp->Cto; - Qto = tdp->Qto; + Ops.Cto = tdp->Cto; + Ops.Qto = tdp->Qto; Quoted = MY_MAX(0, tdp->GetQuoted()); Rows = tdp->GetElemt(); Catver = tdp->Catver; - Memory = (tdp->Memory) ? 1 : 0; + Memory = tdp->Memory; Scrollable = tdp->Scrollable; + Ops.UseCnc = tdp->UseCnc; } else { Connect = NULL; TableName = NULL; Schema = NULL; + Ops.User = NULL; + Ops.Pwd = NULL; Catalog = NULL; Srcdef = NULL; Qrystr = NULL; Sep = 0; Options = 0; - Cto = DEFAULT_LOGIN_TIMEOUT; - Qto = DEFAULT_QUERY_TIMEOUT; + Ops.Cto = DEFAULT_LOGIN_TIMEOUT; + Ops.Qto = DEFAULT_QUERY_TIMEOUT; Quoted = 0; Rows = 0; Catver = 0; Memory = 0; Scrollable = false; + Ops.UseCnc = false; } // endif tdp Quote = NULL; @@ -228,11 +245,13 @@ TDBODBC::TDBODBC(PODEF tdp) : TDBASE(tdp) DBQ = NULL; Qrp = NULL; Fpos = 0; + Curpos = 0; AftRows = 0; CurNum = 0; Rbuf = 0; BufSize = 0; Nparm = 0; + Placed = false; } // end of TDBODBC standard constructor TDBODBC::TDBODBC(PTDBODBC tdbp) : TDBASE(tdbp) @@ -242,6 +261,7 @@ TDBODBC::TDBODBC(PTDBODBC tdbp) : TDBASE(tdbp) Connect = tdbp->Connect; TableName = tdbp->TableName; Schema = tdbp->Schema; + Ops = tdbp->Ops; Catalog = tdbp->Catalog; Srcdef = tdbp->Srcdef; Qrystr = tdbp->Qrystr; @@ -254,19 +274,17 @@ TDBODBC::TDBODBC(PTDBODBC tdbp) : TDBASE(tdbp) MulConn = tdbp->MulConn; DBQ = tdbp->DBQ; Options = tdbp->Options; - Cto = tdbp->Cto; - Qto = tdbp->Qto; Quoted = tdbp->Quoted; Rows = tdbp->Rows; - Fpos = tdbp->Fpos; - AftRows = tdbp->AftRows; -//Tpos = tdbp->Tpos; -//Spos = tdbp->Spos; - CurNum = tdbp->CurNum; - Rbuf = tdbp->Rbuf; + Fpos = 0; + Curpos = 0; + AftRows = 0; + CurNum = 0; + Rbuf = 0; BufSize = tdbp->BufSize; Nparm = tdbp->Nparm; Qrp = tdbp->Qrp; + Placed = false; } // end of TDBODBC copy constructor // Method @@ -370,7 +388,7 @@ int TDBODBC::Decode(char *txt, char *buf, size_t n) /***********************************************************************/ char *TDBODBC::MakeSQL(PGLOBAL g, bool cnt) { - char *colist, *tabname, *sql, buf[64]; + char *colist, *tabname, *sql, buf[NAM_LEN * 3]; LPCSTR schmp = NULL, catp = NULL; int len, ncol = 0; bool first = true; @@ -474,6 +492,9 @@ char *TDBODBC::MakeSQL(PGLOBAL g, bool cnt) if (To_CondFil) strcat(strcat(sql, " WHERE "), To_CondFil->Body); + + if (trace) + htrc("sql: '%s'\n", sql); return sql; } // end of MakeSQL @@ -483,7 +504,7 @@ char *TDBODBC::MakeSQL(PGLOBAL g, bool cnt) /***********************************************************************/ char *TDBODBC::MakeInsert(PGLOBAL g) { - char *stmt, *colist, *valist; + char *stmt, *colist, *valist, buf[NAM_LEN * 3]; // char *tk = "`"; int len = 0; bool b = FALSE; @@ -510,10 +531,13 @@ char *TDBODBC::MakeInsert(PGLOBAL g) } else b = true; + // Column name can be in UTF-8 encoding + Decode(colp->GetName(), buf, sizeof(buf)); + if (Quote) - strcat(strcat(strcat(colist, Quote), colp->GetName()), Quote); + strcat(strcat(strcat(colist, Quote), buf), Quote); else - strcat(colist, colp->GetName()); + strcat(colist, buf); strcat(valist, "?"); // Parameter marker } // endfor colp @@ -558,8 +582,7 @@ bool TDBODBC::BindParameters(PGLOBAL g) /***********************************************************************/ char *TDBODBC::MakeCommand(PGLOBAL g) { - char *p, name[68], *qc = Ocp->GetQuoteChar(); - char *stmt = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 64); + char *p, *stmt, name[68], *body = NULL, *qc = Ocp->GetQuoteChar(); char *qrystr = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 1); bool qtd = Quoted > 0; int i = 0, k = 0; @@ -570,6 +593,15 @@ char *TDBODBC::MakeCommand(PGLOBAL g) qrystr[i] = (Qrystr[i] == '`') ? *qc : tolower(Qrystr[i]); } while (Qrystr[i++]); + if (To_CondFil && (p = strstr(qrystr, " where "))) { + p[7] = 0; // Remove where clause + Qrystr[(p - qrystr) + 7] = 0; + body = To_CondFil->Body; + stmt = (char*)PlugSubAlloc(g, NULL, strlen(qrystr) + + strlen(body) + 64); + } else + stmt = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 64); + // Check whether the table name is equal to a keyword // If so, it must be quoted in the original query strlwr(strcat(strcat(strcpy(name, " "), Name), " ")); @@ -597,6 +629,9 @@ char *TDBODBC::MakeCommand(PGLOBAL g) stmt[i++] = (Qrystr[k] == '`') ? *qc : Qrystr[k]; } while (Qrystr[k++]); + if (body) + strcat(stmt, body); + } else { sprintf(g->Message, "Cannot use this %s command", (Mode == MODE_UPDATE) ? "UPDATE" : "DELETE"); @@ -698,10 +733,7 @@ int TDBODBC::Cardinality(PGLOBAL g) char qry[96], tbn[64]; ODBConn *ocp = new(g) ODBConn(g, this); - ocp->SetLoginTimeout((DWORD)Cto); - ocp->SetQueryTimeout((DWORD)Qto); - - if (ocp->Open(Connect, Options) < 1) + if (ocp->Open(Connect, &Ops, Options) < 1) return -1; // Table name can be encoded in UTF-8 @@ -762,9 +794,9 @@ int TDBODBC::GetProgMax(PGLOBAL g) /***********************************************************************/ bool TDBODBC::OpenDB(PGLOBAL g) { - bool rc = false; + bool rc = true; - if (g->Trace) + if (trace) htrc("ODBC OpenDB: tdbp=%p tdb=R%d use=%dmode=%d\n", this, Tdb_No, Use, Mode); @@ -788,10 +820,12 @@ bool TDBODBC::OpenDB(PGLOBAL g) return true; } // endif Rewind - } // endif Memory + } else + Rbuf = Qrp->Nblin; CurNum = 0; Fpos = 0; + Curpos = 1; return false; } // endif use @@ -802,14 +836,12 @@ bool TDBODBC::OpenDB(PGLOBAL g) /* and if so to allocate just a new result set. But this only for */ /* drivers allowing concurency in getting results ??? */ /*********************************************************************/ - if (!Ocp) { + if (!Ocp) Ocp = new(g) ODBConn(g, this); - Ocp->SetLoginTimeout((DWORD)Cto); - Ocp->SetQueryTimeout((DWORD)Qto); - } else if (Ocp->IsOpen()) + else if (Ocp->IsOpen()) Ocp->Close(); - if (Ocp->Open(Connect, Options) < 1) + if (Ocp->Open(Connect, &Ops, Options) < 1) return true; else if (Quoted) Quote = Ocp->GetQuoteChar(); @@ -820,6 +852,37 @@ bool TDBODBC::OpenDB(PGLOBAL g) /* Make the command and allocate whatever is used for getting results. */ /*********************************************************************/ if (Mode == MODE_READ || Mode == MODE_READX) { + if (Memory > 1 && !Srcdef) { + char *Sql; + int n; + + if ((Sql = MakeSQL(g, true))) { + // Allocate a Count(*) column + Cnp = new(g) ODBCCOL; + Cnp->InitValue(g); + + if ((n = Ocp->GetResultSize(Sql, Cnp)) < 0) { + strcpy(g->Message, "Cannot get result size"); + return true; + } // endif n + + Ocp->m_Rows = n; + + if ((Qrp = Ocp->AllocateResult(g))) + Memory = 2; // Must be filled + else { + strcpy(g->Message, "Memory allocation failed"); + return true; + } // endif n + + Ocp->m_Rows = 0; + } else { + strcpy(g->Message, "MakeSQL failed"); + return true; + } // endif Sql + + } // endif Memory + if ((Query = MakeSQL(g, false))) { for (PODBCCOL colp = (PODBCCOL)Columns; colp; colp = (PODBCCOL)colp->GetNext()) @@ -839,12 +902,12 @@ bool TDBODBC::OpenDB(PGLOBAL g) } // endif Query - } else if (Mode == MODE_UPDATE || Mode == MODE_DELETE) - Query = MakeCommand(g); - else + } else if (Mode == MODE_UPDATE || Mode == MODE_DELETE) { + rc = false; // wait for CheckCond before calling MakeCommand(g); + } else sprintf(g->Message, "Invalid mode %d", Mode); - if (!Query || rc) { + if (rc) { Ocp->Close(); return true; } // endif rc @@ -861,9 +924,40 @@ bool TDBODBC::OpenDB(PGLOBAL g) /***********************************************************************/ int TDBODBC::GetRecpos(void) { - return Fpos; // To be really implemented + return Fpos; } // end of GetRecpos +/***********************************************************************/ +/* SetRecpos: set the position of next read record. */ +/***********************************************************************/ +bool TDBODBC::SetRecpos(PGLOBAL g, int recpos) + { + if (Ocp->m_Full) { + Fpos = 0; + CurNum = recpos - 1; + } else if (Memory == 3) { + Fpos = recpos; + CurNum = -1; + } else if (Scrollable) { + // Is new position in the current row set? + if (recpos >= Curpos && recpos < Curpos + Rbuf) { + CurNum = recpos - Curpos; + Fpos = 0; + } else { + Fpos = recpos; + CurNum = 0; + } // endif recpos + + } else { + strcpy(g->Message, "This action requires a scrollable cursor"); + return true; + } // endif's + + // Indicate the table position was externally set + Placed = true; + return false; + } // end of SetRecpos + /***********************************************************************/ /* VRDNDOS: Data Base read routine for odbc access method. */ /***********************************************************************/ @@ -876,6 +970,9 @@ int TDBODBC::ReadDB(PGLOBAL g) GetTdb_No(), Mode, To_Key_Col, To_Link, To_Kindex); if (Mode == MODE_UPDATE || Mode == MODE_DELETE) { + if (!Query && !(Query = MakeCommand(g))) + return RC_FX; + // Send the UPDATE/DELETE command to the remote table if (!Ocp->ExecSQLcommand(Query)) { sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); @@ -900,22 +997,32 @@ int TDBODBC::ReadDB(PGLOBAL g) /* Now start the reading process. */ /* Here is the place to fetch the line(s). */ /*********************************************************************/ - if (Memory != 3) { - if (++CurNum >= Rbuf) { - Rbuf = Ocp->Fetch(); - CurNum = 0; - } // endif CurNum + if (Placed) { + if (Fpos && CurNum >= 0) + Rbuf = Ocp->Fetch((Curpos = Fpos)); rc = (Rbuf > 0) ? RC_OK : (Rbuf == 0) ? RC_EF : RC_FX; - } else // Getting result from memory - rc = (Fpos < Qrp->Nblin) ? RC_OK : RC_EF; + Placed = false; + } else { + if (Memory != 3) { + if (++CurNum >= Rbuf) { + Rbuf = Ocp->Fetch(); + Curpos = Fpos + 1; + CurNum = 0; + } // endif CurNum - if (rc == RC_OK) { - if (Memory == 2) - Qrp->Nblin++; + rc = (Rbuf > 0) ? RC_OK : (Rbuf == 0) ? RC_EF : RC_FX; + } else // Getting result from memory + rc = (Fpos < Qrp->Nblin) ? RC_OK : RC_EF; - Fpos++; // Used for memory - } // endif rc + if (rc == RC_OK) { + if (Memory == 2) + Qrp->Nblin++; + + Fpos++; // Used for memory and pos + } // endif rc + + } // endif Placed if (trace > 1) htrc(" Read: Rbuf=%d rc=%d\n", Rbuf, rc); @@ -945,6 +1052,9 @@ int TDBODBC::WriteDB(PGLOBAL g) int TDBODBC::DeleteDB(PGLOBAL g, int irc) { if (irc == RC_FX) { + if (!Query && !(Query = MakeCommand(g))) + return RC_FX; + // Send the DELETE (all) command to the remote table if (!Ocp->ExecSQLcommand(Query)) { sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); @@ -1158,12 +1268,12 @@ void ODBCCOL::ReadColumn(PGLOBAL g) } // endif Buf_Type - if (g->Trace) { + if (trace) { char buf[64]; htrc("ODBC Column %s: rows=%d buf=%p type=%d value=%s\n", Name, tdbp->Rows, Bufp, Buf_Type, Value->GetCharString(buf)); - } // endif Trace + } // endif trace put: if (tdbp->Memory != 2) @@ -1397,7 +1507,7 @@ bool TDBXDBC::OpenDB(PGLOBAL g) { bool rc = false; - if (g->Trace) + if (trace) htrc("ODBC OpenDB: tdbp=%p tdb=R%d use=%dmode=%d\n", this, Tdb_No, Use, Mode); @@ -1415,12 +1525,10 @@ bool TDBXDBC::OpenDB(PGLOBAL g) /*********************************************************************/ if (!Ocp) { Ocp = new(g) ODBConn(g, this); - Ocp->SetLoginTimeout((DWORD)Cto); - Ocp->SetQueryTimeout((DWORD)Qto); } else if (Ocp->IsOpen()) Ocp->Close(); - if (Ocp->Open(Connect, Options) < 1) + if (Ocp->Open(Connect, &Ops, Options) < 1) return true; Use = USE_OPEN; // Do it now in case we are recursively called @@ -1554,8 +1662,11 @@ TDBOTB::TDBOTB(PODEF tdp) : TDBDRV(tdp) Dsn = tdp->GetConnect(); Schema = tdp->GetTabschema(); Tab = tdp->GetTabname(); - Cto = tdp->Cto; - Qto = tdp->Qto; + Ops.User = tdp->Username; + Ops.Pwd = tdp->Password; + Ops.Cto = tdp->Cto; + Ops.Qto = tdp->Qto; + Ops.UseCnc = tdp->UseCnc; } // end of TDBOTB constructor /***********************************************************************/ @@ -1563,7 +1674,7 @@ TDBOTB::TDBOTB(PODEF tdp) : TDBDRV(tdp) /***********************************************************************/ PQRYRES TDBOTB::GetResult(PGLOBAL g) { - return ODBCTables(g, Dsn, Schema, Tab, Maxres, Cto, Qto, false); + return ODBCTables(g, Dsn, Schema, Tab, Maxres, false, &Ops); } // end of GetResult /* ---------------------------TDBOCL class --------------------------- */ @@ -1573,7 +1684,7 @@ PQRYRES TDBOTB::GetResult(PGLOBAL g) /***********************************************************************/ PQRYRES TDBOCL::GetResult(PGLOBAL g) { - return ODBCColumns(g, Dsn, Schema, Tab, NULL, Maxres, Cto, Qto, false); + return ODBCColumns(g, Dsn, Schema, Tab, NULL, Maxres, false, &Ops); } // end of GetResult /* ------------------------ End of Tabodbc --------------------------- */ diff --git a/storage/connect/tabodbc.h b/storage/connect/tabodbc.h index d8644c8b6de..b8c9d85aae5 100644 --- a/storage/connect/tabodbc.h +++ b/storage/connect/tabodbc.h @@ -50,6 +50,8 @@ class DllExport ODBCDEF : public TABDEF { /* Logical table description */ PSZ Connect; /* ODBC connection string */ PSZ Tabname; /* External table name */ PSZ Tabschema; /* External table schema */ + PSZ Username; /* User connect name */ + PSZ Password; /* Password connect info */ PSZ Tabcat; /* External table catalog */ PSZ Srcdef; /* The source table SQL definition */ PSZ Qchar; /* Identifier quoting character */ @@ -62,9 +64,10 @@ class DllExport ODBCDEF : public TABDEF { /* Logical table description */ int Quoted; /* Identifier quoting level */ int Maxerr; /* Maxerr for an Exec table */ int Maxres; /* Maxres for a catalog table */ + int Memory; /* Put result set in memory */ bool Scrollable; /* Use scrollable cursor */ - bool Memory; /* Put result set in memory */ bool Xsrc; /* Execution type */ + bool UseCnc; /* Use SQLConnect (!SQLDriverConnect) */ }; // end of ODBCDEF #if !defined(NODBC) @@ -90,6 +93,7 @@ class TDBODBC : public TDBASE { // Methods virtual PTDB CopyOne(PTABS t); virtual int GetRecpos(void); + virtual bool SetRecpos(PGLOBAL g, int recpos); virtual PSZ GetFile(PGLOBAL g); virtual void SetFile(PGLOBAL g, PSZ fn); virtual void ResetSize(void); @@ -124,9 +128,12 @@ class TDBODBC : public TDBASE { // Members ODBConn *Ocp; // Points to an ODBC connection class ODBCCOL *Cnp; // Points to count(*) column + ODBCPARM Ops; // Additional parameters char *Connect; // Points to connection string char *TableName; // Points to ODBC table name char *Schema; // Points to ODBC table Schema + char *User; // User connect info + char *Pwd; // Password connect info char *Catalog; // Points to ODBC table Catalog char *Srcdef; // The source table SQL definition char *Query; // Points to SQL statement @@ -142,6 +149,7 @@ class TDBODBC : public TDBASE { int Qto; // Query timeout int Quoted; // The identifier quoting level int Fpos; // Position of last read record + int Curpos; // Cursor position of last fetch int AftRows; // The number of affected rows int Rows; // Rowset size int Catver; // Catalog ODBC version @@ -151,6 +159,8 @@ class TDBODBC : public TDBASE { int Nparm; // The number of statement parameters int Memory; // 0: No 1: Alloc 2: Put 3: Get bool Scrollable; // Use scrollable cursor + bool Placed; // True for position reading + bool UseCnc; // Use SQLConnect (!SQLDriverConnect) PQRYRES Qrp; // Points to storage result }; // end of class TDBODBC @@ -316,8 +326,7 @@ class TDBOTB : public TDBDRV { char *Dsn; // Points to connection string char *Schema; // Points to schema name or NULL char *Tab; // Points to ODBC table name or pattern - int Cto; // Connect timeout - int Qto; // Query timeout + ODBCPARM Ops; // Additional parameters }; // end of class TDBOTB /***********************************************************************/ diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index 94e9d7187f0..4b333b2eb56 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2013 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -150,11 +150,18 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) query = Tabsrc; // Open a MySQL connection for this table - if (Myc.Open(g, Host, Database, User, Pwd, Port)) - return NULL; - else + if (!Myc.Open(g, Host, Database, User, Pwd, Port)) { b = true; + // Returned values must be in their original character set + if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX) + goto err; + else + Myc.FreeResult(); + + } else + return NULL; + // Send the source command to MySQL if (Myc.ExecSQL(g, query, &w) == RC_FX) goto err; @@ -241,6 +248,10 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) } else { // The query was limited, we must get pivot column values + // Returned values must be in their original character set +// if (Myc.ExecSQL(g, "SET character_set_results=NULL", &w) == RC_FX) +// goto err; + query = (char*)PlugSubAlloc(g, NULL, 0); sprintf(query, "SELECT DISTINCT `%s` FROM `%s`", Picol, Tabname); PlugSubAlloc(g, NULL, strlen(query) + 1); @@ -284,8 +295,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) valp->SetValue_pvblk(Rblkp, i); colname = valp->GetCharString(buf); - crp->Name = (char*)PlugSubAlloc(g, NULL, strlen(colname) + 1); - strcpy(crp->Name, colname); + crp->Name = PlugDup(g, colname); crp->Flag = 1; // Add this column @@ -558,7 +568,7 @@ bool TDBPIVOT::MakePivotColumns(PGLOBAL g) // Check and initialize the subtable columns for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (cp->GetAmType() == TYPE_AM_SRC) { - if (((PSRCCOL)cp)->Init(g)) + if (((PSRCCOL)cp)->Init(g, NULL)) return TRUE; } else if (cp->GetAmType() == TYPE_AM_FNC) @@ -874,9 +884,9 @@ SRCCOL::SRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int n) /***********************************************************************/ /* Initialize the column as pointing to the source column. */ /***********************************************************************/ -bool SRCCOL::Init(PGLOBAL g) +bool SRCCOL::Init(PGLOBAL g, PTDBASE tp) { - if (PRXCOL::Init(g)) + if (PRXCOL::Init(g, tp)) return true; AddStatus(BUF_READ); // All is done here diff --git a/storage/connect/tabpivot.h b/storage/connect/tabpivot.h index 25d139e895f..c397af05234 100644 --- a/storage/connect/tabpivot.h +++ b/storage/connect/tabpivot.h @@ -180,9 +180,10 @@ class SRCCOL : public PRXCOL { virtual int GetAmType(void) {return TYPE_AM_SRC;} // Methods + using PRXCOL::Init; virtual void Reset(void) {} void SetColumn(void); - bool Init(PGLOBAL g); + virtual bool Init(PGLOBAL g, PTDBASE tp); bool CompareLast(void); protected: diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 22ec3849b6f..a33d6caa83a 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -266,7 +266,7 @@ bool TDBTBL::InitTableList(PGLOBAL g) // Real initialization will be done later. for (colp = Columns; colp; colp = colp->GetNext()) if (!colp->IsSpecial()) - if (((PPRXCOL)colp)->Init(g) && !Accept) + if (((PPRXCOL)colp)->Init(g, NULL) && !Accept) return TRUE; if (Tablist) @@ -352,7 +352,9 @@ bool TDBTBL::TestFil(PGLOBAL g, PCFIL filp, PTABLE tabp) /***********************************************************************/ int TDBTBL::Cardinality(PGLOBAL g) { - if (Cardinal < 0) { + if (!g) + return 0; // Cannot make the table list + else if (Cardinal < 0) { int tsz; if (!Tablist && InitTableList(g)) @@ -468,7 +470,7 @@ bool TDBTBL::OpenDB(PGLOBAL g) for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (cp->GetAmType() == TYPE_AM_TABID) cp->COLBLK::Reset(); - else if (((PPRXCOL)cp)->Init(g) && !Accept) + else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return TRUE; if (trace) @@ -523,7 +525,7 @@ int TDBTBL::ReadDB(PGLOBAL g) if (cp->GetAmType() == TYPE_AM_TABID || cp->GetAmType() == TYPE_AM_SRVID) cp->COLBLK::Reset(); - else if (((PPRXCOL)cp)->Init(g) && !Accept) + else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return RC_FX; if (trace) @@ -716,7 +718,7 @@ bool TDBTBM::OpenDB(PGLOBAL g) for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (cp->GetAmType() == TYPE_AM_TABID) cp->COLBLK::Reset(); - else if (((PPRXCOL)cp)->Init(g) && !Accept) + else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return TRUE; if (trace) @@ -807,7 +809,7 @@ int TDBTBM::ReadNextRemote(PGLOBAL g) for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (cp->GetAmType() == TYPE_AM_TABID) cp->COLBLK::Reset(); - else if (((PPRXCOL)cp)->Init(g) && !Accept) + else if (((PPRXCOL)cp)->Init(g, NULL) && !Accept) return RC_FX; if (trace) diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index d469594916f..c114497aa69 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -1,7 +1,7 @@ /************* Tabutil cpp Declares Source Code File (.CPP) ************/ -/* Name: TABUTIL.CPP Version 1.0 */ +/* Name: TABUTIL.CPP Version 1.1 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2013 */ +/* (C) Copyright to the author Olivier BERTRAND 2013 - 2015 */ /* */ /* Utility function used by the PROXY, XCOL, OCCUR, and TBL tables. */ /***********************************************************************/ @@ -9,7 +9,8 @@ /***********************************************************************/ /* Include relevant section of system dependant header files. */ /***********************************************************************/ -#include "my_global.h" +#define MYSQL_SERVER 1 +#include #include "sql_class.h" #include "table.h" #include "field.h" @@ -54,7 +55,8 @@ #include "tabutil.h" #include "ha_connect.h" -extern "C" int zconv; +//extern "C" int zconv; +int GetConvSize(void); /************************************************************************/ /* Used by MYSQL tables to get MySQL parameters from the calling proxy */ @@ -107,6 +109,9 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db, } // endif is_view } else { + if (thd->is_error()) + thd->clear_error(); // Avoid stopping info commands + sprintf(g->Message, "Error %d opening share\n", s->error); free_table_share(s); return NULL; @@ -132,6 +137,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, char *fld, *colname, *chset, *fmt, v; int i, n, ncol = sizeof(buftyp) / sizeof(int); int prec, len, type, scale; + int zconv = GetConvSize(); bool mysql; TABLE_SHARE *s = NULL; Field* *field; @@ -668,6 +674,22 @@ PRXCOL::PRXCOL(PRXCOL *col1, PTDB tdbp) : COLBLK(col1, tdbp) Colnum = col1->Colnum; } // end of PRXCOL copy constructor +/***********************************************************************/ +/* Convert an UTF-8 name to latin characters. */ +/***********************************************************************/ +char *PRXCOL::Decode(PGLOBAL g, const char *cnm) + { + char *buf= (char*)PlugSubAlloc(g, NULL, strlen(cnm) + 1); + uint dummy_errors; + uint32 len= copy_and_convert(buf, strlen(cnm) + 1, + &my_charset_latin1, + cnm, strlen(cnm), + &my_charset_utf8_general_ci, + &dummy_errors); + buf[len]= '\0'; + return buf; + } // end of Decode + /***********************************************************************/ /* PRXCOL initialization routine. */ /* Look for the matching column in the object table. */ @@ -683,6 +705,9 @@ bool PRXCOL::Init(PGLOBAL g, PTDBASE tp) if (Colp) { MODE mode = To_Tdb->GetMode(); + // Needed for MYSQL subtables + ((XCOLBLK*)Colp)->Name = Decode(g, Colp->GetName()); + // May not have been done elsewhere Colp->InitValue(g); To_Val = Colp->GetValue(); diff --git a/storage/connect/tabutil.h b/storage/connect/tabutil.h index 606e532d526..c5935d72184 100644 --- a/storage/connect/tabutil.h +++ b/storage/connect/tabutil.h @@ -108,15 +108,18 @@ class DllExport PRXCOL : public COLBLK { virtual int GetAmType(void) {return TYPE_AM_PRX;} // Methods + using COLBLK::Init; virtual void Reset(void); virtual bool IsSpecial(void) {return Pseudo;} virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) {return false;} virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); - virtual bool Init(PGLOBAL g, PTDBASE tp = NULL); + virtual bool Init(PGLOBAL g, PTDBASE tp); protected: + char *Decode(PGLOBAL g, const char *cnm); + // Default constructor not to be used PRXCOL(void) {} @@ -144,4 +147,8 @@ class TDBTBC : public TDBCAT { PSZ Tab; // Table name }; // end of class TDBMCL +class XCOLBLK : public COLBLK { + friend class PRXCOL; +}; // end of class XCOLBLK + #endif // TABUTIL diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index 57f0e1e03b9..0de01927c5a 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -183,7 +183,7 @@ bool TDBXCL::OpenDB(PGLOBAL g) /*********************************************************************/ for (PCOL cp = Columns; cp; cp = cp->GetNext()) if (!cp->IsSpecial()) - if (((PPRXCOL)cp)->Init(g)) + if (((PPRXCOL)cp)->Init(g, NULL)) return TRUE; /*********************************************************************/ diff --git a/storage/connect/tabxcl.h b/storage/connect/tabxcl.h index 7e11600c090..ed15a67b629 100644 --- a/storage/connect/tabxcl.h +++ b/storage/connect/tabxcl.h @@ -88,6 +88,7 @@ class XCLCOL : public PRXCOL { XCLCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); // Methods + using PRXCOL::Init; virtual void Reset(void) {} // Evaluated only by TDBXCL virtual void ReadColumn(PGLOBAL g); virtual bool Init(PGLOBAL g, PTDBASE tp = NULL); diff --git a/storage/connect/valblk.cpp b/storage/connect/valblk.cpp index df7011583cd..e731ad156d9 100644 --- a/storage/connect/valblk.cpp +++ b/storage/connect/valblk.cpp @@ -1,7 +1,7 @@ /************ Valblk C++ Functions Source Code File (.CPP) *************/ /* Name: VALBLK.CPP Version 2.1 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* This file contains the VALBLK and derived classes functions. */ /* Second family is VALBLK, representing simple suballocated arrays */ @@ -1155,10 +1155,9 @@ void STRBLK::SetValue(PVAL valp, int n) void STRBLK::SetValue(PSZ p, int n) { if (p) { - if (!Sorted || !n || !Strp[n-1] || strcmp(p, Strp[n-1])) { - Strp[n] = (PSZ)PlugSubAlloc(Global, NULL, strlen(p) + 1); - strcpy(Strp[n], p); - } else + if (!Sorted || !n || !Strp[n-1] || strcmp(p, Strp[n-1])) + Strp[n] = (PSZ)PlugDup(Global, p); + else Strp[n] = Strp[n-1]; } else diff --git a/storage/connect/valblk.h b/storage/connect/valblk.h index 654db0b57b7..5a98257f98f 100644 --- a/storage/connect/valblk.h +++ b/storage/connect/valblk.h @@ -163,6 +163,7 @@ class TYPBLK : public VALBLK { virtual void Reset(int n) {Typp[n] = 0;} // Methods + using VALBLK::SetValue; virtual void SetValue(PSZ sp, int n); virtual void SetValue(char *sp, uint len, int n); virtual void SetValue(short sval, int n) @@ -233,6 +234,7 @@ class CHRBLK : public VALBLK { virtual bool IsCi(void) {return Ci;} // Methods + using VALBLK::SetValue; virtual void SetValue(PSZ sp, int n); virtual void SetValue(char *sp, uint len, int n); virtual void SetValue(PVAL valp, int n); @@ -286,6 +288,7 @@ class STRBLK : public VALBLK { virtual void Reset(int n) {Strp[n] = NULL;} // Methods + using VALBLK::SetValue; virtual void SetValue(PSZ sp, int n); virtual void SetValue(char *sp, uint len, int n); virtual void SetValue(PVAL valp, int n); @@ -322,6 +325,7 @@ class DATBLK : public TYPBLK { virtual char *GetCharString(char *p, int n); // Methods + using TYPBLK::SetValue; virtual void SetValue(PSZ sp, int n); protected: @@ -345,6 +349,8 @@ class PTRBLK : public STRBLK { // Implementation // Methods + using STRBLK::SetValue; + using STRBLK::CompVal; virtual void SetValue(PSZ p, int n) {Strp[n] = p;} virtual int CompVal(int i1, int i2); diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 1cc40473433..e012e12d00b 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -436,6 +436,9 @@ PVAL AllocateValue(PGLOBAL g, PVAL valp, int newtype, int uns) bool un = (uns < 0) ? false : (uns > 0) ? true : valp->IsUnsigned(); PVAL vp; + if (!valp) + return NULL; + if (newtype == TYPE_VOID) // Means allocate a value of the same type newtype = valp->GetType(); @@ -443,8 +446,8 @@ PVAL AllocateValue(PGLOBAL g, PVAL valp, int newtype, int uns) case TYPE_STRING: p = (PSZ)PlugSubAlloc(g, NULL, 1 + valp->GetValLen()); - if ((sp = valp->GetCharString(p)) != p) - strcpy (p, sp); + if ((sp = valp->GetCharString(p)) != p && sp) + strcpy(p, sp); vp = new(g) TYPVAL(g, p, valp->GetValLen(), valp->GetValPrec()); break; @@ -1216,12 +1219,12 @@ TYPVAL::TYPVAL(PSZ s) : VALUE(TYPE_STRING) TYPVAL::TYPVAL(PGLOBAL g, PSZ s, int n, int c) : VALUE(TYPE_STRING) { - Len = (g) ? n : strlen(s); + Len = (g) ? n : (s) ? strlen(s) : 0; if (!s) { if (g) { if ((Strp = (char *)PlgDBSubAlloc(g, NULL, Len + 1))) - Strp[Len] = '\0'; + memset(Strp, 0, Len + 1); else Len = 0; diff --git a/storage/connect/xindex.h b/storage/connect/xindex.h index c702baeec83..6e40e9b160e 100644 --- a/storage/connect/xindex.h +++ b/storage/connect/xindex.h @@ -391,6 +391,7 @@ class DllExport XHUGE : public XLOAD { XHUGE(void) : XLOAD() {} // Methods + using XLOAD::Close; virtual bool Open(PGLOBAL g, char *filename, int id, MODE mode); virtual bool Seek(PGLOBAL g, int low, int high, int origin); virtual bool Read(PGLOBAL g, void *buf, int n, int size); diff --git a/storage/connect/xobject.cpp b/storage/connect/xobject.cpp index 4ddd4f5b30f..817acb561fe 100644 --- a/storage/connect/xobject.cpp +++ b/storage/connect/xobject.cpp @@ -346,6 +346,31 @@ bool STRING::Append(char c) return false; } // end of Append +/***********************************************************************/ +/* Append a quoted PSZ to a STRING. */ +/***********************************************************************/ +bool STRING::Append_quoted(PSZ s) +{ + bool b = Append('\''); + + if (s) for (char *p = s; !b && *p; p++) + switch (*p) { + case '\'': + case '\\': + case '\t': + case '\n': + case '\r': + case '\b': + case '\f': b |= Append('\\'); + // passthru + default: + b |= Append(*p); + break; + } // endswitch *p + + return (b |= Append('\'')); +} // end of Append_quoted + /***********************************************************************/ /* Resize to given length but only when last suballocated. */ /* New size should be greater than string length. */ diff --git a/storage/connect/xobject.h b/storage/connect/xobject.h index bb7b0150ed8..3660ee86918 100644 --- a/storage/connect/xobject.h +++ b/storage/connect/xobject.h @@ -138,6 +138,7 @@ class DllExport STRING : public BLOCK { bool Append(STRING &str); bool Append(char c); bool Resize(uint n); + bool Append_quoted(PSZ s); inline void Trim(void) {(void)Resize(Length + 1);} inline void Chop(void) {if (Length) Strp[--Length] = 0;} inline void RepLast(char c) {if (Length) Strp[Length-1] = c;} diff --git a/storage/connect/xtable.h b/storage/connect/xtable.h index 501a5e87cfa..d1ea2b0d85f 100644 --- a/storage/connect/xtable.h +++ b/storage/connect/xtable.h @@ -1,7 +1,7 @@ /**************** Table H Declares Source Code File (.H) ***************/ /* Name: TABLE.H Version 2.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ /* */ /* This file contains the TBX, OPJOIN and TDB class definitions. */ /***********************************************************************/ @@ -24,9 +24,7 @@ typedef class CMD *PCMD; class CMD : public BLOCK { public: // Constructor - CMD(PGLOBAL g, char *cmd) { - Cmd = (char*)PlugSubAlloc(g, NULL, strlen(cmd) + 1); - strcpy(Cmd, cmd); Next = NULL; } + CMD(PGLOBAL g, char *cmd) {Cmd = PlugDup(g, cmd); Next = NULL;} // Members PCMD Next; From 464947e6323dc1e473532b641335e903a36c1d6c Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 22 Mar 2015 11:31:10 +0100 Subject: [PATCH 04/39] - Fix a bug that caused a crash when doing delete on a json table with wrong syntax file - Suppress MYSQL_SUPPORT preprocessor variable --- .gitignore | 1 + storage/connect/CMakeLists.txt | 39 +++++++++++++--------------------- storage/connect/ha_connect.cc | 10 ++++----- storage/connect/mycat.cc | 6 ------ storage/connect/tabjson.cpp | 16 +++++--------- storage/connect/taboccur.cpp | 2 -- storage/connect/tabtbl.cpp | 2 -- storage/connect/tabutil.cpp | 20 +++-------------- storage/connect/tabxcl.cpp | 2 -- 9 files changed, 28 insertions(+), 70 deletions(-) diff --git a/.gitignore b/.gitignore index e3df21eb17b..ee5216caf7b 100644 --- a/.gitignore +++ b/.gitignore @@ -293,6 +293,7 @@ storage/mroonga/vendor/groonga/src/suggest/groonga-suggest-create-dataset [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ +[Rr]eleaseWithDebInfo/ x64/ x86/ build/ diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index 2b1e458e242..02fe5ee8dad 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -21,18 +21,18 @@ ha_connect.cc connect.cc user_connect.cc mycat.cc fmdlex.c osutil.c plugutil.c rcmsg.c rcmsg.h array.cpp blkfil.cpp colblk.cpp csort.cpp filamap.cpp filamdbf.cpp filamfix.cpp filamtxt.cpp filamvct.cpp filamzip.cpp -filter.cpp json.cpp jsonudf.cpp maputil.cpp myutil.cpp plgdbutl.cpp reldef.cpp -tabcol.cpp tabdos.cpp tabfix.cpp tabfmt.cpp tabjson.cpp table.cpp tabmul.cpp -taboccur.cpp tabpivot.cpp tabsys.cpp tabtbl.cpp tabutil.cpp tabvct.cpp -tabvir.cpp tabxcl.cpp valblk.cpp value.cpp xindex.cpp xobject.cpp +filter.cpp json.cpp jsonudf.cpp maputil.cpp myconn.cpp myutil.cpp plgdbutl.cpp +reldef.cpp tabcol.cpp tabdos.cpp tabfix.cpp tabfmt.cpp tabjson.cpp table.cpp +tabmul.cpp tabmysql.cpp taboccur.cpp tabpivot.cpp tabsys.cpp tabtbl.cpp tabutil.cpp +tabvct.cpp tabvir.cpp tabxcl.cpp valblk.cpp value.cpp xindex.cpp xobject.cpp array.h blkfil.h block.h catalog.h checklvl.h colblk.h connect.h csort.h engmsg.h filamap.h filamdbf.h filamfix.h filamtxt.h filamvct.h filamzip.h filter.h global.h ha_connect.h inihandl.h json.h maputil.h msgid.h mycat.h -myutil.h os.h osutil.h plgcnx.h plgdbsem.h preparse.h reldef.h resource.h -tabcol.h tabdos.h tabfix.h tabfmt.h tabjson.h tabmul.h taboccur.h tabpivot.h -tabsys.h tabtbl.h tabutil.h tabvct.h tabvir.h tabxcl.h user_connect.h -valblk.h value.h xindex.h xobject.h xtable.h) +myconn.h myutil.h os.h osutil.h plgcnx.h plgdbsem.h preparse.h reldef.h +resource.h tabcol.h tabdos.h tabfix.h tabfmt.h tabjson.h tabmul.h tabmysql.h +taboccur.h tabpivot.h tabsys.h tabtbl.h tabutil.h tabvct.h tabvir.h tabxcl.h +user_connect.h valblk.h value.h xindex.h xobject.h xtable.h) # # Definitions that are shared for all OSes @@ -166,24 +166,15 @@ IF(LIBXML2_FOUND OR MSXML_FOUND) ENDIF() # -# MySQL +# MySQL is now included unconditionnally # -OPTION(CONNECT_WITH_MYSQL - "Compile CONNECT storage engine with remote MySQL connection support" - ON) - -IF(CONNECT_WITH_MYSQL) - SET(CONNECT_SOURCES ${CONNECT_SOURCES} - myconn.cpp myconn.h tabmysql.cpp tabmysql.h) - add_definitions(-DMYSQL_SUPPORT) - IF(NOT UNIX) - # - # TODO: remove this - # change to use "#include "../../include/mysql.h" in the sources. - INCLUDE_DIRECTORIES("../../include/mysql") - ENDIF(NOT UNIX) -ENDIF(CONNECT_WITH_MYSQL) +IF(NOT UNIX) + # + # TODO: remove this + # change to use "#include "../../include/mysql.h" in the sources. + INCLUDE_DIRECTORIES("../../include/mysql") +ENDIF(NOT UNIX) # diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 8d7ab3a7652..1cf18a94d22 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -130,10 +130,8 @@ #if defined(ODBC_SUPPORT) #include "odbccat.h" #endif // ODBC_SUPPORT -#if defined(MYSQL_SUPPORT) #include "xtable.h" #include "tabmysql.h" -#endif // MYSQL_SUPPORT #include "filamdbf.h" #include "tabxcl.h" #include "tabfmt.h" @@ -5147,7 +5145,6 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ok= true; break; -#if defined(MYSQL_SUPPORT) case TAB_MYSQL: ok= true; @@ -5187,14 +5184,15 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, ok= false; break; -#endif // MYSQL_SUPPORT #if defined(WIN32) case TAB_WMI: ok= true; break; #endif // WIN32 +#if defined(PIVOT_SUPPORT) case TAB_PIVOT: supfnc= FNC_NO; +#endif // PIVOT_SUPPORT case TAB_PRX: case TAB_TBL: case TAB_XCL: @@ -5293,12 +5291,10 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, break; #endif // ODBC_SUPPORT -#if defined(MYSQL_SUPPORT) case TAB_MYSQL: qrp= MyColumns(g, thd, host, db, user, pwd, tab, NULL, port, fnc == FNC_COL); break; -#endif // MYSQL_SUPPORT case TAB_CSV: qrp= CSVColumns(g, dpath, fn, spc, qch, hdr, mxe, fnc == FNC_COL); break; @@ -5324,9 +5320,11 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, } // endif OcrColumns break; +#if defined(PIVOT_SUPPORT) case TAB_PIVOT: qrp= PivotColumns(g, tab, src, pic, fcl, skc, host, db, user, pwd, port); break; +#endif // PIVOT_SUPPORT case TAB_VIR: qrp= VirColumns(g, tab, (char*)db, fnc == FNC_COL); break; diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index 0ae0537ba6f..a4986da4089 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -78,9 +78,7 @@ #include "tabxml.h" #endif // XML_SUPPORT #include "tabmul.h" -#if defined(MYSQL_SUPPORT) #include "tabmysql.h" -#endif // MYSQL_SUPPORT #if defined(ODBC_SUPPORT) #define NODBC #include "tabodbc.h" @@ -122,10 +120,8 @@ TABTYPE GetTypeID(const char *type) #ifdef ODBC_SUPPORT : (!stricmp(type, "ODBC")) ? TAB_ODBC #endif -#ifdef MYSQL_SUPPORT : (!stricmp(type, "MYSQL")) ? TAB_MYSQL : (!stricmp(type, "MYPRX")) ? TAB_MYSQL -#endif : (!stricmp(type, "DIR")) ? TAB_DIR #ifdef WIN32 : (!stricmp(type, "MAC")) ? TAB_MAC @@ -537,9 +533,7 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) case TAB_XCL: tdp= new(g) XCLDEF; break; case TAB_PRX: tdp= new(g) PRXDEF; break; case TAB_OCCUR: tdp= new(g) OCCURDEF; break; -#if defined(MYSQL_SUPPORT) case TAB_MYSQL: tdp= new(g) MYSQLDEF; break; -#endif // MYSQL_SUPPORT #if defined(PIVOT_SUPPORT) case TAB_PIVOT: tdp= new(g) PIVOTDEF; break; #endif // PIVOT_SUPPORT diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 9ffa1d6cc78..af33adc69b0 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -1540,12 +1540,11 @@ int TDBJSON::MakeNewDoc(PGLOBAL g) int TDBJSON::MakeDocument(PGLOBAL g) { char filename[_MAX_PATH]; + int rc = RC_OK; DWORD drc; if (Done) return RC_OK; - else - Done = true; // Now open the JSON file PlugSetPath(filename, Txfp->To_File, GetPath()); @@ -1553,16 +1552,11 @@ int TDBJSON::MakeDocument(PGLOBAL g) /*********************************************************************/ /* Get top of the parsed tree and the inside table document. */ /*********************************************************************/ - Top = MakeJsonTree(g, filename, Objname, Pretty, Doc, drc); + if (!(Top = MakeJsonTree(g, filename, Objname, Pretty, Doc, drc))) + rc = (drc == ENOENT && Mode == MODE_INSERT) ? MakeNewDoc(g) : RC_FX; - if (!Top) { - if (drc != ENOENT || Mode != MODE_INSERT) - return RC_FX; - - return MakeNewDoc(g); - } // endif !Top - - return RC_OK; + Done = (rc == RC_OK); + return rc; } // end of MakeDocument #if 0 diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index 82c4f888833..5ef0ee52653 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -45,9 +45,7 @@ #include "tabcol.h" #include "taboccur.h" #include "xtable.h" -#if defined(MYSQL_SUPPORT) #include "tabmysql.h" -#endif // MYSQL_SUPPORT #include "ha_connect.h" #include "mycat.h" diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index a33d6caa83a..64a9a176cca 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -70,9 +70,7 @@ #include "tabcol.h" #include "tabdos.h" // TDBDOS and DOSCOL class dcls #include "tabtbl.h" -#if defined(MYSQL_SUPPORT) #include "tabmysql.h" -#endif // MYSQL_SUPPORT #include "ha_connect.h" #include "mycat.h" // For GetHandler diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index c114497aa69..6c4760e763f 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -48,9 +48,7 @@ #include "resource.h" #include "reldef.h" #include "xtable.h" -#if defined(MYSQL_SUPPORT) #include "tabmysql.h" -#endif // MYSQL_SUPPORT #include "tabcol.h" #include "tabutil.h" #include "ha_connect.h" @@ -94,19 +92,13 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db, if (!open_table_def(thd, s, GTS_TABLE | GTS_VIEW)) { if (!s->is_view) { - if (stricmp(plugin_name(s->db_plugin)->str, "connect")) { -#if defined(MYSQL_SUPPORT) + if (stricmp(plugin_name(s->db_plugin)->str, "connect")) mysql = true; -#else // !MYSQL_SUPPORT - sprintf(g->Message, "%s.%s is not a CONNECT table", db, name); - return NULL; -#endif // MYSQL_SUPPORT - } else + else mysql = false; - } else { + } else mysql = true; - } // endif is_view } else { if (thd->is_error()) @@ -428,7 +420,6 @@ PTDBASE TDBPRX::GetSubTable(PGLOBAL g, PTABLE tabp, bool b) } // endif srcdef if (mysql) { -#if defined(MYSQL_SUPPORT) // Access sub-table via MySQL API if (!(tdbp= cat->GetTable(g, tabp, Mode, "MYPRX"))) { char buf[MAX_STR]; @@ -445,11 +436,6 @@ PTDBASE TDBPRX::GetSubTable(PGLOBAL g, PTABLE tabp, bool b) if (Mode == MODE_UPDATE || Mode == MODE_DELETE) tdbp->SetName(Name); // For Make_Command -#else // !MYSQL_SUPPORT - sprintf(g->Message, "%s.%s is not a CONNECT table", - db, tblp->Name); - goto err; -#endif // MYSQL_SUPPORT } else { // Sub-table is a CONNECT table tabp->Next = To_Table; // For loop checking diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index 0de01927c5a..454210b6e6a 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -51,9 +51,7 @@ #include "tabcol.h" #include "tabxcl.h" #include "xtable.h" -#if defined(MYSQL_SUPPORT) #include "tabmysql.h" -#endif // MYSQL_SUPPORT #include "ha_connect.h" #include "mycat.h" From 48a77e61880aeb6f18162f2ab0a5b03386cf5010 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 5 Apr 2015 14:03:35 +0200 Subject: [PATCH 05/39] Make this repository aligned with 10.0 one --- .gitattributes | 20 + storage/connect/ha_connect.cc | 45 +- storage/connect/ha_connect.h | 2 +- .../connect/mysql-test/connect/r/json.result | 92 +++- .../mysql-test/connect/r/json_udf.result | 167 ++++++ .../mysql-test/connect/r/odbc_oracle.result | 10 +- .../std_data/{biblio.jsn => biblio.json} | 90 +-- .../std_data/{expense.jsn => expense.json} | 316 +++++------ .../std_data/{mulexp3.jsn => mulexp3.json} | 104 ++-- .../std_data/{mulexp4.jsn => mulexp4.json} | 104 ++-- .../std_data/{mulexp5.jsn => mulexp5.json} | 104 ++-- .../connect/mysql-test/connect/t/json.test | 511 +++++++++--------- storage/connect/tabmul.cpp | 2 +- storage/connect/tabmysql.cpp | 3 +- storage/connect/value.cpp | 80 +-- storage/connect/xobject.cpp | 28 + storage/connect/xobject.h | 1 + 17 files changed, 992 insertions(+), 687 deletions(-) create mode 100644 storage/connect/mysql-test/connect/r/json_udf.result rename storage/connect/mysql-test/connect/std_data/{biblio.jsn => biblio.json} (95%) rename storage/connect/mysql-test/connect/std_data/{expense.jsn => expense.json} (94%) rename storage/connect/mysql-test/connect/std_data/{mulexp3.jsn => mulexp3.json} (93%) rename storage/connect/mysql-test/connect/std_data/{mulexp4.jsn => mulexp4.json} (93%) rename storage/connect/mysql-test/connect/std_data/{mulexp5.jsn => mulexp5.json} (93%) diff --git a/.gitattributes b/.gitattributes index cdfedef671f..bb22871094a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,23 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.c text +*.cc text +*.cpp text +*.h text +*.test text + +# Declare files that will always have LF line endings on checkout. +*.result text eol=lf +storage/connect/mysql-test/connect/std_data/*.txt text eol=lf +storage/connect/mysql-test/connect/std_data/*.dat text eol=lf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary + *.c diff=cpp *.h diff=cpp *.cc diff=cpp diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 1cf18a94d22..d310ff55980 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -2173,12 +2173,12 @@ int ha_connect::CheckRecord(PGLOBAL g, const uchar *oldbuf, uchar *newbuf) /***********************************************************************/ /* Return the where clause for remote indexed read. */ /***********************************************************************/ -bool ha_connect::MakeKeyWhere(PGLOBAL g, char *qry, OPVAL op, char *q, +bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL op, char q, const void *key, int klen) { const uchar *ptr; uint rem, len, stlen; //, prtlen; - bool nq, b= false; + bool nq, oom, b= false; Field *fp; KEY *kfp; KEY_PART_INFO *kpart; @@ -2190,7 +2190,7 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, char *qry, OPVAL op, char *q, return true; } // endif key - strcat(qry, " WHERE ("); + oom= qry->Append(" WHERE ("); kfp= &table->key_info[active_index]; rem= kfp->user_defined_key_parts, len= klen, @@ -2203,24 +2203,26 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, char *qry, OPVAL op, char *q, nq= fp->str_needs_quotes(); if (b) - strcat(qry, " AND "); + oom|= qry->Append(" AND "); else b= true; - strcat(strncat(strcat(qry, q), fp->field_name, strlen(fp->field_name)), q); + oom|= qry->Append(q); + oom|= qry->Append((PSZ)fp->field_name); + oom|= qry->Append(q); switch (op) { case OP_EQ: case OP_GT: case OP_GE: - strcat(qry, GetValStr(op, false)); + oom|= qry->Append((PSZ)GetValStr(op, false)); break; default: - strcat(qry, " ??? "); + oom|= qry->Append(" ??? "); } // endwitch op if (nq) - strcat(qry, "'"); + oom|= qry->Append('\''); if (kpart->key_part_flag & HA_VAR_LENGTH_PART) { String varchar; @@ -2228,17 +2230,17 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, char *qry, OPVAL op, char *q, varchar.set_quick((char*) ptr+HA_KEY_BLOB_LENGTH, var_length, &my_charset_bin); - strncat(qry, varchar.ptr(), varchar.length()); + oom|= qry->Append(varchar.ptr(), varchar.length()); } else { char strbuff[MAX_FIELD_WIDTH]; String str(strbuff, sizeof(strbuff), kpart->field->charset()), *res; res= fp->val_str(&str, ptr); - strncat(qry, res->ptr(), res->length()); + oom|= qry->Append(res->ptr(), res->length()); } // endif flag if (nq) - strcat(qry, "'"); + oom|= qry->Append('\''); if (stlen >= len) break; @@ -2251,8 +2253,10 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, char *qry, OPVAL op, char *q, ptr+= stlen - MY_TEST(kpart->null_bit); } // endfor kpart - strcat(qry, ")"); - return false; + if ((oom|= qry->Append(")"))) + strcpy(g->Message, "Out of memory"); + + return oom; } // end of MakeKeyWhere @@ -2714,7 +2718,12 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) case MYSQL_TYPE_DATETIME: if (tty == TYPE_AM_ODBC) { strcat(body, "{ts '"); - strcat(strncat(body, res->ptr(), res->length()), "'}"); + strncat(body, res->ptr(), res->length()); + + if (res->length() < 19) + strcat(body, "1970-01-01 00:00:00" + res->length()); + + strcat(body, "'}"); break; } // endif ODBC @@ -2739,6 +2748,10 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) case MYSQL_TYPE_DATETIME: strcat(body, "{ts '"); strncat(body, res->ptr(), res->length()); + + if (res->length() < 19) + strcat(body, "1970-01-01 00:00:00" + res->length()); + strcat(body, "'}"); break; case MYSQL_TYPE_DATE: @@ -4134,6 +4147,10 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, break; // } // endif partitioned + case SQLCOM_END: + // Met in procedures: IF(EXISTS(SELECT... + newmode= MODE_READ; + break; default: htrc("Unsupported sql_command=%d\n", thd_sql_command(thd)); strcpy(g->Message, "CONNECT Unsupported command"); diff --git a/storage/connect/ha_connect.h b/storage/connect/ha_connect.h index abe8fa079fe..c3b911710b8 100644 --- a/storage/connect/ha_connect.h +++ b/storage/connect/ha_connect.h @@ -235,7 +235,7 @@ public: int CheckRecord(PGLOBAL g, const uchar *oldbuf, uchar *newbuf); int ReadIndexed(uchar *buf, OPVAL op, const uchar* key= NULL, uint key_len= 0); - bool MakeKeyWhere(PGLOBAL g, char *qry, OPVAL op, char *q, + bool MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL op, char q, const void *key, int klen); inline char *Strz(LEX_STRING &ls); diff --git a/storage/connect/mysql-test/connect/r/json.result b/storage/connect/mysql-test/connect/r/json.result index 094bb669d18..ebcad699759 100644 --- a/storage/connect/mysql-test/connect/r/json.result +++ b/storage/connect/mysql-test/connect/r/json.result @@ -12,7 +12,7 @@ TRANSLATION CHAR(32), TRANSLATOR CHAR(80), PUBLISHER CHAR(32), DATEPUB int(4) -) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; +) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; ISBN LANG SUBJECT AUTHOR TITLE TRANSLATION TRANSLATOR PUBLISHER DATEPUB 9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 @@ -34,7 +34,7 @@ Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', Year int(4) FIELD_FORMAT='DATEPUB' ) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; ISBN Language Subject Authors Title Translation Translator Publisher Location Year 9782212090819 fr applications 2 Construire une application XML Eyrolles Paris 1999 @@ -57,7 +57,7 @@ Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', Year int(4) FIELD_FORMAT='DATEPUB' ) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year 9782212090819 fr applications Jean-Christophe and François Bernadac and Knab Construire une application XML Eyrolles Paris 1999 @@ -80,7 +80,7 @@ Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', Year int(4) FIELD_FORMAT='DATEPUB' ) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year 9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 @@ -89,23 +89,23 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; SELECT * FROM t1 WHERE ISBN = '9782212090819'; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 -9782212090819 fr applications Philippe Knab Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications Philippe Bernadac Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications François Knab Construire une application XML Eyrolles Paris 1999 # # To add an author a new table must be created # CREATE TABLE t2 ( FIRSTNAME CHAR(32), LASTNAME CHAR(32)) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn' OPTION_LIST='Object=[2]:AUTHOR'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[2]:AUTHOR'; SELECT * FROM t2; FIRSTNAME LASTNAME William J. Pardi INSERT INTO t2 VALUES('Charles','Dickens'); SELECT * FROM t1; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 -9782212090819 fr applications Philippe Knab Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications Philippe Bernadac Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications François Knab Construire une application XML Eyrolles Paris 1999 9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 9782840825685 fr applications Charles Dickens XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 DROP TABLE t1; @@ -117,7 +117,7 @@ CREATE TABLE t1 ( line char(255) ) -ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.jsn'; +ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.json'; SELECT * FROM t1; line [ @@ -127,11 +127,11 @@ line "SUBJECT": "applications", "AUTHOR": [ { - "FIRSTNAME": "Jean-Christophe", + "FIRSTNAME": "Philippe", "LASTNAME": "Bernadac" }, { - "FIRSTNAME": "Philippe", + "FIRSTNAME": "François", "LASTNAME": "Knab" } ], @@ -178,7 +178,7 @@ WHO CHAR(12), WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t1; WHO WEEK WHAT AMOUNT Joe 3 Beer+Food+Food+Car 69.00 @@ -192,16 +192,60 @@ Janet 4 Car 17.00 Janet 5 Beer+Car+Beer+Food 57.00 DROP TABLE t1; # -# Cannot be fully expanded +# Now it can be fully expanded # CREATE TABLE t1 ( WHO CHAR(12), WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t1; -ERROR HY000: Got error 174 'Cannot expand more than one array' from CONNECT +WHO WEEK WHAT AMOUNT +Joe 3 Beer 18.00 +Joe 3 Food 12.00 +Joe 3 Food 19.00 +Joe 3 Car 20.00 +Joe 4 Beer 19.00 +Joe 4 Beer 16.00 +Joe 4 Food 17.00 +Joe 4 Food 17.00 +Joe 4 Beer 14.00 +Joe 5 Beer 14.00 +Joe 5 Food 12.00 +Beth 3 Beer 16.00 +Beth 4 Food 17.00 +Beth 4 Beer 15.00 +Beth 5 Food 12.00 +Beth 5 Beer 20.00 +Janet 3 Car 19.00 +Janet 3 Food 18.00 +Janet 3 Beer 18.00 +Janet 4 Car 17.00 +Janet 5 Beer 14.00 +Janet 5 Car 12.00 +Janet 5 Beer 19.00 +Janet 5 Food 12.00 +DROP TABLE t1; +# +# A table showing many calculated results +# +CREATE TABLE t1 ( +WHO CHAR(12) NOT NULL, +WEEKS CHAR(12) NOT NULL FIELD_FORMAT='WEEK:[", "]:NUMBER', +SUMS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[+]:AMOUNT', +SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[+]:AMOUNT', +AVGS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[!]:AMOUNT', +SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[!]:AMOUNT', +AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[+]:AMOUNT', +AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[!]:AMOUNT', +AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; +SELECT * FROM t1; +WHO WEEKS SUMS SUM AVGS SUMAVG AVGSUM AVGAVG AVERAGE +Joe 3, 4, 5 69.00+83.00+26.00 178.00 17.25+16.60+13.00 46.85 59.33 15.62 16.18 +Beth 3, 4, 5 16.00+32.00+32.00 80.00 16.00+16.00+16.00 48.00 26.67 16.00 16.00 +Janet 3, 4, 5 55.00+17.00+57.00 129.00 18.33+17.00+14.25 49.58 43.00 16.53 16.12 DROP TABLE t1; # # Expand expense in 3 one week tables @@ -211,7 +255,7 @@ WHO CHAR(12), WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t2; WHO WEEK WHAT AMOUNT Joe 3 Beer 18.00 @@ -227,7 +271,7 @@ WHO CHAR(12), WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t3; WHO WEEK WHAT AMOUNT Joe 4 Beer 19.00 @@ -243,7 +287,7 @@ WHO CHAR(12), WEEK INT(2) FIELD_FORMAT='WEEK:[3]:NUMBER', WHAT CHAR(32) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t4; WHO WEEK WHAT AMOUNT Joe 5 Beer 14.00 @@ -298,7 +342,7 @@ WHO CHAR(12), WEEK INT(2), WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.json'; SELECT * FROM t2; WHO WEEK WHAT AMOUNT Joe 3 Beer 18.00 @@ -314,7 +358,7 @@ WHO CHAR(12), WEEK INT(2), WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.json'; SELECT * FROM t3; WHO WEEK WHAT AMOUNT Joe 4 Beer 19.00 @@ -330,7 +374,7 @@ WHO CHAR(12), WEEK INT(2), WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.json'; SELECT * FROM t4; WHO WEEK WHAT AMOUNT Joe 5 Beer 14.00 @@ -349,7 +393,7 @@ WHO CHAR(12), WEEK INT(2), WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.jsn' MULTIPLE=1; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.json' MULTIPLE=1; SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT; WHO WEEK WHAT AMOUNT Beth 3 Beer 16.00 @@ -385,7 +429,7 @@ WHO CHAR(12), WEEK INT(2), WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.jsn'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.json'; ALTER TABLE t1 PARTITION BY LIST COLUMNS(WEEK) ( PARTITION `3` VALUES IN(3), diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result new file mode 100644 index 00000000000..1455bac9017 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -0,0 +1,167 @@ +# +# Test UDF's with constant arguments +# +SELECT Json_Array(); +Json_Array() +[] +SELECT Json_Object(56,3.1416,'foo',NULL); +Json_Object(56,3.1416,'foo',NULL) +{"56":56,"3.1416":3.141600,"foo":"foo","NULL":null} +SELECT Json_Object(56 qty,3.1416 price,'foo' truc, NULL garanty); +Json_Object(56 qty,3.1416 price,'foo' truc, NULL garanty) +{"qty":56,"price":3.141600,"truc":"foo","garanty":null} +SELECT Json_Array(56,3.1416,'My name is "Foo"',NULL); +Json_Array(56,3.1416,'My name is "Foo"',NULL) +[56,3.141600,"My name is \"Foo\"",null] +SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL)) Array; +ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Value_Add must have at least 2 arguments +SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; +Array +[56,3.141600,"foo",null,"One more"] +SELECT Json_Array_Add(Json_Value('one value'),'One more'); +Json_Array_Add(Json_Value('one value'),'One more') +["one value","One more"] +SELECT Json_Array_Add('one value','One more'); +ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Value_Add first argument must be a json item +SELECT Json_Array_Add('one value' json_,'One more'); +Json_Array_Add('one value' json_,'One more') +[null,"One more"] +Warnings: +Warning 1105 Bad 'o' character near one value +SELECT Json_Value(56,3.1416,'foo',NULL); +ERROR HY000: Can't initialize function 'Json_Value'; Json_Value cannot accept more than 1 argument +SELECT Json_Value(3.1416); +Json_Value(3.1416) +3.141600 +SELECT Json_Value('foo'); +Json_Value('foo') +"foo" +SELECT Json_Value(NULL); +Json_Value(NULL) +null +SELECT Json_Value(); +Json_Value() +null +SELECT Json_Object(); +Json_Object() +{} +SELECT Json_Object(Json_Array(56,3.1416,'foo'),NULL); +Json_Object(Json_Array(56,3.1416,'foo'),NULL) +{"Array(56,3.1416,'foo')":[56,3.141600,"foo"],"NULL":null} +SELECT Json_Array(Json_Array(56,3.1416,'foo'),NULL); +Json_Array(Json_Array(56,3.1416,'foo'),NULL) +[[56,3.141600,"foo"],null] +SELECT Json_Array(Json_Object(56 "qty",3.1416 "price",'foo'),NULL); +Json_Array(Json_Object(56 "qty",3.1416 "price",'foo'),NULL) +[{"qty":56,"price":3.141600,"foo":"foo"},null] +# +# Test UDF's with column arguments +# +CREATE TABLE t1 +( +ISBN CHAR(15), +LANG CHAR(2), +SUBJECT CHAR(32), +AUTHOR CHAR(64), +TITLE CHAR(32), +TRANSLATION CHAR(32), +TRANSLATOR CHAR(80), +PUBLISHER CHAR(32), +DATEPUB int(4) +) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; +SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t1; +Json_Array(AUTHOR, TITLE, DATEPUB) +["Jean-Christophe Bernadac","Construire une application XML",1999] +["William J. Pardi","XML en Action",1999] +SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t1; +Json_Object(AUTHOR, TITLE, DATEPUB) +{"AUTHOR":"Jean-Christophe Bernadac","TITLE":"Construire une application XML","DATEPUB":1999} +{"AUTHOR":"William J. Pardi","TITLE":"XML en Action","DATEPUB":1999} +SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t1; +ERROR HY000: Can't initialize function 'Json_Array_Grp'; Json_Array_Grp can only accept 1 argument +SELECT Json_Array_Grp(TITLE) FROM t1; +Json_Array_Grp(TITLE) +["Construire une application XML","XML en Action"] +DROP TABLE t1; +CREATE TABLE t1 ( +SERIALNO CHAR(5) NOT NULL, +NAME VARCHAR(12) NOT NULL FLAG=6, +SEX SMALLINT(1) NOT NULL, +TITLE VARCHAR(15) NOT NULL FLAG=20, +MANAGER CHAR(5) DEFAULT NULL, +DEPARTMENT CHAr(4) NOT NULL FLAG=41, +SECRETARY CHAR(5) DEFAULT NULL FLAG=46, +SALARY DOUBLE(8,2) NOT NULL FLAG=52 +) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1; +SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t1 WHERE NAME = 'MERCHANT'; +Json_Object(SERIALNO, NAME, TITLE, SALARY) +{"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000} +SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t1 GROUP BY DEPARTMENT; +DEPARTMENT Json_Array_Grp(NAME) +0021 ["STRONG","SHORTSIGHT"] +0318 ["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"] +0319 ["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL"] +2452 ["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"] +Warnings: +Warning 1105 Result truncated to json_grp_size values +set connect_json_grp_size=30; +SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t1 GROUP BY DEPARTMENT; +Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) +["0021",["STRONG","SHORTSIGHT"]] +["0318",["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]] +["0319",["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]] +["2452",["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]] +SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t1 GROUP BY DEPARTMENT; +Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) +{"DEPARTMENT":"0021","NAMES":["STRONG","SHORTSIGHT"]} +{"DEPARTMENT":"0318","NAMES":["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]} +{"DEPARTMENT":"0319","NAMES":["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]} +{"DEPARTMENT":"2452","NAMES":["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]} +SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t1 GROUP BY DEPARTMENT; +Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) +{"DEPARTMENT":"0021","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","TITLE":"DIRECTOR","SALARY":23000.000000},{"SERIALNO":"22222","NAME":"SHORTSIGHT","TITLE":"SECRETARY","SALARY":5500.000000}]} +{"DEPARTMENT":"0318","EMPLOYES":[{"SERIALNO":"74200","NAME":"BANCROFT","TITLE":"SALESMAN","SALARY":9600.000000},{"SERIALNO":"24888","NAME":"PLUMHEAD","TITLE":"TYPIST","SALARY":2800.000000},{"SERIALNO":"27845","NAME":"HONEY","TITLE":"SECRETARY","SALARY":4900.000000},{"SERIALNO":"73452","NAME":"TONGHO","TITLE":"ENGINEER","SALARY":6800.000000},{"SERIALNO":"74234","NAME":"WALTER","TITLE":"ENGINEER","SALARY":7400.000000},{"SERIALNO":"77777","NAME":"SHRINKY","TITLE":"ADMINISTRATOR","SALARY":7500.000000},{"SERIALNO":"70012","NAME":"WERTHER","TITLE":"DIRECTOR","SALARY":14500.000000},{"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000},{"SERIALNO":"73111","NAME":"WHEELFOR","TITLE":"SALESMAN","SALARY":10030.000000}]} +{"DEPARTMENT":"0319","EMPLOYES":[{"SERIALNO":"76543","NAME":"BULLOZER","TITLE":"SALESMAN","SALARY":14800.000000},{"SERIALNO":"40567","NAME":"QUINN","TITLE":"DIRECTOR","SALARY":14000.000000},{"SERIALNO":"00137","NAME":"BROWNY","TITLE":"ENGINEER","SALARY":10500.000000},{"SERIALNO":"12345","NAME":"KITTY","TITLE":"TYPIST","SALARY":3000.450000},{"SERIALNO":"33333","NAME":"MONAPENNY","TITLE":"SECRETARY","SALARY":3800.000000},{"SERIALNO":"00023","NAME":"MARTIN","TITLE":"ENGINEER","SALARY":10000.000000},{"SERIALNO":"07654","NAME":"FUNNIGUY","TITLE":"ADMINISTRATOR","SALARY":8500.000000},{"SERIALNO":"45678","NAME":"BUGHAPPY","TITLE":"PROGRAMMER","SALARY":8500.000000},{"SERIALNO":"56789","NAME":"FODDERMAN","TITLE":"SALESMAN","SALARY":7000.000000},{"SERIALNO":"55555","NAME":"MESSIFUL","TITLE":"SECRETARY","SALARY":5000.500000},{"SERIALNO":"98765","NAME":"GOOSEPEN","TITLE":"ADMINISTRATOR","SALARY":4700.000000}]} +{"DEPARTMENT":"2452","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","TITLE":"SCIENTIST","SALARY":8000.000000},{"SERIALNO":"31416","NAME":"ORELLY","TITLE":"ENGINEER","SALARY":13400.000000},{"SERIALNO":"36666","NAME":"BIGHORN","TITLE":"SCIENTIST","SALARY":11000.000000},{"SERIALNO":"02345","NAME":"SMITH","TITLE":"ENGINEER","SALARY":9000.000000},{"SERIALNO":"11111","NAME":"CHERRY","TITLE":"SECRETARY","SALARY":4500.000000}]} +SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t1 GROUP BY DEPARTMENT, TITLE; +Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) +{"DEPARTMENT":"0021","TITLE":"DIRECTOR","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","SALARY":23000.000000}]} +{"DEPARTMENT":"0021","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"22222","NAME":"SHORTSIGHT","SALARY":5500.000000}]} +{"DEPARTMENT":"0318","TITLE":"ADMINISTRATOR","EMPLOYES":[{"SERIALNO":"77777","NAME":"SHRINKY","SALARY":7500.000000}]} +{"DEPARTMENT":"0318","TITLE":"DIRECTOR","EMPLOYES":[{"SERIALNO":"70012","NAME":"WERTHER","SALARY":14500.000000}]} +{"DEPARTMENT":"0318","TITLE":"ENGINEER","EMPLOYES":[{"SERIALNO":"73452","NAME":"TONGHO","SALARY":6800.000000},{"SERIALNO":"74234","NAME":"WALTER","SALARY":7400.000000}]} +{"DEPARTMENT":"0318","TITLE":"SALESMAN","EMPLOYES":[{"SERIALNO":"74200","NAME":"BANCROFT","SALARY":9600.000000},{"SERIALNO":"78943","NAME":"MERCHANT","SALARY":8700.000000},{"SERIALNO":"73111","NAME":"WHEELFOR","SALARY":10030.000000}]} +{"DEPARTMENT":"0318","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"27845","NAME":"HONEY","SALARY":4900.000000}]} +{"DEPARTMENT":"0318","TITLE":"TYPIST","EMPLOYES":[{"SERIALNO":"24888","NAME":"PLUMHEAD","SALARY":2800.000000}]} +{"DEPARTMENT":"0319","TITLE":"ADMINISTRATOR","EMPLOYES":[{"SERIALNO":"98765","NAME":"GOOSEPEN","SALARY":4700.000000},{"SERIALNO":"07654","NAME":"FUNNIGUY","SALARY":8500.000000}]} +{"DEPARTMENT":"0319","TITLE":"DIRECTOR","EMPLOYES":[{"SERIALNO":"40567","NAME":"QUINN","SALARY":14000.000000}]} +{"DEPARTMENT":"0319","TITLE":"ENGINEER","EMPLOYES":[{"SERIALNO":"00023","NAME":"MARTIN","SALARY":10000.000000},{"SERIALNO":"00137","NAME":"BROWNY","SALARY":10500.000000}]} +{"DEPARTMENT":"0319","TITLE":"PROGRAMMER","EMPLOYES":[{"SERIALNO":"45678","NAME":"BUGHAPPY","SALARY":8500.000000}]} +{"DEPARTMENT":"0319","TITLE":"SALESMAN","EMPLOYES":[{"SERIALNO":"76543","NAME":"BULLOZER","SALARY":14800.000000},{"SERIALNO":"56789","NAME":"FODDERMAN","SALARY":7000.000000}]} +{"DEPARTMENT":"0319","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"33333","NAME":"MONAPENNY","SALARY":3800.000000},{"SERIALNO":"55555","NAME":"MESSIFUL","SALARY":5000.500000}]} +{"DEPARTMENT":"0319","TITLE":"TYPIST","EMPLOYES":[{"SERIALNO":"12345","NAME":"KITTY","SALARY":3000.450000}]} +{"DEPARTMENT":"2452","TITLE":"ENGINEER","EMPLOYES":[{"SERIALNO":"31416","NAME":"ORELLY","SALARY":13400.000000},{"SERIALNO":"02345","NAME":"SMITH","SALARY":9000.000000}]} +{"DEPARTMENT":"2452","TITLE":"SCIENTIST","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","SALARY":8000.000000},{"SERIALNO":"36666","NAME":"BIGHORN","SALARY":11000.000000}]} +{"DEPARTMENT":"2452","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"11111","NAME":"CHERRY","SALARY":4500.000000}]} +SELECT Json_Object_Grp(SALARY) FROM t1; +ERROR HY000: Can't initialize function 'Json_Object_Grp'; Json_Array_Grp can only accept 2 arguments +SELECT Json_Object_Grp(SALARY, NAME) FROM t1; +Json_Object_Grp(SALARY, NAME) +{"BANCROFT":9600.000000,"SMITH":9000.000000,"MERCHANT":8700.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"BIGHEAD":8000.000000,"SHRINKY":7500.000000,"WALTER":7400.000000,"FODDERMAN":7000.000000,"TONGHO":6800.000000,"SHORTSIGHT":5500.000000,"MESSIFUL":5000.500000,"HONEY":4900.000000,"GOOSEPEN":4700.000000,"CHERRY":4500.000000,"MONAPENNY":3800.000000,"KITTY":3000.450000,"PLUMHEAD":2800.000000,"STRONG":23000.000000,"BULLOZER":14800.000000,"WERTHER":14500.000000,"QUINN":14000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"BROWNY":10500.000000,"WHEELFOR":10030.000000,"MARTIN":10000.000000} +SELECT Json_Object(DEPARTMENT, Json_Object_Grp(SALARY, NAME) "Json_SALARIES") FROM t1 GROUP BY DEPARTMENT; +Json_Object(DEPARTMENT, Json_Object_Grp(SALARY, NAME) "Json_SALARIES") +{"DEPARTMENT":"0021","SALARIES":{"STRONG":23000.000000,"SHORTSIGHT":5500.000000}} +{"DEPARTMENT":"0318","SALARIES":{"BANCROFT":9600.000000,"PLUMHEAD":2800.000000,"HONEY":4900.000000,"TONGHO":6800.000000,"WALTER":7400.000000,"SHRINKY":7500.000000,"WERTHER":14500.000000,"MERCHANT":8700.000000,"WHEELFOR":10030.000000}} +{"DEPARTMENT":"0319","SALARIES":{"BULLOZER":14800.000000,"QUINN":14000.000000,"BROWNY":10500.000000,"KITTY":3000.450000,"MONAPENNY":3800.000000,"MARTIN":10000.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"FODDERMAN":7000.000000,"MESSIFUL":5000.500000,"GOOSEPEN":4700.000000}} +{"DEPARTMENT":"2452","SALARIES":{"BIGHEAD":8000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"SMITH":9000.000000,"CHERRY":4500.000000}} +SELECT Json_Array_Grp(NAME) from t1; +Json_Array_Grp(NAME) +["BANCROFT","SMITH","MERCHANT","FUNNIGUY","BUGHAPPY","BIGHEAD","SHRINKY","WALTER","FODDERMAN","TONGHO","SHORTSIGHT","MESSIFUL","HONEY","GOOSEPEN","CHERRY","MONAPENNY","KITTY","PLUMHEAD","STRONG","BULLOZER","WERTHER","QUINN","ORELLY","BIGHORN","BROWNY","WHEELFOR","MARTIN"] +DROP TABLE t1; +DROP FUNCTION Json_Array; +DROP FUNCTION Json_Array_Add; +DROP FUNCTION Json_Object; +DROP FUNCTION Json_Object_Nonull; +DROP FUNCTION Json_Value; +DROP FUNCTION Json_Array_Grp; +DROP FUNCTION Json_Object_Grp; diff --git a/storage/connect/mysql-test/connect/r/odbc_oracle.result b/storage/connect/mysql-test/connect/r/odbc_oracle.result index fff2f192184..96d8e53b8e5 100644 --- a/storage/connect/mysql-test/connect/r/odbc_oracle.result +++ b/storage/connect/mysql-test/connect/r/odbc_oracle.result @@ -126,7 +126,7 @@ TABNAME='T1'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `A` decimal(38,0) DEFAULT NULL, + `A` decimal(40,0) DEFAULT NULL, `B` double(40,0) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='T1' SELECT * FROM t1 ORDER BY A; @@ -138,7 +138,7 @@ CREATE TABLE t2 AS SELECT * FROM t1; SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `A` decimal(38,0) DEFAULT NULL, + `A` decimal(40,0) DEFAULT NULL, `B` double(40,0) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 SELECT * FROM t2; @@ -162,7 +162,7 @@ TABNAME='MTR.T1'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `A` decimal(38,0) DEFAULT NULL, + `A` decimal(40,0) DEFAULT NULL, `B` double(40,0) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T1' SELECT * FROM t1; @@ -178,7 +178,7 @@ TABNAME='MTR.V1'; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `A` decimal(38,0) DEFAULT NULL, + `A` decimal(40,0) DEFAULT NULL, `B` double(40,0) DEFAULT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.V1' SELECT * FROM t1; @@ -190,7 +190,7 @@ CREATE TABLE t2 AS SELECT * FROM t1; SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `A` decimal(38,0) DEFAULT NULL, + `A` decimal(40,0) DEFAULT NULL, `B` double(40,0) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 SELECT * FROM t2; diff --git a/storage/connect/mysql-test/connect/std_data/biblio.jsn b/storage/connect/mysql-test/connect/std_data/biblio.json similarity index 95% rename from storage/connect/mysql-test/connect/std_data/biblio.jsn rename to storage/connect/mysql-test/connect/std_data/biblio.json index bab8fd24305..cc24b162cd9 100644 --- a/storage/connect/mysql-test/connect/std_data/biblio.jsn +++ b/storage/connect/mysql-test/connect/std_data/biblio.json @@ -1,45 +1,45 @@ -[ - { - "ISBN": "9782212090819", - "LANG": "fr", - "SUBJECT": "applications", - "AUTHOR": [ - { - "FIRSTNAME": "Jean-Christophe", - "LASTNAME": "Bernadac" - }, - { - "FIRSTNAME": "François", - "LASTNAME": "Knab" - } - ], - "TITLE": "Construire une application XML", - "PUBLISHER": { - "NAME": "Eyrolles", - "PLACE": "Paris" - }, - "DATEPUB": 1999 - }, - { - "ISBN": "9782840825685", - "LANG": "fr", - "SUBJECT": "applications", - "AUTHOR": [ - { - "FIRSTNAME": "William J.", - "LASTNAME": "Pardi" - } - ], - "TITLE": "XML en Action", - "TRANSLATION": "adapté de l'anglais par", - "TRANSLATOR": { - "FIRSTNAME": "James", - "LASTNAME": "Guerin" - }, - "PUBLISHER": { - "NAME": "Microsoft Press", - "PLACE": "Paris" - }, - "DATEPUB": 1999 - } -] +[ + { + "ISBN": "9782212090819", + "LANG": "fr", + "SUBJECT": "applications", + "AUTHOR": [ + { + "FIRSTNAME": "Jean-Christophe", + "LASTNAME": "Bernadac" + }, + { + "FIRSTNAME": "François", + "LASTNAME": "Knab" + } + ], + "TITLE": "Construire une application XML", + "PUBLISHER": { + "NAME": "Eyrolles", + "PLACE": "Paris" + }, + "DATEPUB": 1999 + }, + { + "ISBN": "9782840825685", + "LANG": "fr", + "SUBJECT": "applications", + "AUTHOR": [ + { + "FIRSTNAME": "William J.", + "LASTNAME": "Pardi" + } + ], + "TITLE": "XML en Action", + "TRANSLATION": "adapté de l'anglais par", + "TRANSLATOR": { + "FIRSTNAME": "James", + "LASTNAME": "Guerin" + }, + "PUBLISHER": { + "NAME": "Microsoft Press", + "PLACE": "Paris" + }, + "DATEPUB": 1999 + } +] diff --git a/storage/connect/mysql-test/connect/std_data/expense.jsn b/storage/connect/mysql-test/connect/std_data/expense.json similarity index 94% rename from storage/connect/mysql-test/connect/std_data/expense.jsn rename to storage/connect/mysql-test/connect/std_data/expense.json index e65ad5261f1..f9373ef1a80 100644 --- a/storage/connect/mysql-test/connect/std_data/expense.jsn +++ b/storage/connect/mysql-test/connect/std_data/expense.json @@ -1,158 +1,158 @@ -[ - { - "WHO": "Joe", - "WEEK": [ - { - "NUMBER": 3, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 18.00 - }, - { - "WHAT": "Food", - "AMOUNT": 12.00 - }, - { - "WHAT": "Food", - "AMOUNT": 19.00 - }, - { - "WHAT": "Car", - "AMOUNT": 20.00 - } - ] - }, - { - "NUMBER": 4, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 19.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 16.00 - }, - { - "WHAT": "Food", - "AMOUNT": 17.00 - }, - { - "WHAT": "Food", - "AMOUNT": 17.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 14.00 - } - ] - }, - { - "NUMBER": 5, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 14.00 - }, - { - "WHAT": "Food", - "AMOUNT": 12.00 - } - ] - } - ] - }, - { - "WHO": "Beth", - "WEEK": [ - { - "NUMBER": 3, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 16.00 - } - ] - }, - { - "NUMBER": 4, - "EXPENSE": [ - { - "WHAT": "Food", - "AMOUNT": 17.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 15.00 - } - ] - }, - { - "NUMBER": 5, - "EXPENSE": [ - { - "WHAT": "Food", - "AMOUNT": 12.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 20.00 - } - ] - } - ] - }, - { - "WHO": "Janet", - "WEEK": [ - { - "NUMBER": 3, - "EXPENSE": [ - { - "WHAT": "Car", - "AMOUNT": 19.00 - }, - { - "WHAT": "Food", - "AMOUNT": 18.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 18.00 - } - ] - }, - { - "NUMBER": 4, - "EXPENSE": [ - { - "WHAT": "Car", - "AMOUNT": 17.00 - } - ] - }, - { - "NUMBER": 5, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 14.00 - }, - { - "WHAT": "Car", - "AMOUNT": 12.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 19.00 - }, - { - "WHAT": "Food", - "AMOUNT": 12.00 - } - ] - } - ] - } -] +[ + { + "WHO": "Joe", + "WEEK": [ + { + "NUMBER": 3, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 18.00 + }, + { + "WHAT": "Food", + "AMOUNT": 12.00 + }, + { + "WHAT": "Food", + "AMOUNT": 19.00 + }, + { + "WHAT": "Car", + "AMOUNT": 20.00 + } + ] + }, + { + "NUMBER": 4, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 19.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 16.00 + }, + { + "WHAT": "Food", + "AMOUNT": 17.00 + }, + { + "WHAT": "Food", + "AMOUNT": 17.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 14.00 + } + ] + }, + { + "NUMBER": 5, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 14.00 + }, + { + "WHAT": "Food", + "AMOUNT": 12.00 + } + ] + } + ] + }, + { + "WHO": "Beth", + "WEEK": [ + { + "NUMBER": 3, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 16.00 + } + ] + }, + { + "NUMBER": 4, + "EXPENSE": [ + { + "WHAT": "Food", + "AMOUNT": 17.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 15.00 + } + ] + }, + { + "NUMBER": 5, + "EXPENSE": [ + { + "WHAT": "Food", + "AMOUNT": 12.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 20.00 + } + ] + } + ] + }, + { + "WHO": "Janet", + "WEEK": [ + { + "NUMBER": 3, + "EXPENSE": [ + { + "WHAT": "Car", + "AMOUNT": 19.00 + }, + { + "WHAT": "Food", + "AMOUNT": 18.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 18.00 + } + ] + }, + { + "NUMBER": 4, + "EXPENSE": [ + { + "WHAT": "Car", + "AMOUNT": 17.00 + } + ] + }, + { + "NUMBER": 5, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 14.00 + }, + { + "WHAT": "Car", + "AMOUNT": 12.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 19.00 + }, + { + "WHAT": "Food", + "AMOUNT": 12.00 + } + ] + } + ] + } +] diff --git a/storage/connect/mysql-test/connect/std_data/mulexp3.jsn b/storage/connect/mysql-test/connect/std_data/mulexp3.json similarity index 93% rename from storage/connect/mysql-test/connect/std_data/mulexp3.jsn rename to storage/connect/mysql-test/connect/std_data/mulexp3.json index c228448b073..5edd2ab1e76 100644 --- a/storage/connect/mysql-test/connect/std_data/mulexp3.jsn +++ b/storage/connect/mysql-test/connect/std_data/mulexp3.json @@ -1,52 +1,52 @@ -[ - { - "WHO": "Joe", - "WEEK": 3, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 18.00 - }, - { - "WHAT": "Food", - "AMOUNT": 12.00 - }, - { - "WHAT": "Food", - "AMOUNT": 19.00 - }, - { - "WHAT": "Car", - "AMOUNT": 20.00 - } - ] - }, - { - "WHO": "Beth", - "WEEK": 3, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 16.00 - } - ] - }, - { - "WHO": "Janet", - "WEEK": 3, - "EXPENSE": [ - { - "WHAT": "Car", - "AMOUNT": 19.00 - }, - { - "WHAT": "Food", - "AMOUNT": 18.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 18.00 - } - ] - } -] +[ + { + "WHO": "Joe", + "WEEK": 3, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 18.00 + }, + { + "WHAT": "Food", + "AMOUNT": 12.00 + }, + { + "WHAT": "Food", + "AMOUNT": 19.00 + }, + { + "WHAT": "Car", + "AMOUNT": 20.00 + } + ] + }, + { + "WHO": "Beth", + "WEEK": 3, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 16.00 + } + ] + }, + { + "WHO": "Janet", + "WEEK": 3, + "EXPENSE": [ + { + "WHAT": "Car", + "AMOUNT": 19.00 + }, + { + "WHAT": "Food", + "AMOUNT": 18.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 18.00 + } + ] + } +] diff --git a/storage/connect/mysql-test/connect/std_data/mulexp4.jsn b/storage/connect/mysql-test/connect/std_data/mulexp4.json similarity index 93% rename from storage/connect/mysql-test/connect/std_data/mulexp4.jsn rename to storage/connect/mysql-test/connect/std_data/mulexp4.json index 0e43ffec07b..7f7b88d6afd 100644 --- a/storage/connect/mysql-test/connect/std_data/mulexp4.jsn +++ b/storage/connect/mysql-test/connect/std_data/mulexp4.json @@ -1,52 +1,52 @@ -[ - { - "WHO": "Joe", - "WEEK": 4, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 19.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 16.00 - }, - { - "WHAT": "Food", - "AMOUNT": 17.00 - }, - { - "WHAT": "Food", - "AMOUNT": 17.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 14.00 - } - ] - }, - { - "WHO": "Beth", - "WEEK": 4, - "EXPENSE": [ - { - "WHAT": "Food", - "AMOUNT": 17.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 15.00 - } - ] - }, - { - "WHO": "Janet", - "WEEK": 4, - "EXPENSE": [ - { - "WHAT": "Car", - "AMOUNT": 17.00 - } - ] - } -] +[ + { + "WHO": "Joe", + "WEEK": 4, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 19.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 16.00 + }, + { + "WHAT": "Food", + "AMOUNT": 17.00 + }, + { + "WHAT": "Food", + "AMOUNT": 17.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 14.00 + } + ] + }, + { + "WHO": "Beth", + "WEEK": 4, + "EXPENSE": [ + { + "WHAT": "Food", + "AMOUNT": 17.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 15.00 + } + ] + }, + { + "WHO": "Janet", + "WEEK": 4, + "EXPENSE": [ + { + "WHAT": "Car", + "AMOUNT": 17.00 + } + ] + } +] diff --git a/storage/connect/mysql-test/connect/std_data/mulexp5.jsn b/storage/connect/mysql-test/connect/std_data/mulexp5.json similarity index 93% rename from storage/connect/mysql-test/connect/std_data/mulexp5.jsn rename to storage/connect/mysql-test/connect/std_data/mulexp5.json index 7a707506c2f..b1713040c4b 100644 --- a/storage/connect/mysql-test/connect/std_data/mulexp5.jsn +++ b/storage/connect/mysql-test/connect/std_data/mulexp5.json @@ -1,52 +1,52 @@ -[ - { - "WHO": "Joe", - "WEEK": 5, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 14.00 - }, - { - "WHAT": "Food", - "AMOUNT": 12.00 - } - ] - }, - { - "WHO": "Beth", - "WEEK": 5, - "EXPENSE": [ - { - "WHAT": "Food", - "AMOUNT": 12.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 20.00 - } - ] - }, - { - "WHO": "Janet", - "WEEK": 5, - "EXPENSE": [ - { - "WHAT": "Beer", - "AMOUNT": 14.00 - }, - { - "WHAT": "Car", - "AMOUNT": 12.00 - }, - { - "WHAT": "Beer", - "AMOUNT": 19.00 - }, - { - "WHAT": "Food", - "AMOUNT": 12.00 - } - ] - } -] +[ + { + "WHO": "Joe", + "WEEK": 5, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 14.00 + }, + { + "WHAT": "Food", + "AMOUNT": 12.00 + } + ] + }, + { + "WHO": "Beth", + "WEEK": 5, + "EXPENSE": [ + { + "WHAT": "Food", + "AMOUNT": 12.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 20.00 + } + ] + }, + { + "WHO": "Janet", + "WEEK": 5, + "EXPENSE": [ + { + "WHAT": "Beer", + "AMOUNT": 14.00 + }, + { + "WHAT": "Car", + "AMOUNT": 12.00 + }, + { + "WHAT": "Beer", + "AMOUNT": 19.00 + }, + { + "WHAT": "Food", + "AMOUNT": 12.00 + } + ] + } +] diff --git a/storage/connect/mysql-test/connect/t/json.test b/storage/connect/mysql-test/connect/t/json.test index a7e630ed0cf..f89f58534e7 100644 --- a/storage/connect/mysql-test/connect/t/json.test +++ b/storage/connect/mysql-test/connect/t/json.test @@ -1,247 +1,264 @@ ---source include/not_embedded.inc ---source include/have_partition.inc - -let $MYSQLD_DATADIR= `select @@datadir`; - ---copy_file $MTR_SUITE_DIR/std_data/biblio.jsn $MYSQLD_DATADIR/test/biblio.jsn ---copy_file $MTR_SUITE_DIR/std_data/expense.jsn $MYSQLD_DATADIR/test/expense.jsn ---copy_file $MTR_SUITE_DIR/std_data/mulexp3.jsn $MYSQLD_DATADIR/test/mulexp3.jsn ---copy_file $MTR_SUITE_DIR/std_data/mulexp4.jsn $MYSQLD_DATADIR/test/mulexp4.jsn ---copy_file $MTR_SUITE_DIR/std_data/mulexp5.jsn $MYSQLD_DATADIR/test/mulexp5.jsn - ---echo # ---echo # Testing doc samples ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15), - LANG CHAR(2), - SUBJECT CHAR(32), - AUTHOR CHAR(64), - TITLE CHAR(32), - TRANSLATION CHAR(32), - TRANSLATOR CHAR(80), - PUBLISHER CHAR(32), - DATEPUB int(4) -) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; -SELECT * FROM t1; -DROP TABLE t1; - - ---echo # ---echo # Testing Jpath. Get the number of authors ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15), - Language CHAR(2) FIELD_FORMAT='LANG', - Subject CHAR(32) FIELD_FORMAT='SUBJECT', - Authors INT(2) FIELD_FORMAT='AUTHOR:[#]', - Title CHAR(32) FIELD_FORMAT='TITLE', - Translation CHAR(32) FIELD_FORMAT='TRANSLATION', - Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', - Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', - Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', - Year int(4) FIELD_FORMAT='DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Concatenates the authors ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15), - Language CHAR(2) FIELD_FORMAT='LANG', - Subject CHAR(32) FIELD_FORMAT='SUBJECT', - AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME', - AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME', - Title CHAR(32) FIELD_FORMAT='TITLE', - Translation CHAR(32) FIELD_FORMAT='TRANSLATION', - Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', - Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', - Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', - Year int(4) FIELD_FORMAT='DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Testing expanding authors ---echo # -CREATE TABLE t1 -( - ISBN CHAR(15), - Language CHAR(2) FIELD_FORMAT='LANG', - Subject CHAR(32) FIELD_FORMAT='SUBJECT', - AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', - AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', - Title CHAR(32) FIELD_FORMAT='TITLE', - Translation CHAR(32) FIELD_FORMAT='TRANSLATION', - Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', - Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', - Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', - Year int(4) FIELD_FORMAT='DATEPUB' -) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn'; -SELECT * FROM t1; -UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; -SELECT * FROM t1 WHERE ISBN = '9782212090819'; - ---echo # ---echo # To add an author a new table must be created ---echo # -CREATE TABLE t2 ( -FIRSTNAME CHAR(32), -LASTNAME CHAR(32)) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.jsn' OPTION_LIST='Object=[2]:AUTHOR'; -SELECT * FROM t2; -INSERT INTO t2 VALUES('Charles','Dickens'); -SELECT * FROM t1; -DROP TABLE t1; -DROP TABLE t2; - ---echo # ---echo # Check the biblio file has the good format ---echo # -CREATE TABLE t1 -( - line char(255) -) -ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.jsn'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # A file with 2 arrays ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Cannot be fully expanded ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; ---error ER_GET_ERRMSG -SELECT * FROM t1; -DROP TABLE t1; - ---echo # ---echo # Expand expense in 3 one week tables ---echo # -CREATE TABLE t2 ( -WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; -SELECT * FROM t2; - -CREATE TABLE t3 ( -WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; -SELECT * FROM t3; - -CREATE TABLE t4 ( -WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[3]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.jsn'; -SELECT * FROM t4; - ---echo # ---echo # The expanded table is made as a TBL table ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32), -AMOUNT DOUBLE(8,2)) -ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t2,t3,t4'; -SELECT * FROM t1; -DROP TABLE t1, t2, t3, t4; - ---echo # ---echo # Three partial JSON tables ---echo # -CREATE TABLE t2 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.jsn'; -SELECT * FROM t2; - -CREATE TABLE t3 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.jsn'; -SELECT * FROM t3; - -CREATE TABLE t4 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.jsn'; -SELECT * FROM t4; - ---echo # ---echo # The complete table can be a multiple JSON table ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.jsn' MULTIPLE=1; -SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT; -DROP TABLE t1; - ---echo # ---echo # Or also a partition JSON table ---echo # -CREATE TABLE t1 ( -WHO CHAR(12), -WEEK INT(2), -WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.jsn'; -ALTER TABLE t1 -PARTITION BY LIST COLUMNS(WEEK) ( -PARTITION `3` VALUES IN(3), -PARTITION `4` VALUES IN(4), -PARTITION `5` VALUES IN(5)); -SHOW WARNINGS; -SELECT * FROM t1; -SELECT * FROM t1 WHERE WEEK = 4; -DROP TABLE t1, t2, t3, t4; - -# -# Clean up -# ---remove_file $MYSQLD_DATADIR/test/biblio.jsn ---remove_file $MYSQLD_DATADIR/test/expense.jsn ---remove_file $MYSQLD_DATADIR/test/mulexp3.jsn ---remove_file $MYSQLD_DATADIR/test/mulexp4.jsn ---remove_file $MYSQLD_DATADIR/test/mulexp5.jsn +--source include/not_embedded.inc +--source include/have_partition.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +--copy_file $MTR_SUITE_DIR/std_data/biblio.json $MYSQLD_DATADIR/test/biblio.json +--copy_file $MTR_SUITE_DIR/std_data/expense.json $MYSQLD_DATADIR/test/expense.json +--copy_file $MTR_SUITE_DIR/std_data/mulexp3.json $MYSQLD_DATADIR/test/mulexp3.json +--copy_file $MTR_SUITE_DIR/std_data/mulexp4.json $MYSQLD_DATADIR/test/mulexp4.json +--copy_file $MTR_SUITE_DIR/std_data/mulexp5.json $MYSQLD_DATADIR/test/mulexp5.json + +--echo # +--echo # Testing doc samples +--echo # +CREATE TABLE t1 +( + ISBN CHAR(15), + LANG CHAR(2), + SUBJECT CHAR(32), + AUTHOR CHAR(64), + TITLE CHAR(32), + TRANSLATION CHAR(32), + TRANSLATOR CHAR(80), + PUBLISHER CHAR(32), + DATEPUB int(4) +) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing Jpath. Get the number of authors +--echo # +CREATE TABLE t1 +( + ISBN CHAR(15), + Language CHAR(2) FIELD_FORMAT='LANG', + Subject CHAR(32) FIELD_FORMAT='SUBJECT', + Authors INT(2) FIELD_FORMAT='AUTHOR:[#]', + Title CHAR(32) FIELD_FORMAT='TITLE', + Translation CHAR(32) FIELD_FORMAT='TRANSLATION', + Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', + Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', + Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', + Year int(4) FIELD_FORMAT='DATEPUB' +) +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # Concatenates the authors +--echo # +CREATE TABLE t1 +( + ISBN CHAR(15), + Language CHAR(2) FIELD_FORMAT='LANG', + Subject CHAR(32) FIELD_FORMAT='SUBJECT', + AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:FIRSTNAME', + AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[" and "]:LASTNAME', + Title CHAR(32) FIELD_FORMAT='TITLE', + Translation CHAR(32) FIELD_FORMAT='TRANSLATION', + Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', + Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', + Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', + Year int(4) FIELD_FORMAT='DATEPUB' +) +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # Testing expanding authors +--echo # +CREATE TABLE t1 +( + ISBN CHAR(15), + Language CHAR(2) FIELD_FORMAT='LANG', + Subject CHAR(32) FIELD_FORMAT='SUBJECT', + AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', + AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', + Title CHAR(32) FIELD_FORMAT='TITLE', + Translation CHAR(32) FIELD_FORMAT='TRANSLATION', + Translator CHAR(80) FIELD_FORMAT='TRANSLATOR', + Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', + Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', + Year int(4) FIELD_FORMAT='DATEPUB' +) +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; +SELECT * FROM t1; +UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; +SELECT * FROM t1 WHERE ISBN = '9782212090819'; + +--echo # +--echo # To add an author a new table must be created +--echo # +CREATE TABLE t2 ( +FIRSTNAME CHAR(32), +LASTNAME CHAR(32)) +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[2]:AUTHOR'; +SELECT * FROM t2; +INSERT INTO t2 VALUES('Charles','Dickens'); +SELECT * FROM t1; +DROP TABLE t1; +DROP TABLE t2; + +--echo # +--echo # Check the biblio file has the good format +--echo # +CREATE TABLE t1 +( + line char(255) +) +ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.json'; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # A file with 2 arrays +--echo # +CREATE TABLE t1 ( +WHO CHAR(12), +WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK::EXPENSE:["+"]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK::EXPENSE:[+]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # Now it can be fully expanded +--echo # +CREATE TABLE t1 ( +WHO CHAR(12), +WEEK INT(2) FIELD_FORMAT='WEEK:[X]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[X]:EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; +#--error ER_GET_ERRMSG +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # A table showing many calculated results +--echo # +CREATE TABLE t1 ( +WHO CHAR(12) NOT NULL, +WEEKS CHAR(12) NOT NULL FIELD_FORMAT='WEEK:[", "]:NUMBER', +SUMS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[+]:AMOUNT', +SUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[+]:AMOUNT', +AVGS CHAR(64) NOT NULL FIELD_FORMAT='WEEK:["+"]:EXPENSE:[!]:AMOUNT', +SUMAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[+]:EXPENSE:[!]:AMOUNT', +AVGSUM DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[+]:AMOUNT', +AVGAVG DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[!]:AMOUNT', +AVERAGE DOUBLE(8,2) NOT NULL FIELD_FORMAT='WEEK:[!]:EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # Expand expense in 3 one week tables +--echo # +CREATE TABLE t2 ( +WHO CHAR(12), +WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; +SELECT * FROM t2; + +CREATE TABLE t3 ( +WHO CHAR(12), +WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; +SELECT * FROM t3; + +CREATE TABLE t4 ( +WHO CHAR(12), +WEEK INT(2) FIELD_FORMAT='WEEK:[3]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; +SELECT * FROM t4; + +--echo # +--echo # The expanded table is made as a TBL table +--echo # +CREATE TABLE t1 ( +WHO CHAR(12), +WEEK INT(2), +WHAT CHAR(32), +AMOUNT DOUBLE(8,2)) +ENGINE=CONNECT TABLE_TYPE=TBL TABLE_LIST='t2,t3,t4'; +SELECT * FROM t1; +DROP TABLE t1, t2, t3, t4; + +--echo # +--echo # Three partial JSON tables +--echo # +CREATE TABLE t2 ( +WHO CHAR(12), +WEEK INT(2), +WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp3.json'; +SELECT * FROM t2; + +CREATE TABLE t3 ( +WHO CHAR(12), +WEEK INT(2), +WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp4.json'; +SELECT * FROM t3; + +CREATE TABLE t4 ( +WHO CHAR(12), +WEEK INT(2), +WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp5.json'; +SELECT * FROM t4; + +--echo # +--echo # The complete table can be a multiple JSON table +--echo # +CREATE TABLE t1 ( +WHO CHAR(12), +WEEK INT(2), +WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp*.json' MULTIPLE=1; +SELECT * FROM t1 ORDER BY WHO, WEEK, WHAT, AMOUNT; +DROP TABLE t1; + +--echo # +--echo # Or also a partition JSON table +--echo # +CREATE TABLE t1 ( +WHO CHAR(12), +WEEK INT(2), +WHAT CHAR(32) FIELD_FORMAT='EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='EXPENSE:[X]:AMOUNT') +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='mulexp%s.json'; +ALTER TABLE t1 +PARTITION BY LIST COLUMNS(WEEK) ( +PARTITION `3` VALUES IN(3), +PARTITION `4` VALUES IN(4), +PARTITION `5` VALUES IN(5)); +SHOW WARNINGS; +SELECT * FROM t1; +SELECT * FROM t1 WHERE WEEK = 4; +DROP TABLE t1, t2, t3, t4; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/biblio.json +--remove_file $MYSQLD_DATADIR/test/expense.json +--remove_file $MYSQLD_DATADIR/test/mulexp3.json +--remove_file $MYSQLD_DATADIR/test/mulexp4.json +--remove_file $MYSQLD_DATADIR/test/mulexp5.json diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index e903bad91c0..36f3fc73210 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -238,7 +238,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) continue; // Not a match strcat(strcpy(filename, direc), entry->d_name); - pfn[n] = PlugDup(g, filename); + pfn[n++] = PlugDup(g, filename); if (trace) htrc("Adding pfn[%d] %s\n", n, filename); diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 33a4dd67d38..e4befc8bfde 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -1078,8 +1078,7 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len) if (Myc.m_Res) Myc.FreeResult(); - To_Def->GetHandler()->MakeKeyWhere(g, Query->GetStr(), - op, "`", key, len); + To_Def->GetHandler()->MakeKeyWhere(g, Query, op, '`', key, len); if (To_CondFil) { oom = Query->Append(" AND ("); diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index e012e12d00b..7d3d5463129 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -627,13 +627,16 @@ int TYPVAL::GetValLen(void) template bool TYPVAL::SetValue_pval(PVAL valp, bool chktype) { - if (chktype && Type != valp->GetType()) - return true; + if (valp != this) { + if (chktype && Type != valp->GetType()) + return true; - if (!(Null = valp->IsNull() && Nullable)) - Tval = GetTypedValue(valp); - else - Reset(); + if (!(Null = valp->IsNull() && Nullable)) + Tval = GetTypedValue(valp); + else + Reset(); + + } // endif valp return false; } // end of SetValue @@ -1319,15 +1322,18 @@ ulonglong TYPVAL::GetUBigintValue(void) /***********************************************************************/ bool TYPVAL::SetValue_pval(PVAL valp, bool chktype) { - if (chktype && (valp->GetType() != Type || valp->GetSize() > Len)) - return true; + if (valp != this) { + if (chktype && (valp->GetType() != Type || valp->GetSize() > Len)) + return true; - char buf[64]; + char buf[64]; - if (!(Null = valp->IsNull() && Nullable)) - strncpy(Strp, valp->GetCharString(buf), Len); - else - Reset(); + if (!(Null = valp->IsNull() && Nullable)) + strncpy(Strp, valp->GetCharString(buf), Len); + else + Reset(); + + } // endif valp return false; } // end of SetValue_pval @@ -2063,18 +2069,21 @@ double BINVAL::GetFloatValue(void) /***********************************************************************/ bool BINVAL::SetValue_pval(PVAL valp, bool chktype) { - if (chktype && (valp->GetType() != Type || valp->GetSize() > Clen)) - return true; - bool rc = false; - - if (!(Null = valp->IsNull() && Nullable)) { - if ((rc = (Len = valp->GetSize()) > Clen)) - Len = Clen; + + if (valp != this) { + if (chktype && (valp->GetType() != Type || valp->GetSize() > Clen)) + return true; - memcpy(Binp, valp->GetTo_Val(), Len); - } else - Reset(); + if (!(Null = valp->IsNull() && Nullable)) { + if ((rc = (Len = valp->GetSize()) > Clen)) + Len = Clen; + + memcpy(Binp, valp->GetTo_Val(), Len); + } else + Reset(); + + } // endif valp return rc; } // end of SetValue_pval @@ -2629,21 +2638,24 @@ bool DTVAL::MakeDate(PGLOBAL g, int *val, int nval) /***********************************************************************/ bool DTVAL::SetValue_pval(PVAL valp, bool chktype) { - if (chktype && Type != valp->GetType()) - return true; + if (valp != this) { + if (chktype && Type != valp->GetType()) + return true; - if (!(Null = valp->IsNull() && Nullable)) { - if (Pdtp && !valp->IsTypeNum()) { - int ndv; - int dval[6]; + if (!(Null = valp->IsNull() && Nullable)) { + if (Pdtp && !valp->IsTypeNum()) { + int ndv; + int dval[6]; + + ndv = ExtractDate(valp->GetCharValue(), Pdtp, DefYear, dval); + MakeDate(NULL, dval, ndv); + } else + Tval = valp->GetIntValue(); - ndv = ExtractDate(valp->GetCharValue(), Pdtp, DefYear, dval); - MakeDate(NULL, dval, ndv); } else - Tval = valp->GetIntValue(); + Reset(); - } else - Reset(); + } // endif valp return false; } // end of SetValue diff --git a/storage/connect/xobject.cpp b/storage/connect/xobject.cpp index 817acb561fe..92bf039c07c 100644 --- a/storage/connect/xobject.cpp +++ b/storage/connect/xobject.cpp @@ -289,6 +289,34 @@ bool STRING::Set(char *s, uint n) return false; } // end of Set +/***********************************************************************/ +/* Append a char* to a STRING. */ +/***********************************************************************/ +bool STRING::Append(const char *s, uint ln) +{ + if (!s) + return false; + + uint len = Length + ln + 1; + + if (len > Size) { + char *p = Realloc(len); + + if (!p) + return true; + else if (p != Strp) { + strcpy(p, Strp); + Strp = p; + } // endif p + + } // endif n + + strncpy(Strp + Length, s, ln); + Length = len - 1; + Strp[Length] = 0; + return false; +} // end of Append + /***********************************************************************/ /* Append a PSZ to a STRING. */ /***********************************************************************/ diff --git a/storage/connect/xobject.h b/storage/connect/xobject.h index 3660ee86918..8e2358dd526 100644 --- a/storage/connect/xobject.h +++ b/storage/connect/xobject.h @@ -134,6 +134,7 @@ class DllExport STRING : public BLOCK { inline void Reset(void) {*Strp = 0;} bool Set(PSZ s); bool Set(char *s, uint n); + bool Append(const char *s, uint ln); bool Append(PSZ s); bool Append(STRING &str); bool Append(char c); From b3f9838f5b0fc69a759862314befa6c12439b5aa Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 19 Apr 2015 12:15:58 +0200 Subject: [PATCH 06/39] Update 10.1 with changes from 10.0 --- storage/connect/RelWithDebInfo/ha_connect.exp | Bin 0 -> 379584 bytes storage/connect/connect.cc | 1 - .../ha_connect.dll.intermediate.manifest | 10 + .../connect/connect.dir/RelWithDebInfo/mt.dep | 1 + .../connect.dir/RelWithDebInfo/vc90.idb | Bin 0 -> 945152 bytes .../RelWithDebInfo/versioninfo_dll.res | Bin 0 -> 392 bytes storage/connect/domdoc.cpp | 95 +++- storage/connect/domdoc.h | 19 +- storage/connect/filamap.h | 1 + storage/connect/filamtxt.h | 1 + storage/connect/ha_connect.cc | 41 +- storage/connect/ha_connect.h | 10 +- storage/connect/libdoc.cpp | 68 ++- storage/connect/mycat.cc | 7 +- storage/connect/mycat.h | 40 ++ .../connect/mysql-test/connect/r/json.result | 18 +- storage/connect/plgxml.h | 15 +- storage/connect/reldef.cpp | 11 +- storage/connect/reldef.h | 2 + storage/connect/tabjson.cpp | 511 +++++++----------- storage/connect/tabjson.h | 40 +- storage/connect/table.cpp | 6 +- storage/connect/tabmysql.cpp | 1 - storage/connect/taboccur.cpp | 1 - storage/connect/tabpivot.cpp | 1 - storage/connect/tabtbl.cpp | 1 - storage/connect/tabutil.cpp | 1 - storage/connect/tabxcl.cpp | 1 - storage/connect/tabxml.cpp | 376 ++++++++++++- storage/connect/tabxml.h | 23 + 30 files changed, 907 insertions(+), 395 deletions(-) create mode 100644 storage/connect/RelWithDebInfo/ha_connect.exp create mode 100644 storage/connect/connect.dir/RelWithDebInfo/ha_connect.dll.intermediate.manifest create mode 100644 storage/connect/connect.dir/RelWithDebInfo/mt.dep create mode 100644 storage/connect/connect.dir/RelWithDebInfo/vc90.idb create mode 100644 storage/connect/connect.dir/RelWithDebInfo/versioninfo_dll.res diff --git a/storage/connect/RelWithDebInfo/ha_connect.exp b/storage/connect/RelWithDebInfo/ha_connect.exp new file mode 100644 index 0000000000000000000000000000000000000000..54c7ad9507d7270bf22fe0e771777b29ebfe7137 GIT binary patch literal 379584 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%0DA*d*p1=el8_==Ku`^ax&JJ6l{j6?5`;fX>6lz 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 + + + + + + + + + diff --git a/storage/connect/connect.dir/RelWithDebInfo/mt.dep b/storage/connect/connect.dir/RelWithDebInfo/mt.dep new file mode 100644 index 00000000000..573c067a848 --- /dev/null +++ b/storage/connect/connect.dir/RelWithDebInfo/mt.dep @@ -0,0 +1 @@ +La ressource de manifeste a ‚t‚ mise … jour pour la derniŠre fois … 15:13:07,47 le 21/03/2015 diff --git a/storage/connect/connect.dir/RelWithDebInfo/vc90.idb b/storage/connect/connect.dir/RelWithDebInfo/vc90.idb new file mode 100644 index 0000000000000000000000000000000000000000..cb2d12c4e0b22dfaa2276f3427794e3be150a9a4 GIT binary patch literal 945152 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�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 == NULL) Next = NULL; - else if (!Next) + else // if (!Next) Next = new(g) DOMNODE(Doc, Nodep->nextSibling); return Next; @@ -288,7 +288,7 @@ PXNODE DOMNODE::GetChild(PGLOBAL g) { if (Nodep->firstChild == NULL) Children = NULL; - else if (!Children) + else // if (!Children) Children = new(g) DOMNODE(Doc, Nodep->firstChild); return Children; @@ -441,15 +441,27 @@ PXNODE DOMNODE::SelectSingleNode(PGLOBAL g, char *xp, PXNODE np) /******************************************************************/ PXATTR DOMNODE::GetAttribute(PGLOBAL g, char *name, PXATTR ap) { - MSXML2::IXMLDOMElementPtr ep = Nodep; - MSXML2::IXMLDOMAttributePtr atp = ep->getAttributeNode(name); + MSXML2::IXMLDOMElementPtr ep; + MSXML2::IXMLDOMNamedNodeMapPtr nmp; + MSXML2::IXMLDOMAttributePtr atp; + + if (name) { + ep = Nodep; + atp = ep->getAttributeNode(name); + nmp = NULL; + } else { + nmp = Nodep->Getattributes(); + atp = nmp->Getitem(0); + } // endif name if (atp) { if (ap) { ((PDOMATTR)ap)->Atrp = atp; + ((PDOMATTR)ap)->Nmp = nmp; + ((PDOMATTR)ap)->K = 0; return ap; } else - return new(g) DOMATTR(Doc, atp); + return new(g) DOMATTR(Doc, atp, nmp); } else return NULL; @@ -617,14 +629,85 @@ bool DOMNODELIST::DropItem(PGLOBAL g, int n) /******************************************************************/ /* DOMATTR constructor. */ /******************************************************************/ -DOMATTR::DOMATTR(PXDOC dp, MSXML2::IXMLDOMAttributePtr ap) +DOMATTR::DOMATTR(PXDOC dp, MSXML2::IXMLDOMAttributePtr ap, + MSXML2::IXMLDOMNamedNodeMapPtr nmp) : XMLATTRIBUTE(dp) { Atrp = ap; + Nmp = nmp; Ws = NULL; Len = 0; + K = 0; } // end of DOMATTR constructor +/******************************************************************/ +/* Return the attribute name. */ +/******************************************************************/ +char *DOMATTR::GetName(PGLOBAL g) + { + if (!WideCharToMultiByte(CP_ACP, 0, Atrp->nodeName, -1, + Name, sizeof(Name), NULL, NULL)) { + strcpy(g->Message, MSG(NAME_CONV_ERR)); + return NULL; + } // endif + + return Name; + } // end of GetName + +/******************************************************************/ +/* Return the next attribute node. */ +/* This funtion is implemented as needed by XMLColumns. */ +/******************************************************************/ +PXATTR DOMATTR::GetNext(PGLOBAL g) + { + if (!Nmp) + return NULL; + + if (++K >= Nmp->Getlength()) { + Nmp->reset(); + Nmp = NULL; + K = 0; + return NULL; + } // endif K + + Atrp = Nmp->Getitem(K); + return this; + } // end of GetNext + +/******************************************************************/ +/* Return the content of a node and subnodes. */ +/******************************************************************/ +RCODE DOMATTR::GetText(PGLOBAL g, char *buf, int len) + { + RCODE rc = RC_OK; + + if (!WideCharToMultiByte(CP_UTF8, 0, Atrp->text, -1, + buf, len, NULL, NULL)) { + DWORD lsr = GetLastError(); + + switch (lsr) { + case 0: + case ERROR_INSUFFICIENT_BUFFER: // 122L + sprintf(g->Message, "Truncated %s content", GetName(g)); + rc = RC_INFO; + break; + case ERROR_NO_UNICODE_TRANSLATION: // 1113L + sprintf(g->Message, "Invalid character(s) in %s content", + GetName(g)); + rc = RC_INFO; + break; + default: + sprintf(g->Message, "System error getting %s content", + GetName(g)); + rc = RC_FX; + break; + } // endswitch + + } // endif + + return rc; + } // end of GetText + /******************************************************************/ /* Set the text content of an attribute. */ /******************************************************************/ diff --git a/storage/connect/domdoc.h b/storage/connect/domdoc.h index 118541d8eb0..2cffec499e2 100644 --- a/storage/connect/domdoc.h +++ b/storage/connect/domdoc.h @@ -122,15 +122,24 @@ class DOMATTR : public XMLATTRIBUTE { friend class DOMDOC; friend class DOMNODE; public: + // Properties + virtual char *GetName(PGLOBAL g); + virtual PXATTR GetNext(PGLOBAL); + // Methods - virtual bool SetText(PGLOBAL g, char *txtp, int len); + virtual RCODE GetText(PGLOBAL g, char *bufp, int len); + virtual bool SetText(PGLOBAL g, char *txtp, int len); protected: // Constructor - DOMATTR(PXDOC dp, MSXML2::IXMLDOMAttributePtr ap); + DOMATTR(PXDOC dp, MSXML2::IXMLDOMAttributePtr ap, + MSXML2::IXMLDOMNamedNodeMapPtr nmp = NULL); // Members - MSXML2::IXMLDOMAttributePtr Atrp; - WCHAR *Ws; - int Len; + MSXML2::IXMLDOMAttributePtr Atrp; + MSXML2::IXMLDOMNamedNodeMapPtr Nmp; + char Name[64]; + WCHAR *Ws; + int Len; + long K; }; // end of class DOMATTR diff --git a/storage/connect/filamap.h b/storage/connect/filamap.h index 1d44239e610..b9c8ad965fd 100644 --- a/storage/connect/filamap.h +++ b/storage/connect/filamap.h @@ -17,6 +17,7 @@ typedef class MAPFAM *PMAPFAM; /* This is the variable file access method using file mapping. */ /***********************************************************************/ class DllExport MAPFAM : public TXTFAM { + friend class TDBJSON; public: // Constructor MAPFAM(PDOSDEF tdp); diff --git a/storage/connect/filamtxt.h b/storage/connect/filamtxt.h index 864ca66dd34..1c8ea1e3a6c 100644 --- a/storage/connect/filamtxt.h +++ b/storage/connect/filamtxt.h @@ -42,6 +42,7 @@ class DllExport TXTFAM : public BLOCK { virtual PTXF Duplicate(PGLOBAL g) = 0; virtual bool GetUseTemp(void) {return false;} virtual int GetDelRows(void) {return DelRows;} + PFBLOCK GetTo_Fb(void) {return To_Fb;} int GetCurBlk(void) {return CurBlk;} void SetTdbp(PTDBDOS tdbp) {Tdbp = tdbp;} int GetBlock(void) {return Block;} diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index d310ff55980..a3f88bfe7eb 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -145,7 +145,6 @@ #include "connect.h" #include "user_connect.h" #include "ha_connect.h" -#include "mycat.h" #include "myutil.h" #include "preparse.h" #include "inihandl.h" @@ -169,7 +168,7 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.03.0006 March 16, 2015"; + char version[]= "Version 1.03.0006 April 12, 2015"; #if defined(WIN32) char compver[]= "Version 1.03.0006 " __DATE__ " " __TIME__; @@ -211,6 +210,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info); PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, int pretty, int lvl, int mxr, bool info); +PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info); void PushWarning(PGLOBAL g, THD *thd, int level); bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, const char *db, char *tab, const char *src, int port); @@ -5228,6 +5228,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, strcpy(g->Message, "Missing OEM module or subtype"); break; +#if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) + case TAB_XML: +#endif // LIBXML2_SUPPORT || DOMDOC_SUPPORT case TAB_JSON: if (!fn) sprintf(g->Message, "Missing %s file name", topt->type); @@ -5348,6 +5351,11 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, case TAB_JSON: qrp= JSONColumns(g, (char*)db, fn, objn, pty, lrecl, lvl, fnc == FNC_COL); break; +#if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) + case TAB_XML: + qrp= XMLColumns(g, (char*)db, tab, topt, fnc == FNC_COL); + break; +#endif // LIBXML2_SUPPORT || DOMDOC_SUPPORT case TAB_OEM: qrp= OEMColumns(g, topt, tab, (char*)db, fnc == FNC_COL); break; @@ -5385,7 +5393,9 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, #endif // !NEW_WAY } // endfor crp - } else { + } else { + char *schem= NULL; + // Not a catalog table if (!qrp->Nblin) { if (tab) @@ -5469,6 +5479,19 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, key= crp->Kdata->GetCharValue(i); break; + case FLD_SCHEM: +#if defined(ODBC_SUPPORT) + if (ttp == TAB_ODBC && crp->Kdata) { + if (schem && stricmp(schem, crp->Kdata->GetCharValue(i))) { + sprintf(g->Message, + "Several %s tables found, specify DBNAME", tab); + my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + goto err; + } else if (!schem) + schem= crp->Kdata->GetCharValue(i); + + } // endif ttp +#endif // ODBC_SUPPORT default: break; // Ignore } // endswitch Fld @@ -5790,6 +5813,18 @@ int ha_connect::create(const char *name, TABLE *table_arg, } // endif type + if (type == TAB_JSON) { + int pretty= atoi(GetListOption(g, "Pretty", options->oplist, "2")); + + if (!options->lrecl && pretty != 2) { + sprintf(g->Message, "LRECL must be specified for pretty=%d", pretty); + my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); + rc= HA_ERR_INTERNAL_ERROR; + DBUG_RETURN(rc); + } // endif lrecl + + } // endif type + // Check column types for (field= table_arg->field; *field; field++) { fp= *field; diff --git a/storage/connect/ha_connect.h b/storage/connect/ha_connect.h index c3b911710b8..611f9ba0b54 100644 --- a/storage/connect/ha_connect.h +++ b/storage/connect/ha_connect.h @@ -26,6 +26,11 @@ #pragma interface /* gcc class implementation */ #endif +/****************************************************************************/ +/* mycat.h contains the TOS, PTOS, ha_table_option_struct declarations. */ +/****************************************************************************/ +#include "mycat.h" + static char *strz(PGLOBAL g, LEX_STRING &ls); /****************************************************************************/ @@ -68,7 +73,6 @@ public: typedef class XCHK *PCHK; typedef class user_connect *PCONNECT; -typedef struct ha_table_option_struct TOS, *PTOS; typedef struct ha_field_option_struct FOS, *PFOS; typedef struct ha_index_option_struct XOS, *PXOS; @@ -80,6 +84,9 @@ extern handlerton *connect_hton; These can be specified in the CREATE TABLE: CREATE TABLE ( ... ) {...here...} */ +#if 0 // moved to mycat.h +typedef struct ha_table_option_struct TOS, *PTOS; + struct ha_table_option_struct { const char *type; const char *filename; @@ -111,6 +118,7 @@ struct ha_table_option_struct { bool readonly; bool sepindex; }; +#endif // 0 /** structure for CREATE TABLE options (field options) diff --git a/storage/connect/libdoc.cpp b/storage/connect/libdoc.cpp index e5c0ee6cfff..7d1d014c48b 100644 --- a/storage/connect/libdoc.cpp +++ b/storage/connect/libdoc.cpp @@ -162,10 +162,12 @@ class XML2ATTR : public XMLATTRIBUTE { friend class XML2NODE; public: // Properties -//virtual char *GetText(void); + virtual char *GetName(PGLOBAL g) {return (char*)Atrp->name;} + virtual PXATTR GetNext(PGLOBAL g); // Methods - virtual bool SetText(PGLOBAL g, char *txtp, int len); + virtual RCODE GetText(PGLOBAL g, char *bufp, int len); + virtual bool SetText(PGLOBAL g, char *txtp, int len); protected: // Constructor @@ -812,7 +814,7 @@ PXNODE XML2NODE::GetNext(PGLOBAL g) if (!Nodep->next) Next = NULL; - else if (!Next) + else // if (!Next) Next = new(g) XML2NODE(Doc, Nodep->next); return Next; @@ -828,7 +830,7 @@ PXNODE XML2NODE::GetChild(PGLOBAL g) if (!Nodep->children) Children = NULL; - else if (!Children) + else // if (!Children) Children = new(g) XML2NODE(Doc, Nodep->children); return Children; @@ -978,10 +980,16 @@ PXNODE XML2NODE::SelectSingleNode(PGLOBAL g, char *xp, PXNODE np) /******************************************************************/ PXATTR XML2NODE::GetAttribute(PGLOBAL g, char *name, PXATTR ap) { - if (trace) - htrc("GetAttribute: %s\n", name); + xmlAttrPtr atp; + + if (trace) + htrc("GetAttribute: %s\n", SVP(name)); + + if (name) + atp = xmlHasProp(Nodep, BAD_CAST name); + else + atp = Nodep->properties; - xmlAttrPtr atp = xmlHasProp(Nodep, BAD_CAST name); if (atp) { if (ap) { @@ -1209,6 +1217,52 @@ XML2ATTR::XML2ATTR(PXDOC dp, xmlAttrPtr ap, xmlNodePtr np) Parent = np; } // end of XML2ATTR constructor +/******************************************************************/ +/* Return the next sibling of the attribute. */ +/******************************************************************/ +PXATTR XML2ATTR::GetNext(PGLOBAL g) + { + if (trace) + htrc("Attr GetNext\n"); + + if (!Atrp->next) + return NULL; + else + return new(g) XML2ATTR(Doc, Atrp->next, Atrp->parent); + + } // end of GetNext + +/******************************************************************/ +/* Return the text of an attribute. */ +/******************************************************************/ +RCODE XML2ATTR::GetText(PGLOBAL g, char *buf, int len) + { + RCODE rc = RC_OK; + xmlChar *txt; + + if (trace) + htrc("GetText\n"); + + if ((txt = xmlGetProp(Atrp->parent, Atrp->name))) { + // Copy the text to the buffer + if (strlen((char*)txt) >= (unsigned)len) { + memcpy(buf, txt, len - 1); + buf[len - 1] = 0; + sprintf(g->Message, "Truncated %s content", Atrp->name); + rc = RC_INFO; + } else + strcpy(buf, (const char*)txt); + + xmlFree(txt); + } else + *buf = '\0'; + + if (trace) + htrc("GetText: %s\n", buf); + + return rc; + } // end of GetText + /******************************************************************/ /* Set the content of an attribute. */ /******************************************************************/ diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index a4986da4089..b15c8fa2322 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -74,9 +74,6 @@ #include "tabxcl.h" #include "tabtbl.h" #include "taboccur.h" -#if defined(XML_SUPPORT) -#include "tabxml.h" -#endif // XML_SUPPORT #include "tabmul.h" #include "tabmysql.h" #if defined(ODBC_SUPPORT) @@ -89,7 +86,9 @@ #include "tabvir.h" #include "tabjson.h" #include "ha_connect.h" -#include "mycat.h" +#if defined(XML_SUPPORT) +#include "tabxml.h" +#endif // XML_SUPPORT /***********************************************************************/ /* Extern static variables. */ diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h index 1aaee4ed1e8..cdbe4e5bca9 100644 --- a/storage/connect/mycat.h +++ b/storage/connect/mycat.h @@ -24,6 +24,46 @@ #include "block.h" #include "catalog.h" +typedef struct ha_table_option_struct TOS, *PTOS; + +/** + structure for CREATE TABLE options (table options) + + These can be specified in the CREATE TABLE: + CREATE TABLE ( ... ) {...here...} +*/ +struct ha_table_option_struct { + const char *type; + const char *filename; + const char *optname; + const char *tabname; + const char *tablist; + const char *dbname; + const char *separator; +//const char *connect; + const char *qchar; + const char *module; + const char *subtype; + const char *catfunc; + const char *srcdef; + const char *colist; + const char *oplist; + const char *data_charset; + ulonglong lrecl; + ulonglong elements; +//ulonglong estimate; + ulonglong multiple; + ulonglong header; + ulonglong quoted; + ulonglong ending; + ulonglong compressed; + bool mapped; + bool huge; + bool split; + bool readonly; + bool sepindex; + }; + // Possible value for catalog functions #define FNC_NO (1 << 0) // Not a catalog table #define FNC_COL (1 << 1) // Column catalog function diff --git a/storage/connect/mysql-test/connect/r/json.result b/storage/connect/mysql-test/connect/r/json.result index ebcad699759..fa6497e5bba 100644 --- a/storage/connect/mysql-test/connect/r/json.result +++ b/storage/connect/mysql-test/connect/r/json.result @@ -15,7 +15,7 @@ DATEPUB int(4) ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; ISBN LANG SUBJECT AUTHOR TITLE TRANSLATION TRANSLATOR PUBLISHER DATEPUB -9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 DROP TABLE t1; # @@ -37,7 +37,7 @@ Year int(4) FIELD_FORMAT='DATEPUB' ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; ISBN Language Subject Authors Title Translation Translator Publisher Location Year -9782212090819 fr applications 2 Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications 2 Construire une application XML NULL NULL Eyrolles Paris 1999 9782840825685 fr applications 1 XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 DROP TABLE t1; # @@ -60,7 +60,7 @@ Year int(4) FIELD_FORMAT='DATEPUB' ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Jean-Christophe and François Bernadac and Knab Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications Jean-Christophe and François Bernadac and Knab Construire une application XML NULL NULL Eyrolles Paris 1999 9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 DROP TABLE t1; # @@ -83,14 +83,14 @@ Year int(4) FIELD_FORMAT='DATEPUB' ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; SELECT * FROM t1; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; SELECT * FROM t1 WHERE ISBN = '9782212090819'; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Philippe Bernadac Construire une application XML Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications Philippe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 # # To add an author a new table must be created # @@ -104,8 +104,8 @@ William J. Pardi INSERT INTO t2 VALUES('Charles','Dickens'); SELECT * FROM t1; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Philippe Bernadac Construire une application XML Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML Eyrolles Paris 1999 +9782212090819 fr applications Philippe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 9782840825685 fr applications Charles Dickens XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 DROP TABLE t1; diff --git a/storage/connect/plgxml.h b/storage/connect/plgxml.h index 74a16fd4823..b8e914e0bf1 100644 --- a/storage/connect/plgxml.h +++ b/storage/connect/plgxml.h @@ -1,5 +1,5 @@ /******************************************************************/ -/* Dual XML implementation base classes defines. */ +/* Dual XML implementation base classes defines. */ /******************************************************************/ #if !defined(BASE_BUFFER_SIZE) enum ElementType { // libxml2 @@ -43,7 +43,7 @@ enum NodeType { // MS DOM NODE_NOTATION = 12}; #endif // !NODE_TYPE_LIST -typedef class XMLDOCUMENT *PXDOC; // Document +typedef class XMLDOCUMENT *PXDOC; // Document typedef class XMLNODE *PXNODE; // Node (Element) typedef class XMLNODELIST *PXLIST; // Node list typedef class XMLATTRIBUTE *PXATTR; // Attribute @@ -93,9 +93,9 @@ class XMLDOCUMENT : public BLOCK { bool MakeNSlist(PGLOBAL g); // Members - PNS Namespaces; /* To the namespaces */ + PNS Namespaces; /* To the namespaces */ char *Encoding; /* The document encoding */ - char *Nslist; /* Namespace list */ + char *Nslist; /* Namespace list */ char *DefNs; /* Default namespace */ }; // end of class XMLDOCUMENT @@ -109,6 +109,7 @@ class XMLNODE : public BLOCK { virtual int GetType(void) = 0; virtual PXNODE GetNext(PGLOBAL) = 0; virtual PXNODE GetChild(PGLOBAL) = 0; + virtual int GetLen(void) {return Len;} // Methods virtual RCODE GetContent(PGLOBAL, char *, int) = 0; @@ -163,10 +164,12 @@ class XMLNODELIST : public BLOCK { class XMLATTRIBUTE : public BLOCK { public: // Properties -//virtual char *GetText(void) = 0; + virtual char *GetName(PGLOBAL) = 0; + virtual PXATTR GetNext(PGLOBAL) = 0; // Methods - virtual bool SetText(PGLOBAL, char *, int) = 0; + virtual RCODE GetText(PGLOBAL, char *, int) = 0; + virtual bool SetText(PGLOBAL, char *, int) = 0; protected: // Constructor diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index c6cbedd9636..47f825e965d 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -1,5 +1,5 @@ /************* RelDef CPP Program Source Code File (.CPP) **************/ -/* PROGRAM NAME: REFDEF */ +/* PROGRAM NAME: RELDEF */ /* ------------- */ /* Version 1.4 */ /* */ @@ -35,7 +35,6 @@ /***********************************************************************/ #include "global.h" #include "plgdbsem.h" -#include "mycat.h" #include "reldef.h" #include "colblk.h" #include "filamap.h" @@ -73,6 +72,14 @@ RELDEF::RELDEF(void) Hc = NULL; } // end of RELDEF constructor +/***********************************************************************/ +/* This function return a pointer to the Table Option Struct. */ +/***********************************************************************/ +PTOS RELDEF::GetTopt(void) + { + return Hc->GetTableOptionStruct(); + } // end of GetTopt + /***********************************************************************/ /* This function sets an integer table information. */ /***********************************************************************/ diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h index 6160ea71680..13bd392b706 100644 --- a/storage/connect/reldef.h +++ b/storage/connect/reldef.h @@ -12,6 +12,7 @@ #include "block.h" #include "catalog.h" #include "my_sys.h" +#include "mycat.h" typedef class INDEXDEF *PIXDEF; typedef class ha_connect *PHC; @@ -40,6 +41,7 @@ class DllExport RELDEF : public BLOCK { // Relation definition block void SetCat(PCATLG cat) { Cat=cat; } // Methods + PTOS GetTopt(void); bool GetBoolCatInfo(PSZ what, bool bdef); bool SetIntCatInfo(PSZ what, int ival); bool Partitioned(void); diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index af33adc69b0..4432f164cf8 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -19,7 +19,6 @@ #include "global.h" #include "plgdbsem.h" //#include "xtable.h" -//#include "mycat.h" // for FNC_COL #include "maputil.h" #include "filamtxt.h" #include "tabdos.h" @@ -32,7 +31,7 @@ #include "tabmul.h" #include "checklvl.h" #include "resource.h" -#include "mycat.h" +#include "mycat.h" // for FNC_COL /***********************************************************************/ /* This should be an option. */ @@ -45,140 +44,6 @@ /***********************************************************************/ USETEMP UseTemp(void); -/***********************************************************************/ -/* Make the document tree from a file. */ -/***********************************************************************/ -PJSON MakeJsonTree(PGLOBAL g, char *fn, char *objn, int pty, - PJAR& doc, DWORD& drc) -{ - char *p, *memory, *objpath, *key; - int len, i = 0; - HANDLE hFile; - MEMMAP mm; - PJSON jsp, top; - PJOB objp = NULL; - PJAR arp = NULL; - PJVAL val = NULL; - - /*********************************************************************/ - /* Create the mapping file object. */ - /*********************************************************************/ - hFile = CreateFileMap(g, fn, &mm, MODE_READ, false); - - if (hFile == INVALID_HANDLE_VALUE) { - drc = GetLastError(); - - if (!*g->Message) - sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int)drc, fn); - - return NULL; - } // endif hFile - - /*********************************************************************/ - /* Get the file size (assuming file is smaller than 4 GB) */ - /*********************************************************************/ - len = mm.lenL; - memory = (char *)mm.memory; - - if (!len) { // Empty file - CloseFileHandle(hFile); - CloseMemMap(memory, len); - drc = ENOENT; - return NULL; - } else if (!memory) { - sprintf(g->Message, MSG(MAP_VIEW_ERROR), fn, drc); - CloseFileHandle(hFile); - return NULL; - } // endif Memory - - CloseFileHandle(hFile); // Not used anymore - - /*********************************************************************/ - /* Parse the json file and allocate its tree structure. */ - /*********************************************************************/ - g->Message[0] = 0; - jsp = top = ParseJson(g, memory, len, pty); - CloseMemMap(memory, len); - drc = EBADF; - - if (!jsp && g->Message[0]) - return NULL; - - objpath = PlugDup(g, objn); // NULL if !objn - - /*********************************************************************/ - /* Find the table in the tree structure. */ - /*********************************************************************/ - for (doc = NULL; jsp && objpath; objpath = p) { - if ((p = strchr(objpath, ':'))) - *p++ = 0; - - if (*objpath != '[') { // objpass is a key - if (jsp->GetType() != TYPE_JOB) { - strcpy(g->Message, "Table path does no match json file"); - return NULL; - } // endif Type - - key = objpath; - objp = jsp->GetObject(); - arp = NULL; - val = objp->GetValue(key); - - if (!val || !(jsp = val->GetJson())) { - sprintf(g->Message, "Cannot find object key %s", key); - return NULL; - } // endif val - - } else if (objpath[strlen(objpath)-1] == ']') { - if (jsp->GetType() != TYPE_JAR) { - strcpy(g->Message, "Table path does no match json file"); - return NULL; - } // endif Type - - arp = jsp->GetArray(); - objp = NULL; - i = atoi(objpath+1) - 1; - val = arp->GetValue(i); - - if (!val) { - sprintf(g->Message, "Cannot find array value %d", i); - return NULL; - } // endif val - - } else { - sprintf(g->Message, "Invalid Table path %s", objn); - return NULL; - } // endif objpath - - jsp = val->GetJson(); - } // endfor objpath - - if (jsp && jsp->GetType() == TYPE_JAR) - doc = jsp->GetArray(); - else { - // The table is void or is just one object or one value - doc = new(g) JARRAY; - - if (val) { - doc->AddValue(g, val); - doc->InitArray(g); - } else if (jsp) { - doc->AddValue(g, new(g) JVALUE(jsp)); - doc->InitArray(g); - } // endif val - - if (objp) - objp->SetValue(g, new(g) JVALUE(doc), key); - else if (arp) - arp->SetValue(g, new(g) JVALUE(doc), i); - else - top = doc; - - } // endif jsp - - return top; -} // end of MakeJsonTree - typedef struct _jncol { struct _jncol *Next; char *Name; @@ -202,11 +67,9 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; - char filename[_MAX_PATH], colname[65], fmt[129], *buf; + char filename[_MAX_PATH], colname[65], fmt[129]; int i, j, n = 0; int ncol = sizeof(buftyp) / sizeof(int); - FILE *infile; - DWORD drc; PVAL valp; JCOL jcol; PJCL jcp, fjcp = NULL, pjcp = NULL; @@ -214,7 +77,9 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, PJSON jsp; PJVAL jvp; PJOB row; - PJAR doc; + PJDEF tdp; + TDBJSN *tjnp; + PJTDB tjsp; PQRYRES qrp; PCOLRES crp; @@ -235,43 +100,49 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, strcpy(g->Message, MSG(MISSING_FNAME)); return NULL; } else - PlugSetPath(filename, fn, dp); + PlugSetPath(filename, fn, dp); + + tdp = new(g) JSONDEF; + tdp->Database = dp; + tdp->Fn = filename; + tdp->Objname = objn; + tdp->Pretty = pretty; if (pretty == 2) { - if (!MakeJsonTree(g, filename, objn, pretty, doc, drc)) + tjsp = new(g) TDBJSON(tdp, new(g) MAPFAM(tdp)); + + if (tjsp->MakeDocument(g)) return NULL; - jsp = (doc) ? doc->GetValue(0) : NULL; + jsp = (tjsp->GetDoc()) ? tjsp->GetDoc()->GetValue(0) : NULL; } else { if (!lrecl) { sprintf(g->Message, "LRECL must be specified for pretty=%d", pretty); return NULL; - } else if (!(buf = (char*)PlugSubAlloc(g, NULL, lrecl))) { - sprintf(g->Message, "Alloc error, lrecl=%d", lrecl); - return NULL; - } // endif buf + } // endif lrecl - if (!(infile = global_fopen(g, MSGID_CANNOT_OPEN, filename, "r"))) + tdp->Lrecl = lrecl; + tdp->Ending = CRLF; + tjnp = new(g) TDBJSN(tdp, new(g) DOSFAM(tdp)); + tjnp->SetMode(MODE_READ); + + if (tjnp->OpenDB(g)) return NULL; - // Read first record - for (i = 0; i <= pretty; i++) - if (!fgets(buf, lrecl, infile)) { - if (feof(infile)) { - strcpy(g->Message, "Void json table"); - return NULL; - } // endif fgets + switch (tjnp->ReadDB(g)) { + case RC_EF: + strcpy(g->Message, "Void json table"); + case RC_FX: + goto err; + default: + jsp = tjnp->GetRow(); + } // endswitch ReadDB - sprintf(g->Message, MSG(READ_ERROR), filename, strerror(0)); - return NULL; - } // endif fgets - - jsp = ParseJson(g, buf, strlen(buf), pretty, NULL); - } // endif pretty + } // endif pretty if (!(row = (jsp) ? jsp->GetObject() : NULL)) { strcpy(g->Message, "Can only retrieve columns from object rows"); - return NULL; + goto err; } // endif row jcol.Next = NULL; @@ -394,20 +265,18 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, if (pretty != 2) { // Read next record - if (!fgets(buf, lrecl, infile)) { - if (!feof(infile)) { - sprintf(g->Message, MSG(READ_ERROR), filename, strerror(0)); - return NULL; - } else + switch (tjnp->ReadDB(g)) { + case RC_EF: jsp = NULL; - - } else if (pretty == 1 && strlen(buf) == 1 && *buf == ']') { - jsp = NULL; - } else - jsp = ParseJson(g, buf, strlen(buf), pretty, NULL); + break; + case RC_FX: + goto err; + default: + jsp = tjnp->GetRow(); + } // endswitch ReadDB } else - jsp = doc->GetValue(i); + jsp = tjsp->GetDoc()->GetValue(i); if (!(row = (jsp) ? jsp->GetObject() : NULL)) break; @@ -415,7 +284,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, } // endor i if (pretty != 2) - fclose(infile); + tjnp->CloseDB(g); skipit: if (trace) @@ -471,7 +340,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, err: if (pretty != 2) - fclose(infile); + tjnp->CloseDB(g); return NULL; } // end of JSONColumns @@ -487,6 +356,7 @@ JSONDEF::JSONDEF(void) Limit = 1; Level = 0; ReadMode = 0; + Strict = false; } // end of JSONDEF constructor /***********************************************************************/ @@ -540,7 +410,7 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) // Txfp must be set for TDBDOS tdbp = new(g) TDBJSN(this, txfp); } else { - txfp = new(g) DOSFAM(this); + txfp = new(g) MAPFAM(this); tdbp = new(g) TDBJSON(this, txfp); } // endif Pretty @@ -557,30 +427,45 @@ PTDB JSONDEF::GetTable(PGLOBAL g, MODE m) /***********************************************************************/ TDBJSN::TDBJSN(PJDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp) { + Top = NULL; Row = NULL; + Val = NULL; Colp = NULL; - Jmode = tdp->Jmode; - Xcol = tdp->Xcol; + + if (tdp) { + Jmode = tdp->Jmode; + Objname = tdp->Objname; + Xcol = tdp->Xcol; + Limit = tdp->Limit; + Pretty = tdp->Pretty; + Strict = tdp->Strict; + } else { + Jmode = MODE_OBJECT; + Objname = NULL; + Xcol = NULL; + Limit = 1; + Pretty = 0; + Strict = false; + } // endif tdp + Fpos = -1; -//Spos = 0; N = 0; - Limit = tdp->Limit; NextSame = 0; SameRow = 0; Xval = -1; - Pretty = tdp->Pretty; - Strict = tdp->Strict; Comma = false; } // end of TDBJSN standard constructor TDBJSN::TDBJSN(TDBJSN *tdbp) : TDBDOS(NULL, tdbp) { + Top = tdbp->Top; Row = tdbp->Row; + Val = tdbp->Val; Colp = tdbp->Colp; Jmode = tdbp->Jmode; + Objname = tdbp->Objname; Xcol = tdbp->Xcol; Fpos = tdbp->Fpos; -//Spos = tdbp->Spos; N = tdbp->N; Limit = tdbp->Limit; NextSame = tdbp->NextSame; @@ -658,6 +543,34 @@ int TDBJSN::GetMaxSize(PGLOBAL g) return MaxSize; } // end of GetMaxSize +/***********************************************************************/ +/* Find the row in the tree structure. */ +/***********************************************************************/ +PJSON TDBJSN::FindRow(PGLOBAL g) +{ + char *p, *objpath; + PJSON jsp = Row; + PJVAL val = NULL; + + for (objpath = PlugDup(g, Objname); jsp && objpath; objpath = p) { + if ((p = strchr(objpath, ':'))) + *p++ = 0; + + if (*objpath != '[') { // objpass is a key + val = (jsp->GetType() == TYPE_JOB) ? + jsp->GetObject()->GetValue(objpath) : NULL; + } else if (objpath[strlen(objpath)-1] == ']') { + val = (jsp->GetType() == TYPE_JAR) ? + jsp->GetArray()->GetValue(atoi(objpath+1) - 1) : NULL; + } else + val = NULL; + + jsp = (val) ? val->GetJson() : NULL; + } // endfor objpath + + return jsp; +} // end of FindRow + /***********************************************************************/ /* OpenDB: Data Base open routine for JSN access method. */ /***********************************************************************/ @@ -668,7 +581,6 @@ bool TDBJSN::OpenDB(PGLOBAL g) /* Table already open replace it at its beginning. */ /*******************************************************************/ Fpos= -1; -// Spos = 0; NextSame = 0; SameRow = 0; } else { @@ -743,6 +655,7 @@ int TDBJSN::ReadDB(PGLOBAL g) strlen(To_Line), Pretty, &Comma))) { rc = (Pretty == 1 && !strcmp(To_Line, "]")) ? RC_EF : RC_FX; } else { + Row = FindRow(g); SameRow = 0; Fpos++; rc = RC_OK; @@ -751,20 +664,86 @@ int TDBJSN::ReadDB(PGLOBAL g) return rc; } // end of ReadDB +/***********************************************************************/ +/* Make the top tree from the object path. */ +/***********************************************************************/ +int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) + { + if (Objname) { + if (!Val) { + // Parse and allocate Objname item(s) + char *p; + char *objpath = PlugDup(g, Objname); + int i; + PJOB objp; + PJAR arp; + PJVAL val = NULL; + + Top = NULL; + + for (; objpath; objpath = p) { + if ((p = strchr(objpath, ':'))) + *p++ = 0; + + if (*objpath != '[') { + objp = new(g) JOBJECT; + + if (!Top) + Top = objp; + + if (val) + val->SetValue(objp); + + val = new(g) JVALUE; + objp->SetValue(g, val, objpath); + } else if (objpath[strlen(objpath)-1] == ']') { + arp = new(g) JARRAY; + + if (!Top) + Top = arp; + + if (val) + val->SetValue(arp); + + val = new(g) JVALUE; + i = atoi(objpath+1) - 1; + arp->SetValue(g, val, i); + arp->InitArray(g); + } else { + sprintf(g->Message, "Invalid Table path %s", Objname); + return RC_FX; + } // endif objpath + + } // endfor p + + Val = val; + } // endif Val + + Val->SetValue(jsp); + } else + Top = jsp; + + return RC_OK; + } // end of MakeTopTree + /***********************************************************************/ /* PrepareWriting: Prepare the line for WriteDB. */ /***********************************************************************/ bool TDBJSN::PrepareWriting(PGLOBAL g) { - PSZ s = Serialize(g, Row, NULL, Pretty); + PSZ s; - if (s) { + if (MakeTopTree(g, Row)) + return true; + + if ((s = Serialize(g, Top, NULL, Pretty))) { if (Comma) strcat(s, ","); if ((signed)strlen(s) > Lrecl) { - sprintf(g->Message, "Line would be truncated (lrecl=%d)", Lrecl); - return true; + strncpy(To_Line, s, Lrecl); + sprintf(g->Message, "Line truncated (lrecl=%d)", Lrecl); + return PushWarning(g, this); } else strcpy(To_Line, s); @@ -1083,6 +1062,10 @@ void JSONCOL::ReadColumn(PGLOBAL g) if (!Tjp->SameRow || Xnod >= Tjp->SameRow) Value->SetValue_pval(GetColumnValue(g, Tjp->Row, 0)); + // Set null when applicable + if (Nullable) + Value->SetNull(Value->IsZero()); + } // end of ReadColumn /***********************************************************************/ @@ -1272,7 +1255,7 @@ PVAL JSONCOL::CalculateArray(PGLOBAL g, PJAR arp, int n) /***********************************************************************/ PJSON JSONCOL::GetRow(PGLOBAL g) { - PJVAL val; + PJVAL val = NULL; PJAR arp; PJSON nwr, row = Tjp->Row; @@ -1438,18 +1421,14 @@ void JSONCOL::WriteColumn(PGLOBAL g) /***********************************************************************/ TDBJSON::TDBJSON(PJDEF tdp, PTXF txfp) : TDBJSN(tdp, txfp) { - Top = NULL; Doc = NULL; - Objname = tdp->Objname; Multiple = tdp->Multiple; Done = Changed = false; } // end of TDBJSON standard constructor TDBJSON::TDBJSON(PJTDB tdbp) : TDBJSN(tdbp) { - Top = tdbp->Top; Doc = tdbp->Doc; - Objname = tdbp->Objname; Multiple = tdbp->Multiple; Done = tdbp->Done; Changed = tdbp->Changed; @@ -1473,64 +1452,17 @@ PTDB TDBJSON::CopyOne(PTABS t) } // end of CopyOne /***********************************************************************/ -/* Make the document tree from a file. */ +/* Make the document tree from the object path. */ /***********************************************************************/ int TDBJSON::MakeNewDoc(PGLOBAL g) { // Create a void table that will be populated Doc = new(g) JARRAY; - if (Objname) { - // Parse and allocate Objname item(s) - char *p; - char *objpath = (char*)PlugSubAlloc(g, NULL, strlen(Objname)+1); - int i; - PJOB objp; - PJAR arp; - PJVAL val = NULL; - - strcpy(objpath, Objname); - Top = NULL; - - for (; objpath; objpath = p) { - if ((p = strchr(objpath, ':'))) - *p++ = 0; - - if (*objpath != '[') { - objp = new(g) JOBJECT; - - if (!Top) - Top = objp; - - if (val) - val->SetValue(objp); - - val = new(g) JVALUE; - objp->SetValue(g, val, objpath); - } else if (objpath[strlen(objpath)-1] == ']') { - arp = new(g) JARRAY; - - if (!Top) - Top = arp; - - if (val) - val->SetValue(arp); - - val = new(g) JVALUE; - i = atoi(objpath+1) - 1; - arp->SetValue(g, val, i); - arp->InitArray(g); - } else { - sprintf(g->Message, "Invalid Table path %s", Objname); - return RC_FX; - } // endif objpath - - } // endfor p - - val->SetValue(Doc); - } else - Top = Doc; + if (MakeTopTree(g, Doc)) + return RC_FX; + Done = true; return RC_OK; } // end of MakeNewDoc @@ -1539,36 +1471,9 @@ int TDBJSON::MakeNewDoc(PGLOBAL g) /***********************************************************************/ int TDBJSON::MakeDocument(PGLOBAL g) { - char filename[_MAX_PATH]; - int rc = RC_OK; - DWORD drc; - - if (Done) - return RC_OK; - - // Now open the JSON file - PlugSetPath(filename, Txfp->To_File, GetPath()); - - /*********************************************************************/ - /* Get top of the parsed tree and the inside table document. */ - /*********************************************************************/ - if (!(Top = MakeJsonTree(g, filename, Objname, Pretty, Doc, drc))) - rc = (drc == ENOENT && Mode == MODE_INSERT) ? MakeNewDoc(g) : RC_FX; - - Done = (rc == RC_OK); - return rc; - } // end of MakeDocument - -#if 0 -/***********************************************************************/ -/* Make the document tree from a file. */ -/***********************************************************************/ -int TDBJSON::MakeDocument(PGLOBAL g) - { - char *p, *memory, *objpath, *key, filename[_MAX_PATH]; + char *p, *memory, *objpath, *key; int len, i = 0; - HANDLE hFile; - MEMMAP mm; + MODE mode = Mode; PJSON jsp; PJOB objp = NULL; PJAR arp = NULL; @@ -1576,61 +1481,33 @@ int TDBJSON::MakeDocument(PGLOBAL g) if (Done) return RC_OK; - else - Done = true; - // Now open the JSON file - PlugSetPath(filename, Txfp->To_File, GetPath()); + /*********************************************************************/ + /* Create the mapping file object in mode read. */ + /*********************************************************************/ + Mode = MODE_READ; - /*********************************************************************/ - /* Create the mapping file object. */ - /*********************************************************************/ - hFile = CreateFileMap(g, filename, &mm, MODE_READ, false); + if (!Txfp->OpenTableFile(g)) { + PFBLOCK fp = Txfp->GetTo_Fb(); - if (hFile == INVALID_HANDLE_VALUE) { - DWORD drc = GetLastError(); - - if (drc != ENOENT || Mode != MODE_INSERT) { - if (!(*g->Message)) - sprintf(g->Message, MSG(OPEN_MODE_ERROR), - "map", (int)drc, filename); - - return RC_FX; - } else + if (fp) { + len = fp->Length; + memory = fp->Memory; + } else { + Mode = mode; // Restore saved Mode return MakeNewDoc(g); + } // endif fp - } // endif hFile - - /*********************************************************************/ - /* Get the file size (assuming file is smaller than 4 GB) */ - /*********************************************************************/ - len = mm.lenL; - memory = (char *)mm.memory; - - if (!len) { // Empty file - CloseFileHandle(hFile); - CloseMemMap(memory, len); - - if (Mode == MODE_INSERT) - return MakeNewDoc(g); - - } // endif len - - if (!memory) { - CloseFileHandle(hFile); - sprintf(g->Message, MSG(MAP_VIEW_ERROR), filename, GetLastError()); + } else return RC_FX; - } // endif Memory - - CloseFileHandle(hFile); // Not used anymore - hFile = INVALID_HANDLE_VALUE; // For Fblock /*********************************************************************/ /* Parse the json file and allocate its tree structure. */ /*********************************************************************/ g->Message[0] = 0; jsp = Top = ParseJson(g, memory, len, Pretty); - CloseMemMap(memory, len); + Txfp->CloseTableFile(g, false); + Mode = mode; // Restore saved Mode if (!jsp && g->Message[0]) return RC_FX; @@ -1707,9 +1584,9 @@ int TDBJSON::MakeDocument(PGLOBAL g) } // endif jsp + Done = true; return RC_OK; } // end of MakeDocument -#endif // 0 /***********************************************************************/ /* JSON Cardinality: returns table size in number of rows. */ diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 20683a67971..7e9896c3b75 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -35,6 +35,8 @@ class JSONDEF : public DOSDEF { /* Table description */ friend class TDBJSON; friend class TDBJSN; friend class TDBJCL; + friend PQRYRES JSONColumns(PGLOBAL, char *, const char *, char *, + int, int, int, bool); public: // Constructor JSONDEF(void); @@ -71,29 +73,36 @@ class TDBJSN : public TDBDOS { TDBJSN(TDBJSN *tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_JSN;} - virtual bool SkipHeader(PGLOBAL g); - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSN(this);} + virtual AMT GetAmType(void) {return TYPE_AM_JSN;} + virtual bool SkipHeader(PGLOBAL g); + virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSN(this);} + PJSON GetRow(void) {return Row;} // Methods - virtual PTDB CopyOne(PTABS t); - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); - virtual int RowNumber(PGLOBAL g, bool b = FALSE) - {return (b) ? N : Fpos + 1;} + virtual PTDB CopyOne(PTABS t); + virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); + virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); + virtual int RowNumber(PGLOBAL g, bool b = FALSE) + {return (b) ? N : Fpos + 1;} // Database routines - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual bool PrepareWriting(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); + virtual int Cardinality(PGLOBAL g); + virtual int GetMaxSize(PGLOBAL g); + virtual bool OpenDB(PGLOBAL g); + virtual bool PrepareWriting(PGLOBAL g); + virtual int ReadDB(PGLOBAL g); protected: + PJSON FindRow(PGLOBAL g); + int MakeTopTree(PGLOBAL g, PJSON jsp); + // Members + PJSON Top; // The top JSON tree PJSON Row; // The current row + PJSON Val; // The value of the current row PJCOL Colp; // The multiple column JMODE Jmode; // MODE_OBJECT by default + char *Objname; // The table object name char *Xcol; // Name of expandable column int Fpos; // The current row index //int Spos; // DELETE start index @@ -168,6 +177,7 @@ class TDBJSON : public TDBJSN { // Implementation virtual AMT GetAmType(void) {return TYPE_AM_JSON;} virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSON(this);} + PJAR GetDoc(void) {return Doc;} // Methods virtual PTDB CopyOne(PTABS t); @@ -185,18 +195,16 @@ class TDBJSON : public TDBJSN { virtual int WriteDB(PGLOBAL g); virtual int DeleteDB(PGLOBAL g, int irc); virtual void CloseDB(PGLOBAL g); + int MakeDocument(PGLOBAL g); // Optimization routines virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add); protected: int MakeNewDoc(PGLOBAL g); - int MakeDocument(PGLOBAL g); // Members - PJSON Top; // The file JSON tree PJAR Doc; // The document array - char *Objname; // The table object name int Multiple; // 0: No 1: DIR 2: Section 3: filelist bool Done; // True when document parsing is done bool Changed; // After Update, Insert or Delete diff --git a/storage/connect/table.cpp b/storage/connect/table.cpp index cbd5910d8c8..d163c443cd5 100644 --- a/storage/connect/table.cpp +++ b/storage/connect/table.cpp @@ -587,6 +587,10 @@ CATCOL::CATCOL(PCOLDEF cdp, PTDB tdbp, int n) void CATCOL::ReadColumn(PGLOBAL g) { // Get the value of the Name or Description property - Value->SetValue_pvblk(Crp->Kdata, Tdbp->N); + if (Crp->Kdata) + Value->SetValue_pvblk(Crp->Kdata, Tdbp->N); + else + Value->Reset(); + } // end of ReadColumn diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index e4befc8bfde..66f275796b5 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -56,7 +56,6 @@ #include "xtable.h" #include "tabcol.h" #include "colblk.h" -#include "mycat.h" #include "reldef.h" #include "tabmysql.h" #include "valblk.h" diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index 5ef0ee52653..7f7b1c5d50c 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -47,7 +47,6 @@ #include "xtable.h" #include "tabmysql.h" #include "ha_connect.h" -#include "mycat.h" /***********************************************************************/ /* Prepare and count columns in the column list. */ diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index 4b333b2eb56..401ffa3780e 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -49,7 +49,6 @@ #include "tabpivot.h" #include "valblk.h" #include "ha_connect.h" -#include "mycat.h" // For GetHandler /***********************************************************************/ /* Make the Pivot table column list. */ diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 64a9a176cca..1ef70549751 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -72,7 +72,6 @@ #include "tabtbl.h" #include "tabmysql.h" #include "ha_connect.h" -#include "mycat.h" // For GetHandler #if defined(WIN32) #if defined(__BORLANDC__) diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index 6c4760e763f..1c238bcf6f2 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -43,7 +43,6 @@ #include "plgdbsem.h" #include "plgcnx.h" // For DB types #include "myutil.h" -#include "mycat.h" #include "valblk.h" #include "resource.h" #include "reldef.h" diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index 454210b6e6a..dffbaf6e187 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -53,7 +53,6 @@ #include "xtable.h" #include "tabmysql.h" #include "ha_connect.h" -#include "mycat.h" /* -------------- Implementation of the XCOL classes ---------------- */ diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 8c73907c7ee..8ea44fed2be 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -1,9 +1,9 @@ /************* Tabxml C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: TABXML */ /* ------------- */ -/* Version 2.7 */ +/* Version 2.8 */ /* */ -/* Author Olivier BERTRAND 2007 - 2014 */ +/* Author Olivier BERTRAND 2007 - 2015 */ /* */ /* This program are the XML tables classes using MS-DOM or libxml2. */ /***********************************************************************/ @@ -29,6 +29,7 @@ #include "osutil.h" #define _O_RDONLY O_RDONLY #endif // !WIN32 +#include "resource.h" // for IDS_COLUMNS #define INCLUDE_TDBXML #define NODE_TYPE_LIST @@ -44,6 +45,7 @@ #include "reldef.h" #include "xtable.h" #include "colblk.h" +#include "mycat.h" #include "xindex.h" #include "plgxml.h" #include "tabxml.h" @@ -57,6 +59,336 @@ extern "C" char version[]; #define XMLSUP "libxml2" #endif // !WIN32 +#define TYPE_UNKNOWN 12 /* Must be greater than other types */ + +/***********************************************************************/ +/* Class and structure used by XMLColumns. */ +/***********************************************************************/ +typedef class XMCOL *PXCL; + +class XMCOL : public BLOCK { + public: + // Constructors + XMCOL(void) {Next = NULL; + Name[0] = 0; + Fmt = NULL; + Type = 1; + Len = Scale = 0; + Cbn = false; + Found = true;} + XMCOL(PGLOBAL g, PXCL xp, char *fmt, int i) { + Next = NULL; + strcpy(Name, xp->Name); + Fmt = (*fmt) ? PlugDup(g, fmt) : NULL; + Type = xp->Type; + Len = xp->Len; + Scale = xp->Scale; + Cbn = (xp->Cbn || i > 1); + Found = true;} + + // Members + PXCL Next; + char Name[64]; + char *Fmt; + int Type; + int Len; + int Scale; + bool Cbn; + bool Found; +}; // end of class XMCOL + +typedef struct LVL { + PXNODE pn; + PXLIST nl; + PXATTR atp; + bool b; + long k; + int m, n; +} *PLVL; + +/***********************************************************************/ +/* XMLColumns: construct the result blocks containing the description */ +/* of all the columns of a table contained inside an XML file. */ +/***********************************************************************/ +PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) +{ + static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, + TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING}; + static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, + FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; + static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; + char *op, colname[65], fmt[129], buf[512]; + int i, j, lvl, rc, n = 0; + int ncol = sizeof(buftyp) / sizeof(int); + bool ok = true; + PXCL xcol, xcp, fxcp = NULL, pxcp = NULL; + PLVL *lvlp, vp; + PXNODE node = NULL; + PXMLDEF tdp; + PTDBXML txmp; + PQRYRES qrp; + PCOLRES crp; + + if (info) { + length[0] = 128; + length[7] = 256; + goto skipit; + } // endif info + + /*********************************************************************/ + /* Open the input file. */ + /*********************************************************************/ + if (!topt->filename) { + strcpy(g->Message, MSG(MISSING_FNAME)); + return NULL; + } else + lvl = atoi(GetListOption(g, "Level", topt->oplist, "0")); + + if (trace) + htrc("File %s lvl=%d\n", topt->filename, lvl); + + tdp = new(g) XMLDEF; + tdp->Database = dp; + tdp->Fn = (char*)topt->filename; + tdp->Tabname = tab; + + if (!(op = GetListOption(g, "Xmlsup", topt->oplist, NULL))) +#if defined(WIN32) + tdp->Usedom = true; +#else // !WIN32 + tdp->Usedom = false; +#endif // !WIN32 + else + tdp->Usedom = (toupper(*op) == 'M' || toupper(*op) == 'D'); + + txmp = new(g) TDBXML(tdp); + + if (txmp->Initialize(g)) + return NULL; + + xcol = new(g) XMCOL; + colname[64] = 0; + fmt[128] = 0; + lvlp = (PLVL*)PlugSubAlloc(g, NULL, sizeof(PLVL) * (lvl + 1)); + + for (j = 0; j <= lvl; j++) + lvlp[j] = (PLVL)PlugSubAlloc(g, NULL, sizeof(LVL)); + + /*********************************************************************/ + /* Analyse the XML tree and define columns. */ + /*********************************************************************/ + for (i = 1; ; i++) { + // Get next row + switch (txmp->ReadDB(g)) { + case RC_EF: + vp = NULL; + break; + case RC_FX: + goto err; + default: + vp = lvlp[0]; + vp->pn = txmp->RowNode; + vp->atp = vp->pn->GetAttribute(g, NULL); + vp->nl = vp->pn->GetChildElements(g); + vp->b = true; + vp->k = 0; + vp->m = vp->n = 0; + j = 0; + } // endswitch ReadDB + + if (!vp) + break; + + while (true) { + if (!vp->atp && + !(node = (vp->nl) ? vp->nl->GetItem(g, vp->k++, node) : NULL)) + if (j) { + vp = lvlp[--j]; + + if (!tdp->Usedom) // nl was destroyed + vp->nl = vp->pn->GetChildElements(g); + + if (!lvlp[j+1]->b) { + vp->k--; + ok = false; + } // endif b + + continue; + } else + break; + + xcol->Name[vp->n] = 0; + fmt[vp->m] = 0; + + more: + if (vp->atp) { + strncpy(colname, vp->atp->GetName(g), sizeof(colname)); + strncat(xcol->Name, colname, 64); + rc = vp->atp->GetText(g, buf, sizeof(buf)); + strncat(fmt, "@", sizeof(fmt)); + + if (j) + strncat(fmt, colname, sizeof(fmt)); + + } else { + if (tdp->Usedom && node->GetType() != 1) + continue; + + strncpy(colname, node->GetName(g), sizeof(colname)); + strncat(xcol->Name, colname, 64); + + if (j) + strncat(fmt, colname, sizeof(fmt)); + + if (j < lvl && ok) { + vp = lvlp[j+1]; + vp->k = 0; + vp->atp = node->GetAttribute(g, NULL); + vp->nl = node->GetChildElements(g); + + if (tdp->Usedom && vp->nl->GetLength() == 1) { + node = vp->nl->GetItem(g, 0, node); + vp->b = (node->GetType() == 1); // Must be ab element + } else + vp->b = (vp->nl && vp->nl->GetLength()); + + if (vp->atp || vp->b) { + if (!vp->atp) + node = vp->nl->GetItem(g, vp->k++, node); + + strncat(strncat(fmt, colname, 125), "/", 125); + strncat(xcol->Name, "_", 64); + j++; + vp->n = (int)strlen(xcol->Name); + vp->m = (int)strlen(fmt); + goto more; + } else { + vp = lvlp[j]; + + if (!tdp->Usedom) // nl was destroyed + vp->nl = vp->pn->GetChildElements(g); + + } // endif vp + + } else + ok = true; + + rc = node->GetContent(g, buf, sizeof(buf)); + } // endif atp; + + xcol->Len = strlen(buf); + + // Check whether this column was already found + for (xcp = fxcp; xcp; xcp = xcp->Next) + if (!strcmp(xcol->Name, xcp->Name)) + break; + + if (xcp) { + if (xcp->Type != xcol->Type) + xcp->Type = TYPE_STRING; + + if (*fmt && (!xcp->Fmt || strlen(xcp->Fmt) < strlen(fmt))) { + xcp->Fmt = PlugDup(g, fmt); + length[7] = MY_MAX(length[7], strlen(fmt)); + } // endif *fmt + + xcp->Len = MY_MAX(xcp->Len, xcol->Len); + xcp->Scale = MY_MAX(xcp->Scale, xcol->Scale); + xcp->Cbn |= xcol->Cbn; + xcp->Found = true; + } else { + // New column + xcp = new(g) XMCOL(g, xcol, fmt, i); + length[0] = MY_MAX(length[0], strlen(xcol->Name)); + length[7] = MY_MAX(length[7], strlen(fmt)); + + if (pxcp) { + xcp->Next = pxcp->Next; + pxcp->Next = xcp; + } else + fxcp = xcp; + + n++; + } // endif xcp + + pxcp = xcp; + +// for (j = lvl - 1; j >= 0; j--) +// if (jrp[j] && (jrp[j] = jrp[j]->GetNext())) +// goto more; + + if (vp->atp) + vp->atp = vp->atp->GetNext(g); + + } // endwhile + + // Missing column can be null + for (xcp = fxcp; xcp; xcp = xcp->Next) { + xcp->Cbn |= !xcp->Found; + xcp->Found = false; + } // endfor xcp + + } // endor i + + txmp->CloseDB(g); + + skipit: + if (trace) + htrc("CSVColumns: n=%d len=%d\n", n, length[0]); + + /*********************************************************************/ + /* Allocate the structures used to refer to the result set. */ + /*********************************************************************/ + qrp = PlgAllocResult(g, ncol, n, IDS_COLUMNS + 3, + buftyp, fldtyp, length, false, false); + + crp = qrp->Colresp->Next->Next->Next->Next->Next->Next; + crp->Name = "Nullable"; + crp->Next->Name = "Xpath"; + + if (info || !qrp) + return qrp; + + qrp->Nblin = n; + + /*********************************************************************/ + /* Now get the results into blocks. */ + /*********************************************************************/ + for (i = 0, xcp = fxcp; xcp; i++, xcp = xcp->Next) { + if (xcp->Type == TYPE_UNKNOWN) // Void column + xcp->Type = TYPE_STRING; + + crp = qrp->Colresp; // Column Name + crp->Kdata->SetValue(xcp->Name, i); + crp = crp->Next; // Data Type + crp->Kdata->SetValue(xcp->Type, i); + crp = crp->Next; // Type Name + crp->Kdata->SetValue(GetTypeName(xcp->Type), i); + crp = crp->Next; // Precision + crp->Kdata->SetValue(xcp->Len, i); + crp = crp->Next; // Length + crp->Kdata->SetValue(xcp->Len, i); + crp = crp->Next; // Scale (precision) + crp->Kdata->SetValue(xcp->Scale, i); + crp = crp->Next; // Nullable + crp->Kdata->SetValue(xcp->Cbn ? 1 : 0, i); + crp = crp->Next; // Field format + + if (crp->Kdata) + crp->Kdata->SetValue(xcp->Fmt, i); + + } // endfor i + + /*********************************************************************/ + /* Return the result pointer. */ + /*********************************************************************/ + return qrp; + +err: + txmp->CloseDB(g); + return NULL; + } // end of XMLColumns + /* -------------- Implementation of the XMLDEF class ---------------- */ /***********************************************************************/ @@ -176,6 +508,9 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ PTDB XMLDEF::GetTable(PGLOBAL g, MODE m) { + if (Catfunc == FNC_COL) + return new(g) TDBXCT(this); + PTDBASE tdbp = new(g) TDBXML(this); if (Multiple) @@ -229,14 +564,14 @@ TDBXML::TDBXML(PXMLDEF tdp) : TDBASE(tdp) Xfile = tdp->Fn; Enc = tdp->Encoding; Tabname = tdp->Tabname; - Rowname = (*tdp->Rowname) ? tdp->Rowname : NULL; - Colname = (*tdp->Colname) ? tdp->Colname : NULL; - Mulnode = (*tdp->Mulnode) ? tdp->Mulnode : NULL; - XmlDB = (*tdp->XmlDB) ? tdp->XmlDB : NULL; - Nslist = (*tdp->Nslist) ? tdp->Nslist : NULL; - DefNs = (*tdp->DefNs) ? tdp->DefNs : NULL; - Attrib = (*tdp->Attrib) ? tdp->Attrib : NULL; - Hdattr = (*tdp->Hdattr) ? tdp->Hdattr : NULL; + Rowname = (tdp->Rowname && *tdp->Rowname) ? tdp->Rowname : NULL; + Colname = (tdp->Colname && *tdp->Colname) ? tdp->Colname : NULL; + Mulnode = (tdp->Mulnode && *tdp->Mulnode) ? tdp->Mulnode : NULL; + XmlDB = (tdp->XmlDB && *tdp->XmlDB) ? tdp->XmlDB : NULL; + Nslist = (tdp->Nslist && *tdp->Nslist) ? tdp->Nslist : NULL; + DefNs = (tdp->DefNs && *tdp->DefNs) ? tdp->DefNs : NULL; + Attrib = (tdp->Attrib && *tdp->Attrib) ? tdp->Attrib : NULL; + Hdattr = (tdp->Hdattr && *tdp->Hdattr) ? tdp->Hdattr : NULL; Coltype = tdp->Coltype; Limit = tdp->Limit; Xpand = tdp->Xpand; @@ -771,7 +1106,6 @@ bool TDBXML::OpenDB(PGLOBAL g) NewRow = (Mode == MODE_INSERT); Nsub = 0; Use = USE_OPEN; // Do it now in case we are recursively called - return false; } // end of OpenDB @@ -1847,4 +2181,24 @@ void XPOSCOL::WriteColumn(PGLOBAL g) } // end of WriteColumn +/* ---------------------------TDBXCT class --------------------------- */ + +/***********************************************************************/ +/* TDBXCT class constructor. */ +/***********************************************************************/ +TDBXCT::TDBXCT(PXMLDEF tdp) : TDBCAT(tdp) + { + Topt = tdp->GetTopt(); + Dp = tdp->GetPath(); + Tabn = tdp->Tabname; + } // end of TDBXCT constructor + +/***********************************************************************/ +/* GetResult: Get the list the JSON file columns. */ +/***********************************************************************/ +PQRYRES TDBXCT::GetResult(PGLOBAL g) + { + return XMLColumns(g, Dp, Tabn, Topt, false); + } // end of GetResult + /* ------------------------ End of Tabxml ---------------------------- */ diff --git a/storage/connect/tabxml.h b/storage/connect/tabxml.h index a3dc0a2b54c..f6cfd3fb510 100644 --- a/storage/connect/tabxml.h +++ b/storage/connect/tabxml.h @@ -16,6 +16,8 @@ typedef class XMLCOL *PXMLCOL; /***********************************************************************/ class DllExport XMLDEF : public TABDEF { /* Logical table description */ friend class TDBXML; + friend class TDBXCT; + friend PQRYRES XMLColumns(PGLOBAL, char*, char*, PTOS, bool); public: // Constructor XMLDEF(void); @@ -55,6 +57,7 @@ class DllExport TDBXML : public TDBASE { friend class XMLCOL; friend class XMULCOL; friend class XPOSCOL; + friend PQRYRES XMLColumns(PGLOBAL, char*, char*, PTOS, bool); public: // Constructor TDBXML(PXMLDEF tdp); @@ -237,4 +240,24 @@ class XPOSCOL : public XMLCOLX { virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); }; // end of class XPOSCOL + +/***********************************************************************/ +/* This is the class declaration for the XML catalog table. */ +/***********************************************************************/ +class TDBXCT : public TDBCAT { + public: + // Constructor + TDBXCT(PXMLDEF tdp); + + protected: + // Specific routines + virtual PQRYRES GetResult(PGLOBAL g); + + // Members + PTOS Topt; + char *Dp; +//const char *Fn; + char *Tabn; + }; // end of class TDBXCT + #endif // INCLUDE_TDBXML From 6dda9e04faf682e617242f4771e7b88c89bd64d4 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 1 May 2015 18:53:50 +0200 Subject: [PATCH 07/39] Same as last 10.0 commit --- storage/connect/global.h | 2 +- storage/connect/ha_connect.cc | 62 +++++++------------ .../connect/mysql-test/connect/r/json.result | 12 ++-- storage/connect/tabjson.cpp | 21 ++++++- storage/connect/tabjson.h | 3 +- storage/connect/tabmul.cpp | 6 +- storage/connect/tabtbl.cpp | 2 +- storage/connect/tabutil.cpp | 7 --- storage/connect/value.cpp | 2 +- 9 files changed, 57 insertions(+), 60 deletions(-) diff --git a/storage/connect/global.h b/storage/connect/global.h index a67bb605755..10564d09815 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -118,7 +118,7 @@ extern "C" { /* Static variables */ /***********************************************************************/ #if defined(STORAGE) - char sys_stamp[4] = SYS_STAMP; + char sys_stamp[5] = SYS_STAMP; #else extern char sys_stamp[]; #endif diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index a3f88bfe7eb..8b1ca3519ee 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -168,35 +168,21 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.03.0006 April 12, 2015"; - + char version[]= "Version 1.03.0007 April 30, 2015"; #if defined(WIN32) - char compver[]= "Version 1.03.0006 " __DATE__ " " __TIME__; + char compver[]= "Version 1.03.0007 " __DATE__ " " __TIME__; char slash= '\\'; #else // !WIN32 char slash= '/'; #endif // !WIN32 - -// int trace= 0; // The general trace value -// ulong xconv= 0; // The type conversion option -// int zconv= 0; // The text conversion size } // extern "C" #if defined(XMAP) my_bool xmap= false; #endif // XMAP -// uint worksize= 0; ulong ha_connect::num= 0; -//int DTVAL::Shift= 0; -/* CONNECT system variables */ -//atic int conv_size= 0; -//atic uint work_size= 0; -//atic ulong type_conv= 0; -#if defined(XMAP) -//atic my_bool indx_map= 0; -#endif // XMAP #if defined(XMSG) extern "C" { char *msg_path; @@ -613,9 +599,9 @@ DllExport LPCSTR PlugSetPath(LPSTR to, LPCSTR name, LPCSTR dir) delete_table method in handler.cc */ static const char *ha_connect_exts[]= { - ".dos", ".fix", ".csv", ".bin", ".fmt", ".dbf", ".xml", ".ini", ".vec", - ".dnx", ".fnx", ".bnx", ".vnx", ".dbx", ".dop", ".fop", ".bop", ".vop", - NULL}; + ".dos", ".fix", ".csv", ".bin", ".fmt", ".dbf", ".xml", ".json", ".ini", + ".vec", ".dnx", ".fnx", ".bnx", ".vnx", ".dbx", ".dop", ".fop", ".bop", + ".vop", NULL}; /** @brief @@ -4730,6 +4716,25 @@ ha_rows ha_connect::records_in_range(uint inx, key_range *min_key, DBUG_RETURN(rows); } // end of records_in_range +// Used to check whether a MYSQL table is created on itself +bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, + const char *db, char *tab, const char *src, int port) +{ + if (src) + return false; + else if (host && stricmp(host, "localhost") && strcmp(host, "127.0.0.1")) + return false; + else if (db && stricmp(db, s->db.str)) + return false; + else if (tab && stricmp(tab, s->table_name.str)) + return false; + else if (port && port != (signed)GetDefaultPort()) + return false; + + strcpy(g->Message, "This MySQL table is defined on itself"); + return true; +} // end of CheckSelf + /** Convert an ISO-8859-1 column name to UTF-8 */ @@ -4933,25 +4938,6 @@ static int init_table_share(THD* thd, sql->ptr(), sql->length()); } // end of init_table_share -// Used to check whether a MYSQL table is created on itself -bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, - const char *db, char *tab, const char *src, int port) -{ - if (src) - return false; - else if (host && stricmp(host, "localhost") && strcmp(host, "127.0.0.1")) - return false; - else if (db && stricmp(db, s->db.str)) - return false; - else if (tab && stricmp(tab, s->table_name.str)) - return false; - else if (port && port != (signed)GetDefaultPort()) - return false; - - strcpy(g->Message, "This MySQL table is defined on itself"); - return true; -} // end of CheckSelf - /** @brief connect_assisted_discovery() is called when creating a table with no columns. diff --git a/storage/connect/mysql-test/connect/r/json.result b/storage/connect/mysql-test/connect/r/json.result index fa6497e5bba..80b0a2cbc18 100644 --- a/storage/connect/mysql-test/connect/r/json.result +++ b/storage/connect/mysql-test/connect/r/json.result @@ -89,8 +89,8 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; SELECT * FROM t1 WHERE ISBN = '9782212090819'; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Philippe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications Philippe Knab Construire une application XML NULL NULL Eyrolles Paris 1999 # # To add an author a new table must be created # @@ -104,8 +104,8 @@ William J. Pardi INSERT INTO t2 VALUES('Charles','Dickens'); SELECT * FROM t1; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Philippe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications Philippe Knab Construire une application XML NULL NULL Eyrolles Paris 1999 9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 9782840825685 fr applications Charles Dickens XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 DROP TABLE t1; @@ -127,11 +127,11 @@ line "SUBJECT": "applications", "AUTHOR": [ { - "FIRSTNAME": "Philippe", + "FIRSTNAME": "Jean-Christophe", "LASTNAME": "Bernadac" }, { - "FIRSTNAME": "François", + "FIRSTNAME": "Philippe", "LASTNAME": "Knab" } ], diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 4432f164cf8..0231b369fc1 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -968,6 +968,20 @@ bool JSONCOL::ParseJpath(PGLOBAL g) else if (!Jpath) Jpath = Name; + if (To_Tdb->GetOrig()) { + // This is an updated column, get nodes from origin + for (PJCOL colp = (PJCOL)Tjp->GetColumns(); colp; + colp = (PJCOL)colp->GetNext()) + if (!stricmp(Name, colp->GetName())) { + Nod = colp->Nod; + Nodes = colp->Nodes; + goto fin; + } // endif Name + + sprintf(g->Message, "Cannot parse updated column %s", Name); + return true; + } // endif To_Orig + pbuf = PlugDup(g, Jpath); // The Jpath must be analyzed @@ -998,6 +1012,7 @@ bool JSONCOL::ParseJpath(PGLOBAL g) } // endfor i, p + fin: MulVal = AllocateValue(g, Value); Parsed = true; return false; @@ -1147,7 +1162,7 @@ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n) ars = MY_MIN(Tjp->Limit, arp->size()); - if (!(jvp = arp->GetValue(Nodes[n].Nx))) { + if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) { strcpy(g->Message, "Logical error expanding array"); longjmp(g->jumper[g->jump_level], 666); } // endif jvp @@ -1278,7 +1293,7 @@ PJSON JSONCOL::GetRow(PGLOBAL g) if (Nodes[i].Rank) val = arp->GetValue(Nodes[i].Rank - 1); else - val = arp->GetValue(Nodes[i].Nx); + val = arp->GetValue(Nodes[i].Rx); } else val = NULL; @@ -1726,7 +1741,7 @@ bool TDBJSON::OpenDB(PGLOBAL g) /***********************************************************************/ int TDBJSON::ReadDB(PGLOBAL g) { - int rc; + int rc; N++; diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 7e9896c3b75..10b9a9a9cc3 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -25,7 +25,8 @@ typedef struct _jnode { PVAL CncVal; // To cont value used for OP_CNC PVAL Valp; // The internal array VALUE int Rank; // The rank in array - int Nx; // Same row number + int Rx; // Read row number + int Nx; // Next to read row number } JNODE, *PJNODE; /***********************************************************************/ diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 36f3fc73210..94950584c9b 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -171,8 +171,10 @@ bool TDBMUL::InitFileNames(PGLOBAL g) } // endif hSearch while (n < PFNZ) { - strcat(strcat(strcpy(filename, drive), direc), FileData.cFileName); - pfn[n++] = PlugDup(g, filename); + if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + strcat(strcat(strcpy(filename, drive), direc), FileData.cFileName); + pfn[n++] = PlugDup(g, filename); + } // endif dwFileAttributes if (!FindNextFile(hSearch, &FileData)) { rc = GetLastError(); diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 1ef70549751..2bf26a5f183 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to PlugDB Software Development 2008-2014 */ +/* (C) Copyright to PlugDB Software Development 2008-2015 */ /* Author: Olivier BERTRAND */ /* */ /* WHAT THIS PROGRAM DOES: */ diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index 1c238bcf6f2..c26d766af01 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -52,7 +52,6 @@ #include "tabutil.h" #include "ha_connect.h" -//extern "C" int zconv; int GetConvSize(void); /************************************************************************/ @@ -72,11 +71,8 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db, { char key[256]; uint k; -//TABLE_LIST table_list; TABLE_SHARE *s; -//table_list.init_one_table(db, strlen(db), name, strlen(name), -// NULL, TL_IGNORE); k = sprintf(key, "%s", db) + 1; k += sprintf(key + k, "%s", name); key[++k] = 0; @@ -86,9 +82,6 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db, return NULL; } // endif s -// 1 2 4 8 -//flags = GTS_TABLE | GTS_VIEW | GTS_NOLOCK | GTS_FORCE_DISCOVERY; - if (!open_table_def(thd, s, GTS_TABLE | GTS_VIEW)) { if (!s->is_view) { if (stricmp(plugin_name(s->db_plugin)->str, "connect")) diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 7d3d5463129..d14fc367cc7 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -1,7 +1,7 @@ /************* Value C++ Functions Source Code File (.CPP) *************/ /* Name: VALUE.CPP Version 2.5 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2001-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2001-2015 */ /* */ /* This file contains the VALUE and derived classes family functions. */ /* These classes contain values of different types. They are used so */ From 13c0a6067738265c50b03958e497a3ab0e881b78 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 2 May 2015 15:49:02 +0200 Subject: [PATCH 08/39] Fix MDEV-8090 in tabmysql.cpp --- storage/connect/tabmysql.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 66f275796b5..b18e4da2ec4 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -1060,9 +1060,16 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len) int oldlen = Query->GetLength(); if (!key || op == OP_NEXT || - Mode == MODE_UPDATE || Mode == MODE_DELETE) + Mode == MODE_UPDATE || Mode == MODE_DELETE) { + if (!key && Mode == MODE_READX) { + // This is a false indexed read + m_Rc = Myc.ExecSQL(g, Query->GetStr()); + Mode = MODE_READ; + return (m_Rc == RC_FX) ? true : false; + } // endif key + return false; - else if (op == OP_FIRST) { + } else if (op == OP_FIRST) { if (To_CondFil) { oom = Query->Append(" WHERE "); From 1db5b849ab59cb631eb3ab5e1130be08c4fa4a92 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 5 May 2015 18:38:54 +0200 Subject: [PATCH 09/39] - Fix a regression bug on (XML) HTML tables. modified: tabxml.cpp added: xml_html.test xml_html.result beers.xml coffee.htm - Fix MDEV-7935 by suppressing error resetting code in delete_or_rename_table. However, the issue is that this code was added because without it an assertion was raised in some cases. Unfortunately I can't remember what were these cases. Therefore fixing it in this case will perhaps make a new crash happening on another cases. modified: ha_connect.cc - Add the UDF Json_Array_Delete. modified: jsonudf.cpp --- storage/connect/ha_connect.cc | 9 +- storage/connect/jsonudf.cpp | 94 ++++++++++++++++--- .../mysql-test/connect/r/xml_html.result | 32 +++++++ .../mysql-test/connect/std_data/beers.xml | 16 ++++ .../mysql-test/connect/std_data/coffee.htm | 24 +++++ .../mysql-test/connect/t/xml_html.test | 39 ++++++++ storage/connect/tabxml.cpp | 5 +- 7 files changed, 201 insertions(+), 18 deletions(-) create mode 100644 storage/connect/mysql-test/connect/r/xml_html.result create mode 100644 storage/connect/mysql-test/connect/std_data/beers.xml create mode 100644 storage/connect/mysql-test/connect/std_data/coffee.htm create mode 100644 storage/connect/mysql-test/connect/t/xml_html.test diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 8b1ca3519ee..765c04bd2be 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -4632,8 +4632,13 @@ int ha_connect::delete_or_rename_table(const char *name, const char *to) } // endif pos - } else // Avoid infamous DBUG_ASSERT - thd->get_stmt_da()->reset_diagnostics_area(); + } // endif open_table_def + +// This below was done to avoid DBUG_ASSERT in some case that +// we don't know anymore what they were. It was suppressed because +// it did cause assertion in other cases (see MDEV-7935) +// } else // Avoid infamous DBUG_ASSERT +// thd->get_stmt_da()->reset_diagnostics_area(); free_table_share(share); } else // Temporary file diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 194cb6defd6..1afd79bec05 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -17,40 +17,45 @@ #include "json.h" #define MEMFIX 512 +#define UDF_EXEC_ARGS \ + UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* uint GetJsonGrpSize(void); extern "C" { DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Value(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Value(UDF_EXEC_ARGS); DllExport void Json_Value_deinit(UDF_INIT*); + DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Array(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Array(UDF_EXEC_ARGS); DllExport void Json_Array_deinit(UDF_INIT*); + DllExport my_bool Json_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Array_Add(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Array_Add(UDF_EXEC_ARGS); DllExport void Json_Array_Add_deinit(UDF_INIT*); + +DllExport my_bool Json_Array_Delete_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport char *Json_Array_Delete(UDF_EXEC_ARGS); +DllExport void Json_Array_Delete_deinit(UDF_INIT*); + DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Object(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Object(UDF_EXEC_ARGS); DllExport void Json_Object_deinit(UDF_INIT*); + DllExport my_bool Json_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Object_Nonull(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Object_Nonull(UDF_EXEC_ARGS); DllExport void Json_Object_Nonull_deinit(UDF_INIT*); + DllExport my_bool Json_Array_Grp_init(UDF_INIT*, UDF_ARGS*, char*); DllExport void Json_Array_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); -DllExport char *Json_Array_Grp(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Array_Grp(UDF_EXEC_ARGS); DllExport void Json_Array_Grp_clear(UDF_INIT *, char *, char *); DllExport void Json_Array_Grp_deinit(UDF_INIT*); + DllExport my_bool Json_Object_Grp_init(UDF_INIT*, UDF_ARGS*, char*); DllExport void Json_Object_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); -DllExport char *Json_Object_Grp(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Object_Grp(UDF_EXEC_ARGS); DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *); DllExport void Json_Object_Grp_deinit(UDF_INIT*); } // extern "C" @@ -404,6 +409,67 @@ void Json_Array_Add_deinit(UDF_INIT* initid) PlugExit((PGLOBAL)initid->ptr); } // end of Json_Array_Add_deinit +/***********************************************************************/ +/* Add values to a Json array. */ +/***********************************************************************/ +my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count != 2) { + strcpy(message, "Json_Value_Delete must have 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Json_Value_Delete first argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, message, reslen, memlen); +} // end of Json_Array_Delete_init + +char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *str; + int n; + PJVAL jvp; + PJAR arp; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + jvp = MakeValue(g, args, 0); + + if (jvp->GetValType() != TYPE_JAR) { + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, + "First argument is not an array"); + str = args->args[0]; + } else if (args->arg_type[1] != INT_RESULT) { + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, + "Second argument is not an integer"); + str = args->args[0]; + } else { + n = *(int*)args->args[1]; + arp = jvp->GetArray(); + arp->DeleteValue(n - 1); + arp->InitArray(g); + + if (!(str = Serialize(g, arp, NULL, 0))) { + str = strcpy(result, g->Message); + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, str); + } // endif str + + } // endif's + + *res_length = strlen(str); + return str; +} // end of Json_Array_Delete + +void Json_Array_Delete_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Array_Delete_deinit + /***********************************************************************/ /* Make a Json Oject containing all the parameters. */ /***********************************************************************/ diff --git a/storage/connect/mysql-test/connect/r/xml_html.result b/storage/connect/mysql-test/connect/r/xml_html.result new file mode 100644 index 00000000000..7b5e0febe6e --- /dev/null +++ b/storage/connect/mysql-test/connect/r/xml_html.result @@ -0,0 +1,32 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +SET NAMES utf8; +# +# Testing HTML like XML file +# +CREATE TABLE beers ( +`Name` CHAR(16) FIELD_FORMAT='brandName', +`Origin` CHAR(16) FIELD_FORMAT='origin', +`Description` CHAR(32) FIELD_FORMAT='details') +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' +TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; +SELECT * FROM beers; +Name Origin Description +Huntsman Bath, UK Wonderful hop, light alcohol +Tuborg Danmark In small bottles +DROP TABLE beers; +# +# Testing HTML file +# +CREATE TABLE coffee ( +`Name` CHAR(16), +`Cups` INT(8), +`Type` CHAR(16), +`Sugar` CHAR(4)) +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' +TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; +SELECT * FROM coffee; +Name Cups Type Sugar +T. Sexton 10 Espresso No +J. Dinnen 5 Decaf Yes +DROP TABLE coffee; diff --git a/storage/connect/mysql-test/connect/std_data/beers.xml b/storage/connect/mysql-test/connect/std_data/beers.xml new file mode 100644 index 00000000000..1abc77fe0f9 --- /dev/null +++ b/storage/connect/mysql-test/connect/std_data/beers.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + +
NameOriginDescription
HuntsmanBath, UK
Wonderful hop, light alcohol
TuborgDanmark
In small bottles
+
diff --git a/storage/connect/mysql-test/connect/std_data/coffee.htm b/storage/connect/mysql-test/connect/std_data/coffee.htm new file mode 100644 index 00000000000..95a23d5c0ad --- /dev/null +++ b/storage/connect/mysql-test/connect/std_data/coffee.htm @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + +
Cups of coffee consumed by each senator
NameCupsType of CoffeeSugar?
T. Sexton10EspressoNo
J. Dinnen5DecafYes
+ diff --git a/storage/connect/mysql-test/connect/t/xml_html.test b/storage/connect/mysql-test/connect/t/xml_html.test new file mode 100644 index 00000000000..1c84b46ec38 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/xml_html.test @@ -0,0 +1,39 @@ +--source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +SET NAMES utf8; + +--copy_file $MTR_SUITE_DIR/std_data/beers.xml $MYSQLD_DATADIR/test/beers.xml +--copy_file $MTR_SUITE_DIR/std_data/coffee.htm $MYSQLD_DATADIR/test/coffee.htm + +--echo # +--echo # Testing HTML like XML file +--echo # +CREATE TABLE beers ( +`Name` CHAR(16) FIELD_FORMAT='brandName', +`Origin` CHAR(16) FIELD_FORMAT='origin', +`Description` CHAR(32) FIELD_FORMAT='details') +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' +TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; +SELECT * FROM beers; +DROP TABLE beers; + +--echo # +--echo # Testing HTML file +--echo # +CREATE TABLE coffee ( +`Name` CHAR(16), +`Cups` INT(8), +`Type` CHAR(16), +`Sugar` CHAR(4)) +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' +TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; +SELECT * FROM coffee; +DROP TABLE coffee; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/beers.xml +--remove_file $MYSQLD_DATADIR/test/coffee.htm diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 8ea44fed2be..1c1ff8a2ffe 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -1505,8 +1505,9 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode) } else if (Type == 2) { // HTML like table, columns are retrieved by position new(this) XPOSCOL(Value); // Change the class of this column - Tdbp->Hasnod = true; - return false; + Inod = -1; +// Tdbp->Hasnod = true; +// return false; } else if (Type == 0 && !mode) { strcat(strcat(pbuf, "@"), Name); } else { // Type == 1 From 9dee994d992b3930f0d29197aed82771bf910c47 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 10 May 2015 11:58:23 +0200 Subject: [PATCH 10/39] Get rid of GCC warnings about unused parameters modified: storage/connect/array.cpp modified: storage/connect/blkfil.cpp modified: storage/connect/block.h modified: storage/connect/catalog.h modified: storage/connect/colblk.cpp modified: storage/connect/colblk.h modified: storage/connect/connect.cc modified: storage/connect/filamap.cpp modified: storage/connect/filamdbf.cpp modified: storage/connect/filamfix.cpp modified: storage/connect/filamtxt.cpp modified: storage/connect/filamtxt.h modified: storage/connect/filamvct.cpp modified: storage/connect/filamzip.cpp modified: storage/connect/filter.h modified: storage/connect/ha_connect.c modified: storage/connect/jsonudf.cpp modified: storage/connect/mycat.h modified: storage/connect/myconn.cpp modified: storage/connect/plgdbutl.cpp modified: storage/connect/reldef.cpp modified: storage/connect/reldef.h modified: storage/connect/tabcol.cpp modified: storage/connect/tabdos.cpp modified: storage/connect/tabdos.h modified: storage/connect/tabfix.cpp modified: storage/connect/tabfmt.cpp modified: storage/connect/tabfmt.h modified: storage/connect/tabjson.cpp modified: storage/connect/tabjson.h modified: storage/connect/table.cpp modified: storage/connect/tabmul.cpp modified: storage/connect/tabmysql.cpp modified: storage/connect/tabmysql.h modified: storage/connect/taboccur.cpp modified: storage/connect/tabpivot.cpp modified: storage/connect/tabsys.cpp modified: storage/connect/tabtbl.cpp modified: storage/connect/tabtbl.h modified: storage/connect/tabutil.cpp modified: storage/connect/tabutil.h modified: storage/connect/tabvct.cpp modified: storage/connect/tabvir.cpp modified: storage/connect/tabvir.h modified: storage/connect/tabxcl.cpp modified: storage/connect/tabxcl.h modified: storage/connect/tabxml.cpp modified: storage/connect/tabxml.h modified: storage/connect/valblk.cpp modified: storage/connect/valblk.h modified: storage/connect/value.cpp modified: storage/connect/value.h modified: storage/connect/xindex.cpp modified: storage/connect/xindex.h modified: storage/connect/xobject.h modified: storage/connect/xtable.h --- storage/connect/array.cpp | 10 +- storage/connect/blkfil.cpp | 22 +- storage/connect/block.h | 2 +- storage/connect/catalog.h | 48 +- storage/connect/colblk.cpp | 834 +++++++++--------- storage/connect/colblk.h | 6 +- storage/connect/connect.cc | 4 +- storage/connect/filamap.cpp | 14 +- storage/connect/filamdbf.cpp | 31 +- storage/connect/filamfix.cpp | 7 +- storage/connect/filamtxt.cpp | 12 +- storage/connect/filamtxt.h | 4 +- storage/connect/filamvct.cpp | 16 +- storage/connect/filamzip.cpp | 22 +- storage/connect/filter.h | 4 +- storage/connect/ha_connect.cc | 45 +- storage/connect/jsonudf.cpp | 30 +- storage/connect/mycat.cc | 8 +- storage/connect/mycat.h | 4 +- storage/connect/myconn.cpp | 4 +- .../mysql-test/connect/r/xml_html.result | 14 +- storage/connect/plgdbutl.cpp | 2 +- storage/connect/reldef.cpp | 4 +- storage/connect/reldef.h | 4 +- storage/connect/tabcol.cpp | 8 +- storage/connect/tabdos.cpp | 25 +- storage/connect/tabdos.h | 12 +- storage/connect/tabfix.cpp | 4 +- storage/connect/tabfmt.cpp | 6 +- storage/connect/tabfmt.h | 4 +- storage/connect/tabjson.cpp | 18 +- storage/connect/tabjson.h | 2 +- storage/connect/table.cpp | 28 +- storage/connect/tabmul.cpp | 12 +- storage/connect/tabmysql.cpp | 24 +- storage/connect/tabmysql.h | 8 +- storage/connect/taboccur.cpp | 6 +- storage/connect/tabpivot.cpp | 8 +- storage/connect/tabsys.cpp | 56 +- storage/connect/tabtbl.cpp | 8 +- storage/connect/tabtbl.h | 2 +- storage/connect/tabutil.cpp | 8 +- storage/connect/tabutil.h | 4 +- storage/connect/tabvct.cpp | 8 +- storage/connect/tabvir.cpp | 12 +- storage/connect/tabvir.h | 2 +- storage/connect/tabxcl.cpp | 8 +- storage/connect/tabxcl.h | 2 +- storage/connect/tabxml.cpp | 74 +- storage/connect/tabxml.h | 2 +- storage/connect/user_connect.cc | 6 +- storage/connect/user_connect.h | 2 +- storage/connect/valblk.cpp | 6 +- storage/connect/valblk.h | 26 +- storage/connect/value.cpp | 18 +- storage/connect/value.h | 32 +- storage/connect/xindex.cpp | 40 +- storage/connect/xindex.h | 23 +- storage/connect/xobject.h | 4 +- storage/connect/xtable.h | 26 +- 60 files changed, 818 insertions(+), 867 deletions(-) diff --git a/storage/connect/array.cpp b/storage/connect/array.cpp index a2f537436c9..0e8829d66a6 100644 --- a/storage/connect/array.cpp +++ b/storage/connect/array.cpp @@ -1,7 +1,7 @@ /************* Array C++ Functions Source Code File (.CPP) *************/ /* Name: ARRAY.CPP Version 2.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* This file contains the XOBJECT derived class ARRAY functions. */ /* ARRAY is used for elaborate type of processing, such as sorting */ @@ -186,7 +186,7 @@ ARRAY::ARRAY(PGLOBAL g, int type, int size, int length, int prec) // The error message was built by PlgDBalloc Type = TYPE_ERROR; else if (type != TYPE_PCHAR) - Value = AllocateValue(g, type, Len, prec, NULL); + Value = AllocateValue(g, type, Len, prec); Constant = TRUE; } // end of ARRAY constructor @@ -610,7 +610,7 @@ int ARRAY::Convert(PGLOBAL g, int k, PVAL vp) // The error message was built by PlgDBalloc return TYPE_ERROR; else - Value = AllocateValue(g, Type, Len, prec, NULL); + Value = AllocateValue(g, Type, Len, prec); /*********************************************************************/ /* Converting STRING to DATE can be done according to date format. */ @@ -848,7 +848,7 @@ void *ARRAY::GetSortIndex(PGLOBAL g) /* the indication of whether the Find will be always true, always not */ /* true or other. */ /***********************************************************************/ -int ARRAY::BlockTest(PGLOBAL g, int opc, int opm, +int ARRAY::BlockTest(PGLOBAL, int opc, int opm, void *minp, void *maxp, bool s) { bool bin, bax, pin, pax, veq, all = (opm == 2); @@ -1038,7 +1038,7 @@ void ARRAY::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of ARRAY contents. */ /***********************************************************************/ -void ARRAY::Print(PGLOBAL g, char *ps, uint z) +void ARRAY::Print(PGLOBAL, char *ps, uint z) { if (z < 16) return; diff --git a/storage/connect/blkfil.cpp b/storage/connect/blkfil.cpp index 802231b24ec..c6fb528aa5f 100644 --- a/storage/connect/blkfil.cpp +++ b/storage/connect/blkfil.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -56,7 +56,7 @@ BLOCKFILTER::BLOCKFILTER(PTDBDOS tdbp, int op) /***********************************************************************/ /* Make file output of BLOCKFILTER contents. */ /***********************************************************************/ -void BLOCKFILTER::Print(PGLOBAL g, FILE *f, uint n) +void BLOCKFILTER::Print(PGLOBAL, FILE *f, uint n) { char m[64]; @@ -70,7 +70,7 @@ void BLOCKFILTER::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of BLOCKFILTER contents. */ /***********************************************************************/ -void BLOCKFILTER::Print(PGLOBAL g, char *ps, uint z) +void BLOCKFILTER::Print(PGLOBAL, char *ps, uint z) { strncat(ps, "BlockFilter(s)", z); } // end of Print @@ -186,7 +186,7 @@ void BLKFILARI::Reset(PGLOBAL g) /***********************************************************************/ /* Evaluate block filter for arithmetic operators. */ /***********************************************************************/ -int BLKFILARI::BlockEval(PGLOBAL g) +int BLKFILARI::BlockEval(PGLOBAL) { int mincmp, maxcmp, n; @@ -306,7 +306,7 @@ void BLKFILAR2::MakeValueBitmap(void) /***********************************************************************/ /* Evaluate XDB2 block filter for arithmetic operators. */ /***********************************************************************/ -int BLKFILAR2::BlockEval(PGLOBAL g) +int BLKFILAR2::BlockEval(PGLOBAL) { #if defined(_DEBUG) assert (Colp->IsClustered()); @@ -428,7 +428,7 @@ void BLKFILMR2::MakeValueBitmap(void) /***********************************************************************/ /* Evaluate XDB2 block filter for arithmetic operators. */ /***********************************************************************/ -int BLKFILMR2::BlockEval(PGLOBAL g) +int BLKFILMR2::BlockEval(PGLOBAL) { #if defined(_DEBUG) assert (Colp->IsClustered()); @@ -514,7 +514,7 @@ void BLKSPCARI::Reset(PGLOBAL g) /***********************************************************************/ /* Evaluate block filter for arithmetic operators (ROWID) */ /***********************************************************************/ -int BLKSPCARI::BlockEval(PGLOBAL g) +int BLKSPCARI::BlockEval(PGLOBAL) { int mincmp, maxcmp, n, m; @@ -605,7 +605,7 @@ BLKFILIN::BLKFILIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp) /***********************************************************************/ /* Reset: have the sorted array reset its Bot value to -1 (bottom). */ /***********************************************************************/ -void BLKFILIN::Reset(PGLOBAL g) +void BLKFILIN::Reset(PGLOBAL) { Arap->Reset(); // MakeValueBitmap(); // Does nothing for class BLKFILIN @@ -736,7 +736,7 @@ void BLKFILIN2::MakeValueBitmap(void) /* ended string in case of string argument. This is because the ARRAY */ /* can have a different width than the char column. */ /***********************************************************************/ -int BLKFILIN2::BlockEval(PGLOBAL g) +int BLKFILIN2::BlockEval(PGLOBAL) { if (N < 0) return Result; // Was set in MakeValueBitmap @@ -909,7 +909,7 @@ int BLKFILIN2::BlockEval(PGLOBAL g) /***********************************************************************/ /* BLKSPCIN constructor. */ /***********************************************************************/ -BLKSPCIN::BLKSPCIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, +BLKSPCIN::BLKSPCIN(PGLOBAL, PTDBDOS tdbp, int op, int opm, PXOB *xp, int bsize) : BLOCKFILTER(tdbp, op) { @@ -930,7 +930,7 @@ BLKSPCIN::BLKSPCIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, /***********************************************************************/ /* Reset: have the sorted array reset its Bot value to -1 (bottom). */ /***********************************************************************/ -void BLKSPCIN::Reset(PGLOBAL g) +void BLKSPCIN::Reset(PGLOBAL) { Arap->Reset(); } // end of Reset diff --git a/storage/connect/block.h b/storage/connect/block.h index d63a899d1f5..40529ffc81f 100644 --- a/storage/connect/block.h +++ b/storage/connect/block.h @@ -50,7 +50,7 @@ class DllExport BLOCK { #if !defined(__BORLANDC__) // Avoid warning C4291 by defining a matching dummy delete operator void operator delete(void *, PGLOBAL, void *) {} - void operator delete(void *ptr,size_t size) {} + void operator delete(void *, size_t) {} #endif virtual ~BLOCK() {} diff --git a/storage/connect/catalog.h b/storage/connect/catalog.h index 5baab294737..6488b513ba9 100644 --- a/storage/connect/catalog.h +++ b/storage/connect/catalog.h @@ -1,7 +1,7 @@ /*************** Catalog H Declares Source Code File (.H) **************/ /* Name: CATALOG.H Version 3.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2000-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2000-2015 */ /* */ /* This file contains the CATALOG PlugDB classes definitions. */ /***********************************************************************/ @@ -73,33 +73,29 @@ class DllExport CATALOG { // Methods virtual void Reset(void) {} //virtual void SetDataPath(PGLOBAL g, const char *path) {} - virtual bool CheckName(PGLOBAL g, char *name) {return true;} - virtual bool ClearName(PGLOBAL g, PSZ name) {return true;} - virtual PRELDEF MakeOneTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) {return NULL;} - virtual PRELDEF GetTableDescEx(PGLOBAL g, PTABLE tablep) {return NULL;} - virtual PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, LPCSTR type, - PRELDEF *prp = NULL) {return NULL;} - virtual PRELDEF GetFirstTable(PGLOBAL g) {return NULL;} - virtual PRELDEF GetNextTable(PGLOBAL g) {return NULL;} - virtual bool TestCond(PGLOBAL g, const char *name, const char *type) - {return true;} - virtual bool DropTable(PGLOBAL g, PSZ name, bool erase) {return true;} - virtual PTDB GetTable(PGLOBAL g, PTABLE tablep, - MODE mode = MODE_READ, LPCSTR type = NULL) - {return NULL;} - virtual void TableNames(PGLOBAL g, char *buffer, int maxbuf, int info[]) {} - virtual void ColumnNames(PGLOBAL g, char *tabname, char *buffer, - int maxbuf, int info[]) {} - virtual void ColumnDefs(PGLOBAL g, char *tabname, char *buffer, - int maxbuf, int info[]) {} - virtual void *DecodeValues(PGLOBAL g, char *tabname, char *colname, - char *buffer, int maxbuf, int info[]) {return NULL;} - virtual int ColumnType(PGLOBAL g, char *tabname, char *colname) {return 0;} - virtual void ClearDB(PGLOBAL g) {} + virtual bool CheckName(PGLOBAL, char*) {return true;} + virtual bool ClearName(PGLOBAL, PSZ) {return true;} + virtual PRELDEF MakeOneTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;} + virtual PRELDEF GetTableDescEx(PGLOBAL, PTABLE) {return NULL;} + virtual PRELDEF GetTableDesc(PGLOBAL, LPCSTR, LPCSTR, + PRELDEF* = NULL) {return NULL;} + virtual PRELDEF GetFirstTable(PGLOBAL) {return NULL;} + virtual PRELDEF GetNextTable(PGLOBAL) {return NULL;} + virtual bool TestCond(PGLOBAL, const char*, const char*) {return true;} + virtual bool DropTable(PGLOBAL, PSZ, bool) {return true;} + virtual PTDB GetTable(PGLOBAL, PTABLE, + MODE = MODE_READ, LPCSTR = NULL) {return NULL;} + virtual void TableNames(PGLOBAL, char*, int, int[]) {} + virtual void ColumnNames(PGLOBAL, char*, char*, int, int[]) {} + virtual void ColumnDefs(PGLOBAL, char*, char*, int, int[]) {} + virtual void *DecodeValues(PGLOBAL, char*, char*, char*, + int, int[]) {return NULL;} + virtual int ColumnType(PGLOBAL, char*, char*) {return 0;} + virtual void ClearDB(PGLOBAL) {} protected: - virtual bool ClearSection(PGLOBAL g, const char *key, const char *section) {return true;} - virtual PRELDEF MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) {return NULL;} + virtual bool ClearSection(PGLOBAL, const char*, const char*) {return true;} + virtual PRELDEF MakeTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;} // Members char *Cbuf; /* Buffer used for col section */ diff --git a/storage/connect/colblk.cpp b/storage/connect/colblk.cpp index 78aba7bc494..7166af8027b 100644 --- a/storage/connect/colblk.cpp +++ b/storage/connect/colblk.cpp @@ -1,417 +1,417 @@ -/************* Colblk C++ Functions Source Code File (.CPP) ************/ -/* Name: COLBLK.CPP Version 2.1 */ -/* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ -/* */ -/* This file contains the COLBLK class functions. */ -/***********************************************************************/ - -/***********************************************************************/ -/* Include relevant MariaDB header file. */ -/***********************************************************************/ -#include "my_global.h" - -/***********************************************************************/ -/* Include required application header files */ -/* global.h is header containing all global Plug declarations. */ -/* plgdbsem.h is header containing the DB applic. declarations. */ -/***********************************************************************/ -#include "global.h" -#include "plgdbsem.h" -#include "tabcol.h" -#include "colblk.h" -#include "xindex.h" -#include "xtable.h" - -/***********************************************************************/ -/* COLBLK protected constructor. */ -/***********************************************************************/ -COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i) - { - Next = NULL; - Index = i; -//Number = 0; - ColUse = 0; - - if ((Cdp = cdp)) { - Name = cdp->Name; - Format = cdp->F; - Opt = cdp->Opt; - Long = cdp->Long; - Precision = cdp->Precision; - Freq = cdp->Freq; - Buf_Type = cdp->Buf_Type; - ColUse |= cdp->Flags; // Used by CONNECT - Nullable = !!(cdp->Flags & U_NULLS); - Unsigned = !!(cdp->Flags & U_UNSIGNED); - } else { - Name = NULL; - memset(&Format, 0, sizeof(FORMAT)); - Opt = 0; - Long = 0; - Precision = 0; - Freq = 0; - Buf_Type = TYPE_ERROR; - Nullable = false; - Unsigned = false; - } // endif cdp - - To_Tdb = tdbp; - Status = BUF_NO; -//Value = NULL; done in XOBJECT constructor - To_Kcol = NULL; - } // end of COLBLK constructor - -/***********************************************************************/ -/* COLBLK constructor used for copying columns. */ -/* tdbp is the pointer to the new table descriptor. */ -/***********************************************************************/ -COLBLK::COLBLK(PCOL col1, PTDB tdbp) - { - PCOL colp; - - // Copy the old column block to the new one - *this = *col1; - Next = NULL; -//To_Orig = col1; - To_Tdb = tdbp; - - if (trace > 1) - htrc(" copying COLBLK %s from %p to %p\n", Name, col1, this); - - if (tdbp) - // Attach the new column to the table block - if (!tdbp->GetColumns()) - tdbp->SetColumns(this); - else { - for (colp = tdbp->GetColumns(); colp->Next; colp = colp->Next) ; - - colp->Next = this; - } // endelse - - } // end of COLBLK copy constructor - -/***********************************************************************/ -/* Reset the column descriptor to non evaluated yet. */ -/***********************************************************************/ -void COLBLK::Reset(void) - { - Status &= ~BUF_READ; - } // end of Reset - -/***********************************************************************/ -/* Compare: compares itself to an (expression) object and returns */ -/* true if it is equivalent. */ -/***********************************************************************/ -bool COLBLK::Compare(PXOB xp) - { - return (this == xp); - } // end of Compare - -/***********************************************************************/ -/* SetFormat: function used to set SELECT output format. */ -/***********************************************************************/ -bool COLBLK::SetFormat(PGLOBAL g, FORMAT& fmt) - { - fmt = Format; - - if (trace > 1) - htrc("COLBLK: %p format=%c(%d,%d)\n", - this, *fmt.Type, fmt.Length, fmt.Prec); - - return false; - } // end of SetFormat - -/***********************************************************************/ -/* Eval: get the column value from the last read record or from a */ -/* matching Index column if there is one. */ -/***********************************************************************/ -bool COLBLK::Eval(PGLOBAL g) - { - if (trace > 1) - htrc("Col Eval: %s status=%.4X\n", Name, Status); - - if (!GetStatus(BUF_READ)) { -// if (To_Tdb->IsNull()) -// Value->Reset(); - if (To_Kcol) - To_Kcol->FillValue(Value); - else - ReadColumn(g); - - AddStatus(BUF_READ); - } // endif - - return false; - } // end of Eval - -/***********************************************************************/ -/* InitValue: prepare a column block for read operation. */ -/* Now we use Format.Length for the len parameter to avoid strings */ -/* to be truncated when converting from string to coded string. */ -/* Added in version 1.5 is the arguments GetScale() and Domain */ -/* in calling AllocateValue. Domain is used for TYPE_DATE only. */ -/***********************************************************************/ -bool COLBLK::InitValue(PGLOBAL g) - { - if (Value) - return false; // Already done - - // Allocate a Value object - if (!(Value = AllocateValue(g, Buf_Type, Precision, - GetScale(), Unsigned, GetDomain()))) - return true; - - AddStatus(BUF_READY); - Value->SetNullable(Nullable); - - if (trace > 1) - htrc(" colp=%p type=%d value=%p coluse=%.4X status=%.4X\n", - this, Buf_Type, Value, ColUse, Status); - - return false; - } // end of InitValue - -/***********************************************************************/ -/* SetBuffer: prepare a column block for write operation. */ -/***********************************************************************/ -bool COLBLK::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) - { - sprintf(g->Message, MSG(UNDEFINED_AM), "SetBuffer"); - return true; - } // end of SetBuffer - -/***********************************************************************/ -/* GetLength: returns an evaluation of the column string length. */ -/***********************************************************************/ -int COLBLK::GetLengthEx(void) - { - return Long; - } // end of GetLengthEx - -/***********************************************************************/ -/* ReadColumn: what this routine does is to access the last line */ -/* read from the corresponding table, extract from it the field */ -/* corresponding to this column and convert it to buffer type. */ -/***********************************************************************/ -void COLBLK::ReadColumn(PGLOBAL g) - { - sprintf(g->Message, MSG(UNDEFINED_AM), "ReadColumn"); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of ReadColumn - -/***********************************************************************/ -/* WriteColumn: what this routine does is to access the last line */ -/* read from the corresponding table, and rewrite the field */ -/* corresponding to this column from the column buffer and type. */ -/***********************************************************************/ -void COLBLK::WriteColumn(PGLOBAL g) - { - sprintf(g->Message, MSG(UNDEFINED_AM), "WriteColumn"); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of WriteColumn - -/***********************************************************************/ -/* Make file output of a column descriptor block. */ -/***********************************************************************/ -void COLBLK::Print(PGLOBAL g, FILE *f, uint n) - { - char m[64]; - int i; - PCOL colp; - - memset(m, ' ', n); // Make margin string - m[n] = '\0'; - - for (colp = To_Tdb->GetColumns(), i = 1; colp; colp = colp->Next, i++) - if (colp == this) - break; - - fprintf(f, "%sR%dC%d type=%d F=%.2s(%d,%d)", m, To_Tdb->GetTdb_No(), - i, GetAmType(), Format.Type, Format.Length, Format.Prec); - fprintf(f, - " coluse=%04X status=%04X buftyp=%d value=%p name=%s\n", - ColUse, Status, Buf_Type, Value, Name); - } // end of Print - -/***********************************************************************/ -/* Make string output of a column descriptor block. */ -/***********************************************************************/ -void COLBLK::Print(PGLOBAL g, char *ps, uint z) - { - sprintf(ps, "R%d.%s", To_Tdb->GetTdb_No(), Name); - } // end of Print - - -/***********************************************************************/ -/* SPCBLK constructor. */ -/***********************************************************************/ -SPCBLK::SPCBLK(PCOLUMN cp) - : COLBLK((PCOLDEF)NULL, cp->GetTo_Table()->GetTo_Tdb(), 0) - { - Name = (char*)cp->GetName(); - Precision = Long = 0; - Buf_Type = TYPE_ERROR; - } // end of SPCBLK constructor - -/***********************************************************************/ -/* WriteColumn: what this routine does is to access the last line */ -/* read from the corresponding table, and rewrite the field */ -/* corresponding to this column from the column buffer and type. */ -/***********************************************************************/ -void SPCBLK::WriteColumn(PGLOBAL g) - { - sprintf(g->Message, MSG(SPCOL_READONLY), Name); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of WriteColumn - -/***********************************************************************/ -/* RIDBLK constructor for the ROWID special column. */ -/***********************************************************************/ -RIDBLK::RIDBLK(PCOLUMN cp, bool rnm) : SPCBLK(cp) - { - Precision = Long = 10; - Buf_Type = TYPE_INT; - Rnm = rnm; - *Format.Type = 'N'; - Format.Length = 10; - } // end of RIDBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the ordinal */ -/* number of the current row in the table (if Rnm is true) or in the */ -/* current file (if Rnm is false) the same except for multiple tables.*/ -/***********************************************************************/ -void RIDBLK::ReadColumn(PGLOBAL g) - { - Value->SetValue(To_Tdb->RowNumber(g, Rnm)); - } // end of ReadColumn - -/***********************************************************************/ -/* FIDBLK constructor for the FILEID special column. */ -/***********************************************************************/ -FIDBLK::FIDBLK(PCOLUMN cp, OPVAL op) : SPCBLK(cp), Op(op) - { -//Is_Key = 2; for when the MUL table indexed reading will be implemented. - Precision = Long = _MAX_PATH; - Buf_Type = TYPE_STRING; - *Format.Type = 'C'; - Format.Length = Long; -#if defined(WIN32) - Format.Prec = 1; // Case insensitive -#endif // WIN32 - Constant = (!((PTDBASE)To_Tdb)->GetDef()->GetMultiple() && - To_Tdb->GetAmType() != TYPE_AM_PLG && - To_Tdb->GetAmType() != TYPE_AM_PLM); - Fn = NULL; - } // end of FIDBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the current */ -/* file ID of the table (can change for Multiple tables). */ -/***********************************************************************/ -void FIDBLK::ReadColumn(PGLOBAL g) - { - if (Fn != ((PTDBASE)To_Tdb)->GetFile(g)) { - char filename[_MAX_PATH]; - - Fn = ((PTDBASE)To_Tdb)->GetFile(g); - PlugSetPath(filename, Fn, ((PTDBASE)To_Tdb)->GetPath()); - - if (Op != OP_XX) { - char buff[_MAX_PATH]; - - Value->SetValue_psz(ExtractFromPath(g, buff, filename, Op)); - } else - Value->SetValue_psz(filename); - - } // endif Fn - - } // end of ReadColumn - -/***********************************************************************/ -/* TIDBLK constructor for the TABID special column. */ -/***********************************************************************/ -TIDBLK::TIDBLK(PCOLUMN cp) : SPCBLK(cp) - { -//Is_Key = 2; for when the MUL table indexed reading will be implemented. - Precision = Long = 64; - Buf_Type = TYPE_STRING; - *Format.Type = 'C'; - Format.Length = Long; - Format.Prec = 1; // Case insensitive - Constant = (To_Tdb->GetAmType() != TYPE_AM_TBL); - Tname = NULL; - } // end of TIDBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the table ID. */ -/***********************************************************************/ -void TIDBLK::ReadColumn(PGLOBAL g) - { - if (Tname == NULL) { - Tname = (char*)To_Tdb->GetName(); - Value->SetValue_psz(Tname); - } // endif Tname - - } // end of ReadColumn - -/***********************************************************************/ -/* PRTBLK constructor for the PARTID special column. */ -/***********************************************************************/ -PRTBLK::PRTBLK(PCOLUMN cp) : SPCBLK(cp) - { -//Is_Key = 2; for when the MUL table indexed reading will be implemented. - Precision = Long = 64; - Buf_Type = TYPE_STRING; - *Format.Type = 'C'; - Format.Length = Long; - Format.Prec = 1; // Case insensitive - Constant = true; // TODO: check whether this is true indeed - Pname = NULL; - } // end of PRTBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the partition ID. */ -/***********************************************************************/ -void PRTBLK::ReadColumn(PGLOBAL g) - { - if (Pname == NULL) { - char *p; - PTDBASE tdbp = (PTDBASE)To_Tdb; - - Pname = tdbp->GetDef()->GetStringCatInfo(g, "partname", "?"); - - p = strrchr(Pname, '#'); - Value->SetValue_psz((p) ? p + 1 : Pname); - } // endif Pname - - } // end of ReadColumn - -/***********************************************************************/ -/* SIDBLK constructor for the SERVID special column. */ -/***********************************************************************/ -SIDBLK::SIDBLK(PCOLUMN cp) : SPCBLK(cp) - { -//Is_Key = 2; for when the MUL table indexed reading will be implemented. - Precision = Long = 64; - Buf_Type = TYPE_STRING; - *Format.Type = 'C'; - Format.Length = Long; - Format.Prec = 1; // Case insensitive - Constant = (To_Tdb->GetAmType() != TYPE_AM_TBL); - Sname = NULL; - } // end of TIDBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the server ID. */ -/***********************************************************************/ -void SIDBLK::ReadColumn(PGLOBAL g) - { -//if (Sname == NULL) { - Sname = (char*)To_Tdb->GetServer(); - Value->SetValue_psz(Sname); -// } // endif Sname - - } // end of ReadColumn - +/************* Colblk C++ Functions Source Code File (.CPP) ************/ +/* Name: COLBLK.CPP Version 2.1 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ +/* */ +/* This file contains the COLBLK class functions. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant MariaDB header file. */ +/***********************************************************************/ +#include "my_global.h" + +/***********************************************************************/ +/* Include required application header files */ +/* global.h is header containing all global Plug declarations. */ +/* plgdbsem.h is header containing the DB applic. declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "tabcol.h" +#include "colblk.h" +#include "xindex.h" +#include "xtable.h" + +/***********************************************************************/ +/* COLBLK protected constructor. */ +/***********************************************************************/ +COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i) + { + Next = NULL; + Index = i; +//Number = 0; + ColUse = 0; + + if ((Cdp = cdp)) { + Name = cdp->Name; + Format = cdp->F; + Opt = cdp->Opt; + Long = cdp->Long; + Precision = cdp->Precision; + Freq = cdp->Freq; + Buf_Type = cdp->Buf_Type; + ColUse |= cdp->Flags; // Used by CONNECT + Nullable = !!(cdp->Flags & U_NULLS); + Unsigned = !!(cdp->Flags & U_UNSIGNED); + } else { + Name = NULL; + memset(&Format, 0, sizeof(FORMAT)); + Opt = 0; + Long = 0; + Precision = 0; + Freq = 0; + Buf_Type = TYPE_ERROR; + Nullable = false; + Unsigned = false; + } // endif cdp + + To_Tdb = tdbp; + Status = BUF_NO; +//Value = NULL; done in XOBJECT constructor + To_Kcol = NULL; + } // end of COLBLK constructor + +/***********************************************************************/ +/* COLBLK constructor used for copying columns. */ +/* tdbp is the pointer to the new table descriptor. */ +/***********************************************************************/ +COLBLK::COLBLK(PCOL col1, PTDB tdbp) + { + PCOL colp; + + // Copy the old column block to the new one + *this = *col1; + Next = NULL; +//To_Orig = col1; + To_Tdb = tdbp; + + if (trace > 1) + htrc(" copying COLBLK %s from %p to %p\n", Name, col1, this); + + if (tdbp) + // Attach the new column to the table block + if (!tdbp->GetColumns()) + tdbp->SetColumns(this); + else { + for (colp = tdbp->GetColumns(); colp->Next; colp = colp->Next) ; + + colp->Next = this; + } // endelse + + } // end of COLBLK copy constructor + +/***********************************************************************/ +/* Reset the column descriptor to non evaluated yet. */ +/***********************************************************************/ +void COLBLK::Reset(void) + { + Status &= ~BUF_READ; + } // end of Reset + +/***********************************************************************/ +/* Compare: compares itself to an (expression) object and returns */ +/* true if it is equivalent. */ +/***********************************************************************/ +bool COLBLK::Compare(PXOB xp) + { + return (this == xp); + } // end of Compare + +/***********************************************************************/ +/* SetFormat: function used to set SELECT output format. */ +/***********************************************************************/ +bool COLBLK::SetFormat(PGLOBAL, FORMAT& fmt) + { + fmt = Format; + + if (trace > 1) + htrc("COLBLK: %p format=%c(%d,%d)\n", + this, *fmt.Type, fmt.Length, fmt.Prec); + + return false; + } // end of SetFormat + +/***********************************************************************/ +/* Eval: get the column value from the last read record or from a */ +/* matching Index column if there is one. */ +/***********************************************************************/ +bool COLBLK::Eval(PGLOBAL g) + { + if (trace > 1) + htrc("Col Eval: %s status=%.4X\n", Name, Status); + + if (!GetStatus(BUF_READ)) { +// if (To_Tdb->IsNull()) +// Value->Reset(); + if (To_Kcol) + To_Kcol->FillValue(Value); + else + ReadColumn(g); + + AddStatus(BUF_READ); + } // endif + + return false; + } // end of Eval + +/***********************************************************************/ +/* InitValue: prepare a column block for read operation. */ +/* Now we use Format.Length for the len parameter to avoid strings */ +/* to be truncated when converting from string to coded string. */ +/* Added in version 1.5 is the arguments GetScale() and Domain */ +/* in calling AllocateValue. Domain is used for TYPE_DATE only. */ +/***********************************************************************/ +bool COLBLK::InitValue(PGLOBAL g) + { + if (Value) + return false; // Already done + + // Allocate a Value object + if (!(Value = AllocateValue(g, Buf_Type, Precision, + GetScale(), Unsigned, GetDomain()))) + return true; + + AddStatus(BUF_READY); + Value->SetNullable(Nullable); + + if (trace > 1) + htrc(" colp=%p type=%d value=%p coluse=%.4X status=%.4X\n", + this, Buf_Type, Value, ColUse, Status); + + return false; + } // end of InitValue + +/***********************************************************************/ +/* SetBuffer: prepare a column block for write operation. */ +/***********************************************************************/ +bool COLBLK::SetBuffer(PGLOBAL g, PVAL, bool, bool) + { + sprintf(g->Message, MSG(UNDEFINED_AM), "SetBuffer"); + return true; + } // end of SetBuffer + +/***********************************************************************/ +/* GetLength: returns an evaluation of the column string length. */ +/***********************************************************************/ +int COLBLK::GetLengthEx(void) + { + return Long; + } // end of GetLengthEx + +/***********************************************************************/ +/* ReadColumn: what this routine does is to access the last line */ +/* read from the corresponding table, extract from it the field */ +/* corresponding to this column and convert it to buffer type. */ +/***********************************************************************/ +void COLBLK::ReadColumn(PGLOBAL g) + { + sprintf(g->Message, MSG(UNDEFINED_AM), "ReadColumn"); + longjmp(g->jumper[g->jump_level], TYPE_COLBLK); + } // end of ReadColumn + +/***********************************************************************/ +/* WriteColumn: what this routine does is to access the last line */ +/* read from the corresponding table, and rewrite the field */ +/* corresponding to this column from the column buffer and type. */ +/***********************************************************************/ +void COLBLK::WriteColumn(PGLOBAL g) + { + sprintf(g->Message, MSG(UNDEFINED_AM), "WriteColumn"); + longjmp(g->jumper[g->jump_level], TYPE_COLBLK); + } // end of WriteColumn + +/***********************************************************************/ +/* Make file output of a column descriptor block. */ +/***********************************************************************/ +void COLBLK::Print(PGLOBAL, FILE *f, uint n) + { + char m[64]; + int i; + PCOL colp; + + memset(m, ' ', n); // Make margin string + m[n] = '\0'; + + for (colp = To_Tdb->GetColumns(), i = 1; colp; colp = colp->Next, i++) + if (colp == this) + break; + + fprintf(f, "%sR%dC%d type=%d F=%.2s(%d,%d)", m, To_Tdb->GetTdb_No(), + i, GetAmType(), Format.Type, Format.Length, Format.Prec); + fprintf(f, + " coluse=%04X status=%04X buftyp=%d value=%p name=%s\n", + ColUse, Status, Buf_Type, Value, Name); + } // end of Print + +/***********************************************************************/ +/* Make string output of a column descriptor block. */ +/***********************************************************************/ +void COLBLK::Print(PGLOBAL, char *ps, uint) + { + sprintf(ps, "R%d.%s", To_Tdb->GetTdb_No(), Name); + } // end of Print + + +/***********************************************************************/ +/* SPCBLK constructor. */ +/***********************************************************************/ +SPCBLK::SPCBLK(PCOLUMN cp) + : COLBLK((PCOLDEF)NULL, cp->GetTo_Table()->GetTo_Tdb(), 0) + { + Name = (char*)cp->GetName(); + Precision = Long = 0; + Buf_Type = TYPE_ERROR; + } // end of SPCBLK constructor + +/***********************************************************************/ +/* WriteColumn: what this routine does is to access the last line */ +/* read from the corresponding table, and rewrite the field */ +/* corresponding to this column from the column buffer and type. */ +/***********************************************************************/ +void SPCBLK::WriteColumn(PGLOBAL g) + { + sprintf(g->Message, MSG(SPCOL_READONLY), Name); + longjmp(g->jumper[g->jump_level], TYPE_COLBLK); + } // end of WriteColumn + +/***********************************************************************/ +/* RIDBLK constructor for the ROWID special column. */ +/***********************************************************************/ +RIDBLK::RIDBLK(PCOLUMN cp, bool rnm) : SPCBLK(cp) + { + Precision = Long = 10; + Buf_Type = TYPE_INT; + Rnm = rnm; + *Format.Type = 'N'; + Format.Length = 10; + } // end of RIDBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the ordinal */ +/* number of the current row in the table (if Rnm is true) or in the */ +/* current file (if Rnm is false) the same except for multiple tables.*/ +/***********************************************************************/ +void RIDBLK::ReadColumn(PGLOBAL g) + { + Value->SetValue(To_Tdb->RowNumber(g, Rnm)); + } // end of ReadColumn + +/***********************************************************************/ +/* FIDBLK constructor for the FILEID special column. */ +/***********************************************************************/ +FIDBLK::FIDBLK(PCOLUMN cp, OPVAL op) : SPCBLK(cp), Op(op) + { +//Is_Key = 2; for when the MUL table indexed reading will be implemented. + Precision = Long = _MAX_PATH; + Buf_Type = TYPE_STRING; + *Format.Type = 'C'; + Format.Length = Long; +#if defined(WIN32) + Format.Prec = 1; // Case insensitive +#endif // WIN32 + Constant = (!((PTDBASE)To_Tdb)->GetDef()->GetMultiple() && + To_Tdb->GetAmType() != TYPE_AM_PLG && + To_Tdb->GetAmType() != TYPE_AM_PLM); + Fn = NULL; + } // end of FIDBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the current */ +/* file ID of the table (can change for Multiple tables). */ +/***********************************************************************/ +void FIDBLK::ReadColumn(PGLOBAL g) + { + if (Fn != ((PTDBASE)To_Tdb)->GetFile(g)) { + char filename[_MAX_PATH]; + + Fn = ((PTDBASE)To_Tdb)->GetFile(g); + PlugSetPath(filename, Fn, ((PTDBASE)To_Tdb)->GetPath()); + + if (Op != OP_XX) { + char buff[_MAX_PATH]; + + Value->SetValue_psz(ExtractFromPath(g, buff, filename, Op)); + } else + Value->SetValue_psz(filename); + + } // endif Fn + + } // end of ReadColumn + +/***********************************************************************/ +/* TIDBLK constructor for the TABID special column. */ +/***********************************************************************/ +TIDBLK::TIDBLK(PCOLUMN cp) : SPCBLK(cp) + { +//Is_Key = 2; for when the MUL table indexed reading will be implemented. + Precision = Long = 64; + Buf_Type = TYPE_STRING; + *Format.Type = 'C'; + Format.Length = Long; + Format.Prec = 1; // Case insensitive + Constant = (To_Tdb->GetAmType() != TYPE_AM_TBL); + Tname = NULL; + } // end of TIDBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the table ID. */ +/***********************************************************************/ +void TIDBLK::ReadColumn(PGLOBAL) + { + if (Tname == NULL) { + Tname = (char*)To_Tdb->GetName(); + Value->SetValue_psz(Tname); + } // endif Tname + + } // end of ReadColumn + +/***********************************************************************/ +/* PRTBLK constructor for the PARTID special column. */ +/***********************************************************************/ +PRTBLK::PRTBLK(PCOLUMN cp) : SPCBLK(cp) + { +//Is_Key = 2; for when the MUL table indexed reading will be implemented. + Precision = Long = 64; + Buf_Type = TYPE_STRING; + *Format.Type = 'C'; + Format.Length = Long; + Format.Prec = 1; // Case insensitive + Constant = true; // TODO: check whether this is true indeed + Pname = NULL; + } // end of PRTBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the partition ID. */ +/***********************************************************************/ +void PRTBLK::ReadColumn(PGLOBAL g) + { + if (Pname == NULL) { + char *p; + PTDBASE tdbp = (PTDBASE)To_Tdb; + + Pname = tdbp->GetDef()->GetStringCatInfo(g, "partname", "?"); + + p = strrchr(Pname, '#'); + Value->SetValue_psz((p) ? p + 1 : Pname); + } // endif Pname + + } // end of ReadColumn + +/***********************************************************************/ +/* SIDBLK constructor for the SERVID special column. */ +/***********************************************************************/ +SIDBLK::SIDBLK(PCOLUMN cp) : SPCBLK(cp) + { +//Is_Key = 2; for when the MUL table indexed reading will be implemented. + Precision = Long = 64; + Buf_Type = TYPE_STRING; + *Format.Type = 'C'; + Format.Length = Long; + Format.Prec = 1; // Case insensitive + Constant = (To_Tdb->GetAmType() != TYPE_AM_TBL); + Sname = NULL; + } // end of TIDBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the server ID. */ +/***********************************************************************/ +void SIDBLK::ReadColumn(PGLOBAL) + { +//if (Sname == NULL) { + Sname = (char*)To_Tdb->GetServer(); + Value->SetValue_psz(Sname); +// } // endif Sname + + } // end of ReadColumn + diff --git a/storage/connect/colblk.h b/storage/connect/colblk.h index 5e8dc77ff69..c64f9d95129 100644 --- a/storage/connect/colblk.h +++ b/storage/connect/colblk.h @@ -1,7 +1,7 @@ /*************** Colblk H Declares Source Code File (.H) ***************/ /* Name: COLBLK.H Version 1.7 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* This file contains the COLBLK and derived classes declares. */ /***********************************************************************/ @@ -23,7 +23,7 @@ class DllExport COLBLK : public XOBJECT { // Default constructors used by derived classes COLBLK(PCOLDEF cdp = NULL, PTDB tdbp = NULL, int i = 0); COLBLK(PCOL colp, PTDB tdbp = NULL); // Used in copy process - COLBLK(int n) {} // Used when changing a column class in TDBXML + COLBLK(int) {} // Used when changing a column class in TDBXML public: // Implementation @@ -69,7 +69,7 @@ class DllExport COLBLK : public XOBJECT { virtual bool IsSpecial(void) {return false;} virtual bool Eval(PGLOBAL g); virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void SetTo_Val(PVAL valp) {} + virtual void SetTo_Val(PVAL) {} virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); virtual void Print(PGLOBAL g, FILE *, uint); diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index 7c32c65226d..12b23878891 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2012 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -237,7 +237,7 @@ PTDB CntGetTDB(PGLOBAL g, LPCSTR name, MODE mode, PHC h) /* OPENTAB: Open a Table. */ /***********************************************************************/ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, - bool del, PHC h) + bool del, PHC) { char *p; int i, n, rc; diff --git a/storage/connect/filamap.cpp b/storage/connect/filamap.cpp index 1e65fa2a413..cac34827b7a 100644 --- a/storage/connect/filamap.cpp +++ b/storage/connect/filamap.cpp @@ -276,7 +276,7 @@ bool MAPFAM::SetPos(PGLOBAL g, int pos) /***********************************************************************/ /* Record file position in case of UPDATE or DELETE. */ /***********************************************************************/ -bool MAPFAM::RecordPos(PGLOBAL g) +bool MAPFAM::RecordPos(PGLOBAL) { Fpos = Mempos; return false; @@ -285,7 +285,7 @@ bool MAPFAM::RecordPos(PGLOBAL g) /***********************************************************************/ /* Initialize Fpos and Mempos for indexed DELETE. */ /***********************************************************************/ -int MAPFAM::InitDelete(PGLOBAL g, int fpos, int spos) +int MAPFAM::InitDelete(PGLOBAL, int fpos, int spos) { Fpos = Memory + (ptrdiff_t)fpos; Mempos = Memory + (ptrdiff_t)spos; @@ -371,7 +371,7 @@ int MAPFAM::ReadBuffer(PGLOBAL g) /***********************************************************************/ /* WriteBuffer: File write routine for MAP access method. */ /***********************************************************************/ -int MAPFAM::WriteBuffer(PGLOBAL g) +int MAPFAM::WriteBuffer(PGLOBAL g __attribute__((unused))) { #if defined(_DEBUG) // Insert mode is no more handled using file mapping @@ -495,7 +495,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Table file close routine for MAP access method. */ /***********************************************************************/ -void MAPFAM::CloseTableFile(PGLOBAL g, bool abort) +void MAPFAM::CloseTableFile(PGLOBAL g, bool) { PlugCloseFile(g, To_Fb); To_Fb = NULL; // To get correct file size in Cardinality @@ -551,7 +551,7 @@ int MBKFAM::Cardinality(PGLOBAL g) /***********************************************************************/ /* Skip one record in file. */ /***********************************************************************/ -int MBKFAM::SkipRecord(PGLOBAL g, bool header) +int MBKFAM::SkipRecord(PGLOBAL, bool) { return RC_OK; } // end of SkipRecord @@ -685,7 +685,7 @@ bool MPXFAM::SetPos(PGLOBAL g, int pos) /***********************************************************************/ /* Initialize CurBlk, CurNum, Mempos and Fpos for indexed DELETE. */ /***********************************************************************/ -int MPXFAM::InitDelete(PGLOBAL g, int fpos, int spos) +int MPXFAM::InitDelete(PGLOBAL, int fpos, int) { Fpos = Memory + Headlen + (ptrdiff_t)fpos * Lrecl; Mempos = Fpos + Lrecl; @@ -740,7 +740,7 @@ int MPXFAM::ReadBuffer(PGLOBAL g) /***********************************************************************/ /* WriteBuffer: File write routine for MAP access method. */ /***********************************************************************/ -int MPXFAM::WriteBuffer(PGLOBAL g) +int MPXFAM::WriteBuffer(PGLOBAL g __attribute__((unused))) { #if defined(_DEBUG) // Insert mode is no more handled using file mapping diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 98b8bb6fd95..8a88b743a15 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -1,11 +1,11 @@ /*********** File AM Dbf C++ Program Source Code File (.CPP) ****************/ /* PROGRAM NAME: FILAMDBF */ /* ------------- */ -/* Version 1.7 */ +/* Version 1.8 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -115,6 +115,7 @@ typedef struct _descriptor { /* Side effects: */ /* Moves file pointer to byte 32; fills buffer at buf with */ /* first 32 bytes of file. */ +/* Converts numeric values to platform byte ordering (LE in file) */ /****************************************************************************/ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) { @@ -142,6 +143,11 @@ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) } else strcpy(g->Message, MSG(DBASE_FILE)); + // Convert numeric fields to have them in platform byte ordering + buf->Records = uint4korr(&buf->Records); + buf->Headlen = uint2korr(&buf->Headlen); + buf->Reclen = uint2korr(&buf->Reclen); + // Check last byte(s) of header if (fseek(file, buf->Headlen - dbc, SEEK_SET) != 0) { sprintf(g->Message, MSG(BAD_HEADER), fn); @@ -565,8 +571,8 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) header->Filedate[0] = datm->tm_year - 100; header->Filedate[1] = datm->tm_mon + 1; header->Filedate[2] = datm->tm_mday; - header->Headlen = (ushort)hlen; - header->Reclen = (ushort)reclen; + int2store(&header->Headlen, hlen); + int2store(&header->Reclen, reclen); descp = (DESCRIPTOR*)header; // Currently only standard Xbase types are supported @@ -729,7 +735,7 @@ bool DBFFAM::CopyHeader(PGLOBAL g) if (Headlen) { void *hdr = PlugSubAlloc(g, NULL, Headlen); size_t n, hlen = (size_t)Headlen; - int pos = ftell(Stream); + int pos = ftell(Stream); if (fseek(Stream, 0, SEEK_SET)) strcpy(g->Message, "Seek error in CopyHeader"); @@ -863,13 +869,14 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) if (n > Records) { // Update the number of rows in the file header - char filename[_MAX_PATH]; + char filename[_MAX_PATH], nRecords[4]; + int4store(&nRecords, n); PlugSetPath(filename, To_File, Tdbp->GetPath()); if ((Stream= global_fopen(g, MSGID_OPEN_MODE_STRERROR, filename, "r+b"))) { fseek(Stream, 4, SEEK_SET); // Get header.Records position - fwrite(&n, sizeof(int), 1, Stream); + fwrite(nRecords, sizeof(nRecords), 1, Stream); fclose(Stream); Stream= NULL; Records= n; // Update Records value @@ -944,13 +951,13 @@ bool DBMFAM::AllocateBuffer(PGLOBAL g) /************************************************************************/ DBFHEADER *hp = (DBFHEADER*)Memory; - if (Lrecl != (int)hp->Reclen) { - sprintf(g->Message, MSG(BAD_LRECL), Lrecl, hp->Reclen); + if (Lrecl != (int)uint2korr(&hp->Reclen)) { + sprintf(g->Message, MSG(BAD_LRECL), Lrecl, uint2korr(&hp->Reclen)); return true; } // endif Lrecl - Records = (int)hp->Records; - Headlen = (int)hp->Headlen; + Records = (int)uint4korr(&hp->Records); + Headlen = (int)uint2korr(&hp->Headlen); } // endif Headlen /**************************************************************************/ @@ -1004,7 +1011,7 @@ int DBMFAM::ReadBuffer(PGLOBAL g) /* Data Base delete line routine for DBF access methods. */ /* Deleted lines are just flagged in the first buffer character. */ /****************************************************************************/ -int DBMFAM::DeleteRecords(PGLOBAL g, int irc) +int DBMFAM::DeleteRecords(PGLOBAL, int irc) { if (irc == RC_OK) *Fpos = '*'; diff --git a/storage/connect/filamfix.cpp b/storage/connect/filamfix.cpp index 980d558eee5..4dedd3375b0 100644 --- a/storage/connect/filamfix.cpp +++ b/storage/connect/filamfix.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -102,7 +102,7 @@ bool FIXFAM::SetPos(PGLOBAL g, int pos) /***********************************************************************/ /* Initialize CurBlk and CurNum for indexed DELETE. */ /***********************************************************************/ -int FIXFAM::InitDelete(PGLOBAL g, int fpos, int spos) +int FIXFAM::InitDelete(PGLOBAL, int fpos, int) { CurBlk = fpos / Nrec; CurNum = fpos % Nrec; @@ -690,7 +690,8 @@ bool BGXFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, int org) /***********************************************************************/ /* Read from a big file. */ /***********************************************************************/ -int BGXFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) +int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)), + HANDLE h, void *inbuf, int req) { int rc; diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index eb4e026ee8a..cce9cec56bd 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -436,7 +436,7 @@ err: /* The purpose of this function is to deal with access methods that */ /* are not coherent regarding the use of SetPos and GetPos. */ /***********************************************************************/ -int TXTFAM::InitDelete(PGLOBAL g, int fpos, int spos) +int TXTFAM::InitDelete(PGLOBAL g, int, int) { strcpy(g->Message, "InitDelete should not be used by this table type"); return RC_FX; @@ -519,7 +519,7 @@ int DOSFAM::Cardinality(PGLOBAL g) /* Use BlockTest to reduce the table estimated size. */ /* Note: This function is not really implemented yet. */ /***********************************************************************/ -int DOSFAM::MaxBlkSize(PGLOBAL g, int s) +int DOSFAM::MaxBlkSize(PGLOBAL, int s) { return s; } // end of MaxBlkSize @@ -1272,7 +1272,7 @@ int BLKFAM::Cardinality(PGLOBAL g) /***********************************************************************/ /* Use BlockTest to reduce the table estimated size. */ /***********************************************************************/ -int BLKFAM::MaxBlkSize(PGLOBAL g, int s) +int BLKFAM::MaxBlkSize(PGLOBAL g, int) { int rc = RC_OK, savcur = CurBlk; int size; @@ -1343,7 +1343,7 @@ int BLKFAM::GetNextPos(void) /***********************************************************************/ /* SetPos: Replace the table at the specified position. */ /***********************************************************************/ -bool BLKFAM::SetPos(PGLOBAL g, int pos) +bool BLKFAM::SetPos(PGLOBAL g, int) { strcpy(g->Message, "Blocked variable tables cannot be used indexed"); return true; @@ -1353,7 +1353,7 @@ bool BLKFAM::SetPos(PGLOBAL g, int pos) /* Record file position in case of UPDATE or DELETE. */ /* Not used yet for blocked tables. */ /***********************************************************************/ -bool BLKFAM::RecordPos(PGLOBAL g) +bool BLKFAM::RecordPos(PGLOBAL) { Fpos = (CurNum + Nrec * CurBlk); // Computed file index return false; @@ -1362,7 +1362,7 @@ bool BLKFAM::RecordPos(PGLOBAL g) /***********************************************************************/ /* Skip one record in file. */ /***********************************************************************/ -int BLKFAM::SkipRecord(PGLOBAL g, bool header) +int BLKFAM::SkipRecord(PGLOBAL, bool header) { if (header) { // For Delete diff --git a/storage/connect/filamtxt.h b/storage/connect/filamtxt.h index 1c8ea1e3a6c..ae8f74a9830 100644 --- a/storage/connect/filamtxt.h +++ b/storage/connect/filamtxt.h @@ -57,8 +57,8 @@ class DllExport TXTFAM : public BLOCK { virtual int GetFileLength(PGLOBAL g); virtual int Cardinality(PGLOBAL g); virtual int MaxBlkSize(PGLOBAL g, int s); - virtual bool AllocateBuffer(PGLOBAL g) {return false;} - virtual void ResetBuffer(PGLOBAL g) {} + virtual bool AllocateBuffer(PGLOBAL) {return false;} + virtual void ResetBuffer(PGLOBAL) {} virtual int GetNerr(void) {return 0;} virtual int GetRowID(void) = 0; virtual bool RecordPos(PGLOBAL g) = 0; diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index e1f11bbf4cf..60a8875e015 100755 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -279,7 +279,7 @@ bool VCTFAM::SetBlockInfo(PGLOBAL g) /***********************************************************************/ /* Use BlockTest to reduce the table estimated size. */ /***********************************************************************/ -int VCTFAM::MaxBlkSize(PGLOBAL g, int s) +int VCTFAM::MaxBlkSize(PGLOBAL g, int) { int rc = RC_OK, savcur = CurBlk; int size; @@ -1716,7 +1716,7 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Move intermediate deleted or updated lines. */ /***********************************************************************/ -bool VCMFAM::MoveIntermediateLines(PGLOBAL g, bool *b) +bool VCMFAM::MoveIntermediateLines(PGLOBAL, bool *) { int i, m, n; @@ -1765,7 +1765,7 @@ bool VCMFAM::MoveIntermediateLines(PGLOBAL g, bool *b) /***********************************************************************/ /* Data Base close routine for VMP access method. */ /***********************************************************************/ -void VCMFAM::CloseTableFile(PGLOBAL g, bool abort) +void VCMFAM::CloseTableFile(PGLOBAL g, bool) { int wrc = RC_OK; MODE mode = Tdbp->GetMode(); @@ -1800,7 +1800,7 @@ void VCMFAM::CloseTableFile(PGLOBAL g, bool abort) /***********************************************************************/ /* ReadBlock: Read column values from current block. */ /***********************************************************************/ -bool VCMFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) +bool VCMFAM::ReadBlock(PGLOBAL, PVCTCOL colp) { char *mempos; int i = colp->Index - 1; @@ -1830,7 +1830,7 @@ bool VCMFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) /* the mapped file, except when checking for Update but in this case */ /* we do not want to write back the modifications either. */ /***********************************************************************/ -bool VCMFAM::WriteBlock(PGLOBAL g, PVCTCOL colp) +bool VCMFAM::WriteBlock(PGLOBAL, PVCTCOL colp __attribute__((unused))) { #if defined(_DEBUG) char *mempos; @@ -2124,7 +2124,7 @@ bool VECFAM::AllocateBuffer(PGLOBAL g) /***********************************************************************/ /* Do initial action when inserting. */ /***********************************************************************/ -bool VECFAM::InitInsert(PGLOBAL g) +bool VECFAM::InitInsert(PGLOBAL) { // We come here in MODE_INSERT only CurBlk = 0; @@ -2365,7 +2365,7 @@ bool VECFAM::MoveLines(PGLOBAL g) /***********************************************************************/ /* Move intermediate deleted or updated lines. */ /***********************************************************************/ -bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *bn) +bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *) { int i, n; bool b = false; @@ -3009,7 +3009,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for VMP access method. */ /***********************************************************************/ -void VMPFAM::CloseTableFile(PGLOBAL g, bool abort) +void VMPFAM::CloseTableFile(PGLOBAL g, bool) { if (Tdbp->GetMode() == MODE_DELETE) { // Set Block and Nrec values for TDBVCT::MakeBlockValues diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index 1288689325c..54af93e11fa 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -247,7 +247,7 @@ int ZIPFAM::GetNextPos(void) /***********************************************************************/ /* SetPos: Replace the table at the specified position. */ /***********************************************************************/ -bool ZIPFAM::SetPos(PGLOBAL g, int pos) +bool ZIPFAM::SetPos(PGLOBAL g, int pos __attribute__((unused))) { sprintf(g->Message, MSG(NO_SETPOS_YET), "ZIP"); return true; @@ -267,7 +267,7 @@ bool ZIPFAM::SetPos(PGLOBAL g, int pos) /***********************************************************************/ /* Record file position in case of UPDATE or DELETE. */ /***********************************************************************/ -bool ZIPFAM::RecordPos(PGLOBAL g) +bool ZIPFAM::RecordPos(PGLOBAL) { Zpos = gztell(Zfile); return false; @@ -376,7 +376,7 @@ int ZIPFAM::WriteBuffer(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for ZDOS access method. (NIY) */ /***********************************************************************/ -int ZIPFAM::DeleteRecords(PGLOBAL g, int irc) +int ZIPFAM::DeleteRecords(PGLOBAL g, int) { strcpy(g->Message, MSG(NO_ZIP_DELETE)); return RC_FX; @@ -385,7 +385,7 @@ int ZIPFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for DOS access method. */ /***********************************************************************/ -void ZIPFAM::CloseTableFile(PGLOBAL g, bool abort) +void ZIPFAM::CloseTableFile(PGLOBAL, bool) { int rc = gzclose(Zfile); @@ -431,7 +431,7 @@ ZBKFAM::ZBKFAM(PZBKFAM txfp) : ZIPFAM(txfp) /***********************************************************************/ /* Use BlockTest to reduce the table estimated size. */ /***********************************************************************/ -int ZBKFAM::MaxBlkSize(PGLOBAL g, int s) +int ZBKFAM::MaxBlkSize(PGLOBAL g, int) { int rc = RC_OK, savcur = CurBlk; int size; @@ -503,7 +503,7 @@ int ZBKFAM::GetPos(void) /* Record file position in case of UPDATE or DELETE. */ /* Not used yet for fixed tables. */ /***********************************************************************/ -bool ZBKFAM::RecordPos(PGLOBAL g) +bool ZBKFAM::RecordPos(PGLOBAL /*g*/) { //strcpy(g->Message, "RecordPos not implemented for zip blocked tables"); //return true; @@ -513,7 +513,7 @@ bool ZBKFAM::RecordPos(PGLOBAL g) /***********************************************************************/ /* Skip one record in file. */ /***********************************************************************/ -int ZBKFAM::SkipRecord(PGLOBAL g, bool header) +int ZBKFAM::SkipRecord(PGLOBAL /*g*/, bool) { //strcpy(g->Message, "SkipRecord not implemented for zip blocked tables"); //return RC_FX; @@ -668,7 +668,7 @@ int ZBKFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for ZBK access method. */ /***********************************************************************/ -void ZBKFAM::CloseTableFile(PGLOBAL g, bool abort) +void ZBKFAM::CloseTableFile(PGLOBAL g, bool) { int rc = RC_OK; @@ -1060,7 +1060,7 @@ int ZLBFAM::GetNextPos(void) /***********************************************************************/ /* SetPos: Replace the table at the specified position. */ /***********************************************************************/ -bool ZLBFAM::SetPos(PGLOBAL g, int pos) +bool ZLBFAM::SetPos(PGLOBAL g, int pos __attribute__((unused))) { sprintf(g->Message, MSG(NO_SETPOS_YET), "ZIP"); return true; @@ -1350,7 +1350,7 @@ bool ZLBFAM::WriteCompressedBuffer(PGLOBAL g) /***********************************************************************/ /* Table file close routine for DOS access method. */ /***********************************************************************/ -void ZLBFAM::CloseTableFile(PGLOBAL g, bool abort) +void ZLBFAM::CloseTableFile(PGLOBAL g, bool) { int rc = RC_OK; diff --git a/storage/connect/filter.h b/storage/connect/filter.h index 78e066d9ab7..ab7c2139b68 100644 --- a/storage/connect/filter.h +++ b/storage/connect/filter.h @@ -1,7 +1,7 @@ /*************** Filter H Declares Source Code File (.H) ***************/ /* Name: FILTER.H Version 1.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2010-2012 */ +/* (C) Copyright to the author Olivier BERTRAND 2010-2015 */ /* */ /* This file contains the FILTER and derived classes declares. */ /***********************************************************************/ @@ -105,7 +105,7 @@ class FILTERX : public FILTER { virtual bool Eval(PGLOBAL) = 0; // just to prevent direct FILTERX use // Fake operator new used to change a filter into a derived filter - void * operator new(size_t size, PFIL filp) {return filp;} + void * operator new(size_t, PFIL filp) {return filp;} #if defined(WIN32) // Avoid warning C4291 by defining a matching dummy delete operator void operator delete(void *, PFIL) {} diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 765c04bd2be..72f48d72bb1 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -193,7 +193,7 @@ extern "C" { /* Utility functions. */ /***********************************************************************/ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); -PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info); +PQRYRES VirColumns(PGLOBAL g, bool info); PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, int pretty, int lvl, int mxr, bool info); PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info); @@ -349,7 +349,7 @@ int GetConvSize(void) {return THDVAR(current_thd, conv_size);} TYPCONV GetTypeConv(void) {return (TYPCONV)THDVAR(current_thd, type_conv);} uint GetJsonGrpSize(void) {return THDVAR(current_thd, json_grp_size);} uint GetWorkSize(void) {return THDVAR(current_thd, work_size);} -void SetWorkSize(uint n) +void SetWorkSize(uint) { // Changing the session variable value seems to be impossible here // and should be done in a check function @@ -664,7 +664,7 @@ static int connect_init_func(void *p) @brief Plugin clean up */ -static int connect_done_func(void *p) +static int connect_done_func(void *) { int error= 0; PCONNECT pc, pn; @@ -822,8 +822,6 @@ ha_connect::~ha_connect(void) /****************************************************************************/ static PCONNECT GetUser(THD *thd, PCONNECT xp) { - const char *dbn= NULL; - if (!thd) return NULL; @@ -835,7 +833,7 @@ static PCONNECT GetUser(THD *thd, PCONNECT xp) break; if (!xp) { - xp= new user_connect(thd, dbn); + xp= new user_connect(thd); if (xp->user_init()) { delete xp; @@ -908,7 +906,8 @@ const char *ha_connect::index_type(uint inx) If all_parts is set, MySQL wants to know the flags for the combined index, up to and including 'part'. */ -ulong ha_connect::index_flags(uint inx, uint part, bool all_parts) const +//ong ha_connect::index_flags(uint inx, uint part, bool all_parts) const +ulong ha_connect::index_flags(uint, uint, bool) const { ulong flags= HA_READ_NEXT | HA_READ_RANGE | HA_KEYREAD_ONLY | HA_KEY_SCAN_NOT_ROR; @@ -2008,7 +2007,7 @@ int ha_connect::MakeRecord(char *buf) /***********************************************************************/ /* Set row values from a MySQL pseudo record. Specific to MySQL. */ /***********************************************************************/ -int ha_connect::ScanRecord(PGLOBAL g, uchar *buf) +int ha_connect::ScanRecord(PGLOBAL g, uchar *) { char attr_buffer[1024]; char data_buffer[1024]; @@ -2150,7 +2149,7 @@ int ha_connect::ScanRecord(PGLOBAL g, uchar *buf) /* Check change in index column. Specific to MySQL. */ /* Should be elaborated to check for real changes. */ /***********************************************************************/ -int ha_connect::CheckRecord(PGLOBAL g, const uchar *oldbuf, uchar *newbuf) +int ha_connect::CheckRecord(PGLOBAL g, const uchar *, uchar *newbuf) { return ScanRecord(g, newbuf); } // end of dummy CheckRecord @@ -2923,7 +2922,7 @@ bool ha_connect::get_error_message(int error, String* buf) &dummy_errors); if (trace) - htrc("GEM(%u): %s\n", len, g->Message); + htrc("GEM(%d): len=%u %s\n", error, len, g->Message); msg[len]= '\0'; buf->copy(msg, (uint)strlen(msg), system_charset_info); @@ -3019,7 +3018,7 @@ int ha_connect::open(const char *name, int mode, uint test_if_locked) @brief Make the indexes for this table */ -int ha_connect::optimize(THD* thd, HA_CHECK_OPT* check_opt) +int ha_connect::optimize(THD* thd, HA_CHECK_OPT*) { int rc= 0; PGLOBAL& g= xp->g; @@ -3223,7 +3222,7 @@ int ha_connect::update_row(const uchar *old_data, uchar *new_data) @see sql_acl.cc, sql_udf.cc, sql_delete.cc, sql_insert.cc and sql_select.cc */ -int ha_connect::delete_row(const uchar *buf) +int ha_connect::delete_row(const uchar *) { int rc= 0; DBUG_ENTER("ha_connect::delete_row"); @@ -3503,7 +3502,8 @@ int ha_connect::index_last(uchar *buf) /****************************************************************************/ /* This is called to get more rows having the same index value. */ /****************************************************************************/ -int ha_connect::index_next_same(uchar *buf, const uchar *key, uint keylen) +//t ha_connect::index_next_same(uchar *buf, const uchar *key, uint keylen) +int ha_connect::index_next_same(uchar *buf, const uchar *, uint) { int rc; DBUG_ENTER("ha_connect::index_next_same"); @@ -3693,7 +3693,7 @@ int ha_connect::rnd_next(uchar *buf) @see filesort.cc, sql_select.cc, sql_delete.cc and sql_update.cc */ -void ha_connect::position(const uchar *record) +void ha_connect::position(const uchar *) { DBUG_ENTER("ha_connect::position"); //if (((PTDBASE)tdbp)->GetDef()->Indexable()) @@ -3876,7 +3876,7 @@ int ha_connect::info(uint flag) @see ha_innodb.cc */ -int ha_connect::extra(enum ha_extra_function operation) +int ha_connect::extra(enum ha_extra_function /*operation*/) { DBUG_ENTER("ha_connect::extra"); DBUG_RETURN(0); @@ -4484,7 +4484,7 @@ int ha_connect::external_lock(THD *thd, int lock_type) @see get_lock_data() in lock.cc */ -THR_LOCK_DATA **ha_connect::store_lock(THD *thd, +THR_LOCK_DATA **ha_connect::store_lock(THD *, THR_LOCK_DATA **to, enum thr_lock_type lock_type) { @@ -4901,7 +4901,7 @@ static int init_table_share(THD* thd, oom|= sql->append(' '); oom|= sql->append(opt->name); oom|= sql->append('='); - oom|= sql->append(vull ? "ON" : "OFF"); + oom|= sql->append(vull ? "YES" : "NO"); } // endif vull break; @@ -4955,7 +4955,7 @@ static int init_table_share(THD* thd, @note this function is no more called in case of CREATE .. SELECT */ -static int connect_assisted_discovery(handlerton *hton, THD* thd, +static int connect_assisted_discovery(handlerton *, THD* thd, TABLE_SHARE *table_s, HA_CREATE_INFO *create_info) { @@ -4967,8 +4967,8 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, #if defined(WIN32) char *nsp= NULL, *cls= NULL; #endif // WIN32 - int port= 0, hdr= 0, mxr __attribute__((unused))= 0, mxe= 0, rc= 0; - int cop __attribute__((unused))= 0, pty= 2, lrecl= 0, lvl= 0; + int port= 0, hdr= 0, mxr= 0, mxe= 0, rc= 0, lvl= 0; + int cop __attribute__((unused))= 0, pty= 2, lrecl= 0; #if defined(ODBC_SUPPORT) POPARM sop = NULL; char *ucnc = NULL; @@ -5337,7 +5337,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, break; #endif // PIVOT_SUPPORT case TAB_VIR: - qrp= VirColumns(g, tab, (char*)db, fnc == FNC_COL); + qrp= VirColumns(g, fnc == FNC_COL); break; case TAB_JSON: qrp= JSONColumns(g, (char*)db, fn, objn, pty, lrecl, lvl, fnc == FNC_COL); @@ -6464,8 +6464,7 @@ fin: @note: This function is no more called by check_if_supported_inplace_alter */ -bool ha_connect::check_if_incompatible_data(HA_CREATE_INFO *info, - uint table_changes) +bool ha_connect::check_if_incompatible_data(HA_CREATE_INFO *, uint) { DBUG_ENTER("ha_connect::check_if_incompatible_data"); // TO DO: really implement and check it. diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 1afd79bec05..1ad33d83068 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -296,7 +296,7 @@ my_bool Json_Value_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Value_init char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; PJVAL jvp; @@ -329,7 +329,7 @@ my_bool Json_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Array_init char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; uint i; @@ -376,7 +376,7 @@ my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Array_Add_init char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; PJVAL jvp; @@ -429,7 +429,7 @@ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Array_Delete_init char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; int n; @@ -482,7 +482,7 @@ my_bool Json_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Object_init char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; uint i; @@ -520,7 +520,7 @@ my_bool Json_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, } // end of Json_Object_Nonull_init char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; uint i; @@ -574,8 +574,7 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of Json_Array_Grp_init -void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) +void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; PJAR arp = (PJAR)g->Activityp; @@ -585,8 +584,8 @@ void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, } // end of Json_Array_Grp_add -char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) +char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, + unsigned long *res_length, char *, char *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -605,7 +604,7 @@ char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, return str; } // end of Json_Array_Grp -void Json_Array_Grp_clear(UDF_INIT *initid, char *is_null, char *error) +void Json_Array_Grp_clear(UDF_INIT *initid, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -646,8 +645,7 @@ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of Json_Object_Grp_init -void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) +void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; PJOB objp = (PJOB)g->Activityp; @@ -657,8 +655,8 @@ void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, } // end of Json_Object_Grp_add -char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) +char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, + unsigned long *res_length, char *, char *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -675,7 +673,7 @@ char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, return str; } // end of Json_Object_Grp -void Json_Object_Grp_clear(UDF_INIT *initid, char *is_null, char *error) +void Json_Object_Grp_clear(UDF_INIT *initid, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index b15c8fa2322..0bc82cd80ce 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2014 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ /* ------------- */ /* Version 1.4 */ /* */ -/* Author: Olivier Bertrand 2012 - 2014 */ +/* Author: Olivier Bertrand 2012 - 2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -478,7 +478,7 @@ void MYCAT::SetPath(PGLOBAL g, LPCSTR *datapath, const char *path) /* Look for a table descriptor matching the name and type. */ /***********************************************************************/ PRELDEF MYCAT::GetTableDesc(PGLOBAL g, LPCSTR name, - LPCSTR type, PRELDEF *prp) + LPCSTR type, PRELDEF *) { if (trace) printf("GetTableDesc: name=%s am=%s\n", name, SVP(type)); @@ -589,7 +589,7 @@ PTDB MYCAT::GetTable(PGLOBAL g, PTABLE tablep, MODE mode, LPCSTR type) /***********************************************************************/ /* ClearDB: Terminates Database usage. */ /***********************************************************************/ -void MYCAT::ClearDB(PGLOBAL g) +void MYCAT::ClearDB(PGLOBAL) { } // end of ClearDB diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h index cdbe4e5bca9..f7c4c70eaf5 100644 --- a/storage/connect/mycat.h +++ b/storage/connect/mycat.h @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2013 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -98,7 +98,7 @@ class MYCAT : public CATALOG { void Reset(void); //void SetDataPath(PGLOBAL g, const char *path) // {SetPath(g, &DataPath, path);} - bool StoreIndex(PGLOBAL g, PTABDEF defp) {return false;} // Temporary + bool StoreIndex(PGLOBAL, PTABDEF) {return false;} // Temporary PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, LPCSTR type, PRELDEF *prp = NULL); PTDB GetTable(PGLOBAL g, PTABLE tablep, diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index 47d781d9ff6..2b958b512f3 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2007-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2007-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -720,7 +720,7 @@ int MYSQLC::ExecSQL(PGLOBAL g, const char *query, int *w) /***********************************************************************/ /* Get table size by executing "select count(*) from table_name". */ /***********************************************************************/ -int MYSQLC::GetTableSize(PGLOBAL g, PSZ query) +int MYSQLC::GetTableSize(PGLOBAL g __attribute__((unused)), PSZ query) { if (mysql_real_query(m_DB, query, strlen(query))) { #if defined(_DEBUG) diff --git a/storage/connect/mysql-test/connect/r/xml_html.result b/storage/connect/mysql-test/connect/r/xml_html.result index 7b5e0febe6e..143f46529f6 100644 --- a/storage/connect/mysql-test/connect/r/xml_html.result +++ b/storage/connect/mysql-test/connect/r/xml_html.result @@ -1,5 +1,5 @@ Warnings: -Warning 1105 No file name. Table will use t1.xml +Warning 1105 No file name. Table will use t1.xml SET NAMES utf8; # # Testing HTML like XML file @@ -11,9 +11,9 @@ CREATE TABLE beers ( ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; SELECT * FROM beers; -Name Origin Description -Huntsman Bath, UK Wonderful hop, light alcohol -Tuborg Danmark In small bottles +Name Origin Description +Huntsman Bath, UK Wonderful hop, light alcohol +Tuborg Danmark In small bottles DROP TABLE beers; # # Testing HTML file @@ -26,7 +26,7 @@ CREATE TABLE coffee ( ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; SELECT * FROM coffee; -Name Cups Type Sugar -T. Sexton 10 Espresso No -J. Dinnen 5 Decaf Yes +Name Cups Type Sugar +T. Sexton 10 Espresso No +J. Dinnen 5 Decaf Yes DROP TABLE coffee; diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index 32f6d6f8366..a2b1baf1249 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -888,7 +888,7 @@ FILE *PlugReopenFile(PGLOBAL g, PFBLOCK fp, LPCSTR md) /* Close file routine: the purpose of this routine is to avoid */ /* double closing that freeze the system on some Unix platforms. */ /***********************************************************************/ -int PlugCloseFile(PGLOBAL g, PFBLOCK fp, bool all) +int PlugCloseFile(PGLOBAL g __attribute__((unused)), PFBLOCK fp, bool all) { int rc = 0; diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 47f825e965d..d0483b5075d 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -548,7 +548,7 @@ bool OEMDEF::DeleteTableFile(PGLOBAL g) /***********************************************************************/ /* Define: initialize the table definition block from XDB file. */ /***********************************************************************/ -bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR, int) { Module = GetStringCatInfo(g, "Module", ""); Subtype = GetStringCatInfo(g, "Subtype", Module); @@ -715,7 +715,7 @@ COLDEF::COLDEF(void) : COLCRT() /***********************************************************************/ /* Define: initialize a column definition from a COLINFO structure. */ /***********************************************************************/ -int COLDEF::Define(PGLOBAL g, void *memp, PCOLINFO cfp, int poff) +int COLDEF::Define(PGLOBAL g, void *, PCOLINFO cfp, int poff) { Name = (PSZ)PlugDup(g, cfp->Name); diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h index 13bd392b706..ec70f18e151 100644 --- a/storage/connect/reldef.h +++ b/storage/connect/reldef.h @@ -1,7 +1,7 @@ /*************** RelDef H Declares Source Code File (.H) ***************/ /* Name: RELDEF.H Version 1.5 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ /* */ /* This file contains the DEF classes definitions. */ /***********************************************************************/ @@ -89,7 +89,7 @@ class DllExport TABDEF : public RELDEF { /* Logical table descriptor */ bool IsReadOnly(void) {return Read_Only;} virtual AMT GetDefType(void) {return TYPE_AM_TAB;} virtual PIXDEF GetIndx(void) {return NULL;} - virtual void SetIndx(PIXDEF xp) {} + virtual void SetIndx(PIXDEF) {} virtual bool IsHuge(void) {return false;} const CHARSET_INFO *data_charset() {return m_data_charset;} diff --git a/storage/connect/tabcol.cpp b/storage/connect/tabcol.cpp index 8f350c6f074..662c0b514cf 100644 --- a/storage/connect/tabcol.cpp +++ b/storage/connect/tabcol.cpp @@ -1,7 +1,7 @@ /************* TabCol C++ Functions Source Code File (.CPP) ************/ /* Name: TABCOL.CPP Version 2.7 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2013 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ /* This file contains the PlugDB++ XTAB, COLUMN and XORDER methods. */ /***********************************************************************/ @@ -91,7 +91,7 @@ void XTAB::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of XTAB contents. */ /***********************************************************************/ -void XTAB::Print(PGLOBAL g, char *ps, uint z) +void XTAB::Print(PGLOBAL, char *ps, uint z) { char buf[128]; int i, n = (int)z - 1; @@ -125,7 +125,7 @@ COLUMN::COLUMN(LPCSTR name) : Name(name) /***********************************************************************/ /* COLUMN SetFormat: should never be called. */ /***********************************************************************/ -bool COLUMN::SetFormat(PGLOBAL g, FORMAT& fmt) +bool COLUMN::SetFormat(PGLOBAL g, FORMAT&) { strcpy(g->Message, MSG(NO_FORMAT_COL)); return true; @@ -154,7 +154,7 @@ void COLUMN::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of COLUMN contents. */ /***********************************************************************/ -void COLUMN::Print(PGLOBAL g, char *ps, uint z) +void COLUMN::Print(PGLOBAL, char *ps, uint z) { char buf[80]; diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index ba22da52998..37bd94cf1bb 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -117,7 +117,7 @@ DOSDEF::DOSDEF(void) /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /***********************************************************************/ -bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int) { char buf[8]; bool map = (am && (*am == 'M' || *am == 'm')); @@ -303,7 +303,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) /***********************************************************************/ /* InvalidateIndex: mark all indexes as invalid. */ /***********************************************************************/ -bool DOSDEF::InvalidateIndex(PGLOBAL g) +bool DOSDEF::InvalidateIndex(PGLOBAL) { if (To_Indx) for (PIXDEF xp = To_Indx; xp; xp = xp->Next) @@ -1736,15 +1736,16 @@ err: /***********************************************************************/ /* Make a dynamic index. */ /***********************************************************************/ -bool TDBDOS::InitialyzeIndex(PGLOBAL g, PIXDEF xdp, bool sorted) +bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) { int k, rc; - bool brc, dynamic; + volatile bool dynamic; + bool brc; PCOL colp; PCOLDEF cdp; PVAL valp; PXLOAD pxp; - PKXBASE kxp; + volatile PKXBASE kxp; PKPDEF kdp; if (!xdp && !(xdp = To_Xdp)) { @@ -1864,7 +1865,7 @@ int TDBDOS::GetProgCur(void) /***********************************************************************/ /* RowNumber: return the ordinal number of the current row. */ /***********************************************************************/ -int TDBDOS::RowNumber(PGLOBAL g, bool b) +int TDBDOS::RowNumber(PGLOBAL g, bool) { if (To_Kindex) { /*******************************************************************/ @@ -1944,7 +1945,7 @@ int TDBDOS::Cardinality(PGLOBAL g) rec = ((PDOSDEF)To_Def)->Ending; if (AvgLen <= 0) // No given average estimate - rec += EstimatedLength(g); + rec += EstimatedLength(); else // An estimate was given for the average record length rec += AvgLen; @@ -1988,7 +1989,7 @@ int TDBDOS::GetMaxSize(PGLOBAL g) /* Estimate the number of lines in the table (if not known) by */ /* dividing the file length by minimum record length. */ /*****************************************************************/ - rec = EstimatedLength(g) + ((PDOSDEF)To_Def)->Ending; + rec = EstimatedLength() + ((PDOSDEF)To_Def)->Ending; MaxSize = (len + rec - 1) / rec; if (trace) @@ -2005,7 +2006,7 @@ int TDBDOS::GetMaxSize(PGLOBAL g) /***********************************************************************/ /* DOS EstimatedLength. Returns an estimated minimum line length. */ /***********************************************************************/ -int TDBDOS::EstimatedLength(PGLOBAL g) +int TDBDOS::EstimatedLength(void) { int dep = 0; PCOLDEF cdp = To_Def->GetCols(); @@ -2023,7 +2024,7 @@ int TDBDOS::EstimatedLength(PGLOBAL g) /***********************************************************************/ /* DOS tables favor the use temporary files for Update. */ /***********************************************************************/ -bool TDBDOS::IsUsingTemp(PGLOBAL g) +bool TDBDOS::IsUsingTemp(PGLOBAL) { USETEMP utp = UseTemp(); @@ -2183,7 +2184,7 @@ int TDBDOS::ReadDB(PGLOBAL g) /***********************************************************************/ /* PrepareWriting: Prepare the line to write. */ /***********************************************************************/ -bool TDBDOS::PrepareWriting(PGLOBAL g) +bool TDBDOS::PrepareWriting(PGLOBAL) { if (!Ftype && (Mode == MODE_INSERT || Txfp->GetUseTemp())) { char *p; diff --git a/storage/connect/tabdos.h b/storage/connect/tabdos.h index b7150294e9b..9115b1fae86 100644 --- a/storage/connect/tabdos.h +++ b/storage/connect/tabdos.h @@ -1,7 +1,7 @@ /*************** TabDos H Declares Source Code File (.H) ***************/ /* Name: TABDOS.H Version 3.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ /* */ /* This file contains the DOS classes declares. */ /***********************************************************************/ @@ -123,11 +123,11 @@ class DllExport TDBDOS : public TDBASE { // Implementation virtual AMT GetAmType(void) {return Txfp->GetAmType();} - virtual PSZ GetFile(PGLOBAL g) {return Txfp->To_File;} - virtual void SetFile(PGLOBAL g, PSZ fn) {Txfp->To_File = fn;} + virtual PSZ GetFile(PGLOBAL) {return Txfp->To_File;} + virtual void SetFile(PGLOBAL, PSZ fn) {Txfp->To_File = fn;} virtual void SetAbort(bool b) {Abort = b;} virtual RECFM GetFtype(void) {return Ftype;} - virtual bool SkipHeader(PGLOBAL g) {return false;} + virtual bool SkipHeader(PGLOBAL) {return false;} virtual void RestoreNrec(void) {Txfp->SetNrec(1);} virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBDOS(g, this);} @@ -149,7 +149,7 @@ class DllExport TDBDOS : public TDBASE { // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual char *GetOpenMode(PGLOBAL g, char *opmode) {return NULL;} + virtual char *GetOpenMode(PGLOBAL, char*) {return NULL;} virtual int GetFileLength(PGLOBAL g) {return Txfp->GetFileLength(g);} virtual int GetProgMax(PGLOBAL g); virtual int GetProgCur(void); @@ -168,7 +168,7 @@ class DllExport TDBDOS : public TDBASE { virtual int ReadBuffer(PGLOBAL g) {return Txfp->ReadBuffer(g);} // Specific routine - virtual int EstimatedLength(PGLOBAL g); + virtual int EstimatedLength(void); // Optimization routines virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add); diff --git a/storage/connect/tabfix.cpp b/storage/connect/tabfix.cpp index 77e47e6f8dd..5cfd5a726ef 100644 --- a/storage/connect/tabfix.cpp +++ b/storage/connect/tabfix.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -271,7 +271,7 @@ int TDBFIX::RowNumber(PGLOBAL g, bool b) /***********************************************************************/ /* FIX tables don't use temporary files except if specified as do it. */ /***********************************************************************/ -bool TDBFIX::IsUsingTemp(PGLOBAL g) +bool TDBFIX::IsUsingTemp(PGLOBAL) { // Not ready yet to handle using a temporary file with mapping // or while deleting from DBF files. diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index d5f8dc50a89..a5e14e1b81f 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2001 - 2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2001 - 2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -625,7 +625,7 @@ bool TDBCSV::CheckErr(void) /***********************************************************************/ /* CSV EstimatedLength. Returns an estimated minimum line length. */ /***********************************************************************/ -int TDBCSV::EstimatedLength(PGLOBAL g) +int TDBCSV::EstimatedLength(void) { int n = 0; PCOLDEF cdp; @@ -1118,7 +1118,7 @@ PCOL TDBFMT::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /* FMT EstimatedLength. Returns an estimated minimum line length. */ /* The big problem here is how can we astimated that minimum ? */ /***********************************************************************/ -int TDBFMT::EstimatedLength(PGLOBAL g) +int TDBFMT::EstimatedLength(void) { // This is rather stupid !!! return ((PDOSDEF)To_Def)->GetEnding() + (int)((Lrecl / 10) + 1); diff --git a/storage/connect/tabfmt.h b/storage/connect/tabfmt.h index 8a1e1f17561..ce80a276cdc 100644 --- a/storage/connect/tabfmt.h +++ b/storage/connect/tabfmt.h @@ -75,7 +75,7 @@ class TDBCSV : public TDBDOS { virtual int ReadBuffer(PGLOBAL g); // Physical file read // Specific routines - virtual int EstimatedLength(PGLOBAL g); + virtual int EstimatedLength(void); virtual bool SkipHeader(PGLOBAL g); virtual bool CheckErr(void); @@ -157,7 +157,7 @@ class TDBFMT : public TDBCSV { virtual int ReadBuffer(PGLOBAL g); // Physical file read // Specific routines - virtual int EstimatedLength(PGLOBAL g); + virtual int EstimatedLength(void); protected: virtual bool PrepareWriting(PGLOBAL g) diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 0231b369fc1..f22bdd15528 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -78,11 +78,13 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, PJVAL jvp; PJOB row; PJDEF tdp; - TDBJSN *tjnp; - PJTDB tjsp; + TDBJSN *tjnp = NULL; + PJTDB tjsp = NULL; PQRYRES qrp; PCOLRES crp; + jcol.Name = jcol.Fmt = NULL; + if (info) { length[0] = 128; length[7] = 256; @@ -362,7 +364,7 @@ JSONDEF::JSONDEF(void) /***********************************************************************/ /* DefineAM: define specific AM block values. */ /***********************************************************************/ -bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR, int poff) { Jmode = (JMODE)GetIntCatInfo("Jmode", MODE_OBJECT); Objname = GetStringCatInfo(g, "Object", NULL); @@ -506,7 +508,7 @@ PCOL TDBJSN::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ /* InsertSpecialColumn: Put a special column ahead of the column list.*/ /***********************************************************************/ -PCOL TDBJSN::InsertSpecialColumn(PGLOBAL g, PCOL colp) +PCOL TDBJSN::InsertSpecialColumn(PCOL colp) { if (!colp->IsSpecial()) return NULL; @@ -1486,7 +1488,7 @@ int TDBJSON::MakeNewDoc(PGLOBAL g) /***********************************************************************/ int TDBJSON::MakeDocument(PGLOBAL g) { - char *p, *memory, *objpath, *key; + char *p, *memory, *objpath, *key = NULL; int len, i = 0; MODE mode = Mode; PJSON jsp; @@ -1646,7 +1648,7 @@ void TDBJSON::ResetSize(void) /***********************************************************************/ /* TDBJSON is not indexable. */ /***********************************************************************/ -int TDBJSON::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) +int TDBJSON::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool) { if (pxdf) { strcpy(g->Message, "JSON not indexable when pretty = 2"); @@ -1677,7 +1679,7 @@ int TDBJSON::GetRecpos(void) /***********************************************************************/ /* Set the position in the table. */ /***********************************************************************/ -bool TDBJSON::SetRecpos(PGLOBAL g, int recpos) +bool TDBJSON::SetRecpos(PGLOBAL, int recpos) { #if 0 union { @@ -1739,7 +1741,7 @@ bool TDBJSON::OpenDB(PGLOBAL g) /***********************************************************************/ /* ReadDB: Data Base read routine for JSON access method. */ /***********************************************************************/ -int TDBJSON::ReadDB(PGLOBAL g) +int TDBJSON::ReadDB(PGLOBAL) { int rc; diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 10b9a9a9cc3..dc682e067e3 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -82,7 +82,7 @@ class TDBJSN : public TDBDOS { // Methods virtual PTDB CopyOne(PTABS t); virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); + virtual PCOL InsertSpecialColumn(PCOL colp); virtual int RowNumber(PGLOBAL g, bool b = FALSE) {return (b) ? N : Fpos + 1;} diff --git a/storage/connect/table.cpp b/storage/connect/table.cpp index d163c443cd5..933e072c1bb 100644 --- a/storage/connect/table.cpp +++ b/storage/connect/table.cpp @@ -1,7 +1,7 @@ /************** Table C++ Functions Source Code File (.CPP) ************/ /* Name: TABLE.CPP Version 2.7 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ /* */ /* This file contains the TBX, TDB and OPJOIN classes functions. */ /***********************************************************************/ @@ -74,7 +74,7 @@ TDB::TDB(PTDB tdbp) : Tdb_No(++Tnum) /***********************************************************************/ /* RowNumber: returns the current row ordinal number. */ /***********************************************************************/ -int TDB::RowNumber(PGLOBAL g, bool b) +int TDB::RowNumber(PGLOBAL g, bool) { sprintf(g->Message, MSG(ROWID_NOT_IMPL), GetAmName(g, GetAmType())); return 0; @@ -122,7 +122,7 @@ void TDB::Print(PGLOBAL g, FILE *f, uint n) } // end of Print -void TDB::Print(PGLOBAL g, char *ps, uint z) +void TDB::Print(PGLOBAL, char *ps, uint) { sprintf(ps, "R%d.%s", Tdb_No, Name); } // end of Print @@ -263,7 +263,7 @@ PCOL TDBASE::ColDB(PGLOBAL g, PSZ name, int num) /***********************************************************************/ /* InsertSpecialColumn: Put a special column ahead of the column list.*/ /***********************************************************************/ -PCOL TDBASE::InsertSpecialColumn(PGLOBAL g, PCOL colp) +PCOL TDBASE::InsertSpecialColumn(PCOL colp) { if (!colp->IsSpecial()) return NULL; @@ -327,7 +327,7 @@ PCOL TDBASE::InsertSpcBlk(PGLOBAL g, PCOLDEF cdp) return NULL; } // endif's name - if (!(colp = InsertSpecialColumn(g, colp))) { + if (!(colp = InsertSpecialColumn(colp))) { sprintf(g->Message, MSG(BAD_SPECIAL_COL), name); return NULL; } // endif Insert @@ -338,7 +338,7 @@ PCOL TDBASE::InsertSpcBlk(PGLOBAL g, PCOLDEF cdp) /***********************************************************************/ /* ResetTableOpt: Wrong for this table type. */ /***********************************************************************/ -int TDBASE::ResetTableOpt(PGLOBAL g, bool dop, bool dox) +int TDBASE::ResetTableOpt(PGLOBAL g, bool, bool) { strcpy(g->Message, "This table is not indexable"); return RC_INFO; @@ -365,7 +365,7 @@ void TDBASE::ResetKindex(PGLOBAL g, PKXBASE kxp) /***********************************************************************/ /* SetRecpos: Replace the table at the specified position. */ /***********************************************************************/ -bool TDBASE::SetRecpos(PGLOBAL g, int recpos) +bool TDBASE::SetRecpos(PGLOBAL g, int) { strcpy(g->Message, MSG(SETRECPOS_NIY)); return true; @@ -386,7 +386,7 @@ void TDBASE::PrintAM(FILE *f, char *m) /* Two questions here: exact meaning of U_J_INT ? */ /* Why is the eventual reference to To_Key_Col not marked U_J_EXT ? */ /***********************************************************************/ -void TDBASE::MarkDB(PGLOBAL g, PTDB tdb2) +void TDBASE::MarkDB(PGLOBAL, PTDB tdb2) { if (trace) htrc("DOS MarkDB: tdbp=%p tdb2=%p\n", this, tdb2); @@ -453,7 +453,7 @@ bool TDBCAT::Initialize(PGLOBAL g) /***********************************************************************/ /* CAT: Get the number of properties. */ /***********************************************************************/ -int TDBCAT::GetMaxSize(PGLOBAL g) +int TDBCAT::GetMaxSize(PGLOBAL g __attribute__((unused))) { if (MaxSize < 0) { // if (Initialize(g)) @@ -528,7 +528,7 @@ bool TDBCAT::InitCol(PGLOBAL g) /***********************************************************************/ /* SetRecpos: Replace the table at the specified position. */ /***********************************************************************/ -bool TDBCAT::SetRecpos(PGLOBAL g, int recpos) +bool TDBCAT::SetRecpos(PGLOBAL, int recpos) { N = recpos - 1; return false; @@ -537,7 +537,7 @@ bool TDBCAT::SetRecpos(PGLOBAL g, int recpos) /***********************************************************************/ /* Data Base read routine for CAT access method. */ /***********************************************************************/ -int TDBCAT::ReadDB(PGLOBAL g) +int TDBCAT::ReadDB(PGLOBAL) { return (++N < Qrp->Nblin) ? RC_OK : RC_EF; } // end of ReadDB @@ -554,7 +554,7 @@ int TDBCAT::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for CAT access methods. */ /***********************************************************************/ -int TDBCAT::DeleteDB(PGLOBAL g, int irc) +int TDBCAT::DeleteDB(PGLOBAL g, int) { strcpy(g->Message, "Delete not enabled for CAT tables"); return RC_FX; @@ -563,7 +563,7 @@ int TDBCAT::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for WMI access method. */ /***********************************************************************/ -void TDBCAT::CloseDB(PGLOBAL g) +void TDBCAT::CloseDB(PGLOBAL) { // Nothing to do } // end of CloseDB @@ -584,7 +584,7 @@ CATCOL::CATCOL(PCOLDEF cdp, PTDB tdbp, int n) /***********************************************************************/ /* Read the next Data Source elements. */ /***********************************************************************/ -void CATCOL::ReadColumn(PGLOBAL g) +void CATCOL::ReadColumn(PGLOBAL) { // Get the value of the Name or Description property if (Crp->Kdata) diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 94950584c9b..12e8de2c808 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -561,7 +561,7 @@ int TDBMUL::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for MUL access method. */ /***********************************************************************/ -int TDBMUL::DeleteDB(PGLOBAL g, int irc) +int TDBMUL::DeleteDB(PGLOBAL g, int) { // When implementing DELETE_MODE InitFileNames must be updated to // eliminate CRLF under Windows if the file is read in binary. @@ -586,7 +586,7 @@ void TDBMUL::CloseDB(PGLOBAL g) /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /***********************************************************************/ -bool DIRDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool DIRDEF::DefineAM(PGLOBAL g, LPCSTR, int) { Desc = Fn = GetStringCatInfo(g, "Filename", NULL); Incl = (GetIntCatInfo("Subdir", 0) != 0); @@ -597,7 +597,7 @@ bool DIRDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new Table Description Block. */ /***********************************************************************/ -PTDB DIRDEF::GetTable(PGLOBAL g, MODE m) +PTDB DIRDEF::GetTable(PGLOBAL g, MODE) { #if 0 if (Huge) @@ -865,7 +865,7 @@ int TDBDIR::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for DIR access method. */ /***********************************************************************/ -int TDBDIR::DeleteDB(PGLOBAL g, int irc) +int TDBDIR::DeleteDB(PGLOBAL g, int) { strcpy(g->Message, MSG(TABDIR_READONLY)); return RC_FX; // NIY @@ -874,7 +874,7 @@ int TDBDIR::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for MUL access method. */ /***********************************************************************/ -void TDBDIR::CloseDB(PGLOBAL g) +void TDBDIR::CloseDB(PGLOBAL) { #if defined(WIN32) // Close the search handle. @@ -895,7 +895,7 @@ void TDBDIR::CloseDB(PGLOBAL g) /***********************************************************************/ /* DIRCOL public constructor. */ /***********************************************************************/ -DIRCOL::DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +DIRCOL::DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index b18e4da2ec4..cb7011822d8 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -5,7 +5,7 @@ /* */ /* AUTHOR: */ /* ------- */ -/* Olivier BERTRAND 2007-2014 */ +/* Olivier BERTRAND 2007-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -307,7 +307,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) /***********************************************************************/ /* DefineAM: define specific AM block values from XCV file. */ /***********************************************************************/ -bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int) { char *url; @@ -380,7 +380,7 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB MYSQLDEF::GetTable(PGLOBAL g, MODE m) +PTDB MYSQLDEF::GetTable(PGLOBAL g, MODE) { if (Xsrc) return new(g) TDBMYEXC(this); @@ -438,7 +438,7 @@ TDBMYSQL::TDBMYSQL(PMYDEF tdp) : TDBASE(tdp) Nparm = 0; } // end of TDBMYSQL constructor -TDBMYSQL::TDBMYSQL(PGLOBAL g, PTDBMY tdbp) : TDBASE(tdbp) +TDBMYSQL::TDBMYSQL(PTDBMY tdbp) : TDBASE(tdbp) { Host = tdbp->Host; Database = tdbp->Database; @@ -468,7 +468,7 @@ PTDB TDBMYSQL::CopyOne(PTABS t) PCOL cp1, cp2; PGLOBAL g = t->G; - tp = new(g) TDBMYSQL(g, this); + tp = new(g) TDBMYSQL(this); for (cp1 = Columns; cp1; cp1 = cp1->GetNext()) { cp2 = new(g) MYSQLCOL((PMYCOL)cp1, tp); @@ -816,7 +816,7 @@ int TDBMYSQL::GetMaxSize(PGLOBAL g) /***********************************************************************/ /* This a fake routine as ROWID does not exist in MySQL. */ /***********************************************************************/ -int TDBMYSQL::RowNumber(PGLOBAL g, bool b) +int TDBMYSQL::RowNumber(PGLOBAL, bool) { return N + 1; } // end of RowNumber @@ -832,7 +832,7 @@ int TDBMYSQL::GetProgMax(PGLOBAL g) /***********************************************************************/ /* MySQL Bind Parameter function. */ /***********************************************************************/ -int TDBMYSQL::BindColumns(PGLOBAL g) +int TDBMYSQL::BindColumns(PGLOBAL g __attribute__((unused))) { #if defined(MYSQL_PREPARED_STATEMENTS) if (Prep) { @@ -1425,7 +1425,7 @@ void MYSQLCOL::ReadColumn(PGLOBAL g) /***********************************************************************/ /* WriteColumn: make sure the bind buffer is updated. */ /***********************************************************************/ -void MYSQLCOL::WriteColumn(PGLOBAL g) +void MYSQLCOL::WriteColumn(PGLOBAL) { /*********************************************************************/ /* Do convert the column value if necessary. */ @@ -1463,7 +1463,7 @@ TDBMYEXC::TDBMYEXC(PMYDEF tdp) : TDBMYSQL(tdp) Nerr = 0; } // end of TDBMYEXC constructor -TDBMYEXC::TDBMYEXC(PGLOBAL g, PTDBMYX tdbp) : TDBMYSQL(g, tdbp) +TDBMYEXC::TDBMYEXC(PTDBMYX tdbp) : TDBMYSQL(tdbp) { Cmdlist = tdbp->Cmdlist; Cmdcol = tdbp->Cmdcol; @@ -1481,7 +1481,7 @@ PTDB TDBMYEXC::CopyOne(PTABS t) PCOL cp1, cp2; PGLOBAL g = t->G; - tp = new(g) TDBMYEXC(g, this); + tp = new(g) TDBMYEXC(this); for (cp1 = Columns; cp1; cp1 = cp1->GetNext()) { cp2 = new(g) MYXCOL((PMYXCOL)cp1, tp); @@ -1534,7 +1534,7 @@ PCMD TDBMYEXC::MakeCMD(PGLOBAL g) /***********************************************************************/ /* EXC GetMaxSize: returns the maximum number of rows in the table. */ /***********************************************************************/ -int TDBMYEXC::GetMaxSize(PGLOBAL g) +int TDBMYEXC::GetMaxSize(PGLOBAL) { if (MaxSize < 0) { MaxSize = 10; // a guess @@ -1711,7 +1711,7 @@ void MYXCOL::ReadColumn(PGLOBAL g) /***********************************************************************/ /* WriteColumn: should never be called. */ /***********************************************************************/ -void MYXCOL::WriteColumn(PGLOBAL g) +void MYXCOL::WriteColumn(PGLOBAL) { assert(false); } // end of WriteColumn diff --git a/storage/connect/tabmysql.h b/storage/connect/tabmysql.h index 99930d43a57..17d7b190340 100644 --- a/storage/connect/tabmysql.h +++ b/storage/connect/tabmysql.h @@ -73,11 +73,11 @@ class TDBMYSQL : public TDBASE { public: // Constructor TDBMYSQL(PMYDEF tdp); - TDBMYSQL(PGLOBAL g, PTDBMY tdbp); + TDBMYSQL(PTDBMY tdbp); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_MYSQL;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYSQL(g, this);} + virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYSQL(this);} // Methods virtual PTDB CopyOne(PTABS t); @@ -180,11 +180,11 @@ class TDBMYEXC : public TDBMYSQL { public: // Constructors TDBMYEXC(PMYDEF tdp); - TDBMYEXC(PGLOBAL g, PTDBMYX tdbp); + TDBMYEXC(PTDBMYX tdbp); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_MYX;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYEXC(g, this);} + virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYEXC(this);} // Methods virtual PTDB CopyOne(PTABS t); diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index 7f7b1c5d50c..da3cafc3c8f 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -266,7 +266,7 @@ bool OCCURDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB OCCURDEF::GetTable(PGLOBAL g, MODE m) +PTDB OCCURDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc != FNC_COL) return new(g) TDBOCCUR(this); @@ -432,7 +432,7 @@ int TDBOCCUR::GetMaxSize(PGLOBAL g) /* In this sample, ROWID will be the (virtual) row number, */ /* while ROWNUM will be the occurence rank in the multiple column. */ /***********************************************************************/ -int TDBOCCUR::RowNumber(PGLOBAL g, bool b) +int TDBOCCUR::RowNumber(PGLOBAL, bool b) { return (b) ? M : N; } // end of RowNumber @@ -567,7 +567,7 @@ void OCCURCOL::ReadColumn(PGLOBAL g) /* ReadColumn: what this routine does is to access the Mth columns of */ /* list, extract its name and set to it the rank column value. */ /***********************************************************************/ -void RANKCOL::ReadColumn(PGLOBAL g) +void RANKCOL::ReadColumn(PGLOBAL) { PTDBOCCUR tdbp = (PTDBOCCUR)To_Tdb; PCOL *col = tdbp->Col; diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index 401ffa3780e..b36dcbf94af 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -376,7 +376,7 @@ bool PIVOTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB PIVOTDEF::GetTable(PGLOBAL g, MODE m) +PTDB PIVOTDEF::GetTable(PGLOBAL g, MODE) { return new(g) TDBPIVOT(this); } // end of GetTable @@ -634,7 +634,7 @@ bool TDBPIVOT::MakeViewColumns(PGLOBAL g) /***********************************************************************/ /* PIVOT GetMaxSize: returns the maximum number of rows in the table. */ /***********************************************************************/ -int TDBPIVOT::GetMaxSize(PGLOBAL g) +int TDBPIVOT::GetMaxSize(PGLOBAL g __attribute__((unused))) { #if 0 if (MaxSize < 0) @@ -649,7 +649,7 @@ int TDBPIVOT::GetMaxSize(PGLOBAL g) /* In this sample, ROWID will be the (virtual) row number, */ /* while ROWNUM will be the occurence rank in the multiple column. */ /***********************************************************************/ -int TDBPIVOT::RowNumber(PGLOBAL g, bool b) +int TDBPIVOT::RowNumber(PGLOBAL, bool b) { return (b) ? M : N; } // end of RowNumber @@ -806,7 +806,7 @@ int TDBPIVOT::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for PIVOT access methods. */ /***********************************************************************/ -int TDBPIVOT::DeleteDB(PGLOBAL g, int irc) +int TDBPIVOT::DeleteDB(PGLOBAL g, int) { sprintf(g->Message, MSG(NO_TABLE_DEL), "PIVOT"); return RC_FX; diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index 3ed182c5e33..623aeca36fe 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -3,7 +3,7 @@ /* ------------- */ /* Version 2.3 */ /* */ -/* Author Olivier BERTRAND 2004-2014 */ +/* Author Olivier BERTRAND 2004-2015 */ /* */ /* This program are the INI/CFG tables classes. */ /***********************************************************************/ @@ -70,7 +70,7 @@ INIDEF::INIDEF(void) /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /***********************************************************************/ -bool INIDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool INIDEF::DefineAM(PGLOBAL g, LPCSTR, int) { char buf[8]; @@ -96,7 +96,7 @@ bool INIDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB INIDEF::GetTable(PGLOBAL g, MODE m) +PTDB INIDEF::GetTable(PGLOBAL g, MODE) { PTDBASE tdbp; @@ -277,49 +277,27 @@ bool TDBINI::OpenDB(PGLOBAL g) /***********************************************************************/ /* Data Base read routine for INI access method. */ /***********************************************************************/ -int TDBINI::ReadDB(PGLOBAL g) +int TDBINI::ReadDB(PGLOBAL) { /*********************************************************************/ /* Now start the pseudo reading process. */ /*********************************************************************/ -#if 0 // INI tables are not indexable - if (To_Kindex) { - /*******************************************************************/ - /* Reading is by an index table. */ - /*******************************************************************/ - int recpos = To_Kindex->Fetch(g); + if (!Section) + Section = Seclist; + else + Section += (strlen(Section) + 1); - switch (recpos) { - case -1: // End of file reached - return RC_EF; - case -2: // No match for join - return RC_NF; - case -3: // Same record as last non null one - return RC_OK; - default: - Section = (char*)recpos; // No good on 64 bit machines - } // endswitch recpos - - } else { -#endif // 0 - if (!Section) - Section = Seclist; - else - Section += (strlen(Section) + 1); - - if (trace > 1) - htrc("INI ReadDB: section=%s N=%d\n", Section, N); - - N++; -//} // endif To_Kindex + if (trace > 1) + htrc("INI ReadDB: section=%s N=%d\n", Section, N); + N++; return (*Section) ? RC_OK : RC_EF; } // end of ReadDB /***********************************************************************/ /* WriteDB: Data Base write routine for INI access methods. */ /***********************************************************************/ -int TDBINI::WriteDB(PGLOBAL g) +int TDBINI::WriteDB(PGLOBAL) { // This is to check that section name was given when inserting if (Mode == MODE_INSERT) @@ -365,7 +343,7 @@ int TDBINI::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for INI access methods. */ /***********************************************************************/ -void TDBINI::CloseDB(PGLOBAL g) +void TDBINI::CloseDB(PGLOBAL) { #if !defined(WIN32) PROFILE_Close(Ifile); @@ -377,7 +355,7 @@ void TDBINI::CloseDB(PGLOBAL g) /***********************************************************************/ /* INICOL public constructor. */ /***********************************************************************/ -INICOL::INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +INICOL::INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -471,7 +449,7 @@ bool INICOL::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) /* from the corresponding section, extract from it the key value */ /* corresponding to this column name and convert it to buffer type. */ /***********************************************************************/ -void INICOL::ReadColumn(PGLOBAL g) +void INICOL::ReadColumn(PGLOBAL) { PTDBINI tdbp = (PTDBINI)To_Tdb; @@ -747,7 +725,7 @@ int TDBXIN::ReadDB(PGLOBAL g) /***********************************************************************/ /* WriteDB: Data Base write routine for XIN access methods. */ /***********************************************************************/ -int TDBXIN::WriteDB(PGLOBAL g) +int TDBXIN::WriteDB(PGLOBAL) { // To check that section and key names were given when inserting if (Mode == MODE_INSERT) { @@ -809,7 +787,7 @@ XINCOL::XINCOL(XINCOL *col1, PTDB tdbp) : INICOL(col1, tdbp) /* from the corresponding section, extract from it the key value */ /* corresponding to this column name and convert it to buffer type. */ /***********************************************************************/ -void XINCOL::ReadColumn(PGLOBAL g) +void XINCOL::ReadColumn(PGLOBAL) { PTDBXIN tdbp = (PTDBXIN)To_Tdb; diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 2bf26a5f183..f2affe75d2b 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -101,7 +101,7 @@ TBLDEF::TBLDEF(void) /**************************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /**************************************************************************/ -bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR, int) { char *tablist, *dbname, *def = NULL; @@ -161,7 +161,7 @@ bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new Table Description Block. */ /***********************************************************************/ -PTDB TBLDEF::GetTable(PGLOBAL g, MODE m) +PTDB TBLDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc == FNC_COL) return new(g) TDBTBC(this); @@ -202,7 +202,7 @@ PCOL TDBTBL::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ /* InsertSpecialColumn: Put a special column ahead of the column list.*/ /***********************************************************************/ -PCOL TDBTBL::InsertSpecialColumn(PGLOBAL g, PCOL scp) +PCOL TDBTBL::InsertSpecialColumn(PCOL scp) { PCOL colp; @@ -548,7 +548,7 @@ int TDBTBL::ReadDB(PGLOBAL g) /***********************************************************************/ /* ReadColumn: */ /***********************************************************************/ -void TBTBLK::ReadColumn(PGLOBAL g) +void TBTBLK::ReadColumn(PGLOBAL) { if (trace) htrc("TBT ReadColumn: name=%s\n", Name); diff --git a/storage/connect/tabtbl.h b/storage/connect/tabtbl.h index 8bf440985ea..9d3f297f9e7 100644 --- a/storage/connect/tabtbl.h +++ b/storage/connect/tabtbl.h @@ -81,7 +81,7 @@ class DllExport TDBTBL : public TDBPRX { virtual int Cardinality(PGLOBAL g); virtual int GetMaxSize(PGLOBAL g); virtual int RowNumber(PGLOBAL g, bool b = FALSE); - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL scp); + virtual PCOL InsertSpecialColumn(PCOL scp); virtual bool OpenDB(PGLOBAL g); virtual int ReadDB(PGLOBAL g); diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index c26d766af01..5ed958b2f7a 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -292,7 +292,7 @@ PRXDEF::PRXDEF(void) /***********************************************************************/ /* DefineAM: define specific AM block values from XCOL file. */ /***********************************************************************/ -bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR, int) { char *pn, *db, *tab, *def = NULL; @@ -322,7 +322,7 @@ bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB PRXDEF::GetTable(PGLOBAL g, MODE mode) +PTDB PRXDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc == FNC_COL) return new(g) TDBTBC(this); @@ -341,7 +341,7 @@ TDBPRX::TDBPRX(PPRXDEF tdp) : TDBASE(tdp) Tdbp = NULL; // The object table } // end of TDBPRX constructor -TDBPRX::TDBPRX(PGLOBAL g, PTDBPRX tdbp) : TDBASE(tdbp) +TDBPRX::TDBPRX(PTDBPRX tdbp) : TDBASE(tdbp) { Tdbp = tdbp->Tdbp; } // end of TDBPRX copy constructor @@ -353,7 +353,7 @@ PTDB TDBPRX::CopyOne(PTABS t) PPRXCOL cp1, cp2; PGLOBAL g = t->G; - tp = new(g) TDBPRX(g, this); + tp = new(g) TDBPRX(this); for (cp1 = (PPRXCOL)Columns; cp1; cp1 = (PPRXCOL)cp1->GetNext()) { cp2 = new(g) PRXCOL(cp1, tp); // Make a copy diff --git a/storage/connect/tabutil.h b/storage/connect/tabutil.h index c5935d72184..b320d169b36 100644 --- a/storage/connect/tabutil.h +++ b/storage/connect/tabutil.h @@ -59,12 +59,12 @@ class DllExport TDBPRX : public TDBASE { public: // Constructors TDBPRX(PPRXDEF tdp); - TDBPRX(PGLOBAL g, PTDBPRX tdbp); + TDBPRX(PTDBPRX tdbp); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_PRX;} virtual PTDB Duplicate(PGLOBAL g) - {return (PTDB)new(g) TDBPRX(g, this);} + {return (PTDB)new(g) TDBPRX(this);} // Methods virtual PTDB CopyOne(PTABS t); diff --git a/storage/connect/tabvct.cpp b/storage/connect/tabvct.cpp index 3ed40540395..6394ea5e2d6 100644 --- a/storage/connect/tabvct.cpp +++ b/storage/connect/tabvct.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -94,7 +94,7 @@ PVBLK AllocValBlock(PGLOBAL, void *, int, int, int, int, /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /***********************************************************************/ -bool VCTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool VCTDEF::DefineAM(PGLOBAL g, LPCSTR, int poff) { DOSDEF::DefineAM(g, "BIN", poff); @@ -290,7 +290,7 @@ PCOL TDBVCT::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ /* VEC tables are not ready yet to use temporary files. */ /***********************************************************************/ -bool TDBVCT::IsUsingTemp(PGLOBAL g) +bool TDBVCT::IsUsingTemp(PGLOBAL) { // For developpers return (UseTemp() == TMP_TEST); @@ -570,7 +570,7 @@ void VCTCOL::ReadColumn(PGLOBAL g) /* On each change of block the buffer is written back to file and */ /* in mode Insert the buffer is filled with the block to update. */ /***********************************************************************/ -void VCTCOL::WriteColumn(PGLOBAL g) +void VCTCOL::WriteColumn(PGLOBAL) { PTXF txfp = ((PTDBVCT)To_Tdb)->Txfp;; diff --git a/storage/connect/tabvir.cpp b/storage/connect/tabvir.cpp index b4c76f5ad56..356fc981357 100644 --- a/storage/connect/tabvir.cpp +++ b/storage/connect/tabvir.cpp @@ -29,7 +29,7 @@ /***********************************************************************/ /* Return the unique column definition to MariaDB. */ /***********************************************************************/ -PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info) +PQRYRES VirColumns(PGLOBAL g, bool info) { int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_STRING, TYPE_STRING}; @@ -95,7 +95,7 @@ PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info) /***********************************************************************/ /* GetTable: makes a new Table Description Block. */ /***********************************************************************/ -PTDB VIRDEF::GetTable(PGLOBAL g, MODE m) +PTDB VIRDEF::GetTable(PGLOBAL g, MODE) { // Column blocks will be allocated only when needed. if (Catfunc == FNC_COL) @@ -241,7 +241,7 @@ bool TDBVIR::OpenDB(PGLOBAL g) /***********************************************************************/ /* Data Base read routine for the VIR access method. */ /***********************************************************************/ -int TDBVIR::ReadDB(PGLOBAL g) +int TDBVIR::ReadDB(PGLOBAL) { return (++N >= Size) ? RC_EF : RC_OK; } // end of ReadDB @@ -258,7 +258,7 @@ int TDBVIR::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for the VIR access methods. */ /***********************************************************************/ -int TDBVIR::DeleteDB(PGLOBAL g, int irc) +int TDBVIR::DeleteDB(PGLOBAL g, int) { sprintf(g->Message, MSG(VIR_NO_DELETE), To_Def->GetType()); return RC_FX; @@ -269,7 +269,7 @@ int TDBVIR::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* VIRCOL public constructor. */ /***********************************************************************/ -VIRCOL::VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +VIRCOL::VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -299,7 +299,7 @@ void VIRCOL::ReadColumn(PGLOBAL g) /***********************************************************************/ PQRYRES TDBVICL::GetResult(PGLOBAL g) { - return VirColumns(g, NULL, NULL, false); + return VirColumns(g, false); } // end of GetResult /* ------------------------- End of Virtual -------------------------- */ diff --git a/storage/connect/tabvir.h b/storage/connect/tabvir.h index 8d0caa257e7..a53aceaeceb 100644 --- a/storage/connect/tabvir.h +++ b/storage/connect/tabvir.h @@ -11,7 +11,7 @@ typedef class TDBVIR *PTDBVIR; /***********************************************************************/ /* Return the unique column definition to MariaDB. */ /***********************************************************************/ -PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info); +PQRYRES VirColumns(PGLOBAL g, bool info); /* --------------------------- VIR classes --------------------------- */ diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index dffbaf6e187..7d6d94d34c0 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -83,7 +83,7 @@ bool XCLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB XCLDEF::GetTable(PGLOBAL g, MODE mode) +PTDB XCLDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc == FNC_COL) return new(g) TDBTBC(this); @@ -117,7 +117,7 @@ PCOL TDBXCL::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) PCOL colp; if (!stricmp(cdp->GetName(), Xcolumn)) { - Xcolp = new(g) XCLCOL(g, cdp, this, cprec, n); + Xcolp = new(g) XCLCOL(cdp, this, cprec, n); colp = Xcolp; } else colp = new(g) PRXCOL(cdp, this, cprec, n); @@ -144,7 +144,7 @@ int TDBXCL::GetMaxSize(PGLOBAL g) /* For this table type, ROWID is the (virtual) row number, */ /* while ROWNUM is be the occurence rank in the multiple column. */ /***********************************************************************/ -int TDBXCL::RowNumber(PGLOBAL g, bool b) +int TDBXCL::RowNumber(PGLOBAL, bool b) { return (b) ? M : N; } // end of RowNumber @@ -232,7 +232,7 @@ int TDBXCL::ReadDB(PGLOBAL g) /***********************************************************************/ /* XCLCOL public constructor. */ /***********************************************************************/ -XCLCOL::XCLCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) +XCLCOL::XCLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : PRXCOL(cdp, tdbp, cprec, i, "XCL") { // Set additional XXL access method information for column. diff --git a/storage/connect/tabxcl.h b/storage/connect/tabxcl.h index ed15a67b629..291f0b4263a 100644 --- a/storage/connect/tabxcl.h +++ b/storage/connect/tabxcl.h @@ -85,7 +85,7 @@ class XCLCOL : public PRXCOL { friend class TDBXCL; public: // Constructors - XCLCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); + XCLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); // Methods using PRXCOL::Init; diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 1c1ff8a2ffe..46f762efc35 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -118,7 +118,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; char *op, colname[65], fmt[129], buf[512]; - int i, j, lvl, rc, n = 0; + int i, j, lvl, n = 0; int ncol = sizeof(buftyp) / sizeof(int); bool ok = true; PXCL xcol, xcp, fxcp = NULL, pxcp = NULL; @@ -164,7 +164,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) txmp = new(g) TDBXML(tdp); if (txmp->Initialize(g)) - return NULL; + goto err; xcol = new(g) XMCOL; colname[64] = 0; @@ -224,8 +224,16 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) if (vp->atp) { strncpy(colname, vp->atp->GetName(g), sizeof(colname)); strncat(xcol->Name, colname, 64); - rc = vp->atp->GetText(g, buf, sizeof(buf)); - strncat(fmt, "@", sizeof(fmt)); + + switch (vp->atp->GetText(g, buf, sizeof(buf))) { + case RC_INFO: + PushWarning(g, txmp); + case RC_OK: + strncat(fmt, "@", sizeof(fmt)); + break; + default: + goto err; + } // enswitch rc if (j) strncat(fmt, colname, sizeof(fmt)); @@ -273,7 +281,15 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) } else ok = true; - rc = node->GetContent(g, buf, sizeof(buf)); + switch (node->GetContent(g, buf, sizeof(buf))) { + case RC_INFO: + PushWarning(g, txmp); + case RC_OK: + break; + default: + goto err; + } // enswitch rc + } // endif atp; xcol->Len = strlen(buf); @@ -313,10 +329,6 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) pxcp = xcp; -// for (j = lvl - 1; j >= 0; j--) -// if (jrp[j] && (jrp[j] = jrp[j]->GetNext())) -// goto more; - if (vp->atp) vp->atp = vp->atp->GetNext(g); @@ -421,8 +433,6 @@ XMLDEF::XMLDEF(void) bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { char *defrow, *defcol, buf[10]; -//void *memp = Cat->GetDescp(); -//PSZ dbfile = Cat->GetDescFile(); Fn = GetStringCatInfo(g, "Filename", NULL); Encoding = GetStringCatInfo(g, "Encoding", "UTF-8"); @@ -479,12 +489,6 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Header = GetIntCatInfo("Header", 0); GetCharCatInfo("Xmlsup", "*", buf, sizeof(buf)); -//if (*buf == '*') // Try the old (deprecated) option -// GetCharCatInfo("Method", "*", buf, sizeof(buf)); - -//if (*buf == '*') // Is there a default for the database? -// GetCharCatInfo("Defxml", XMLSUP, buf, sizeof(buf)); - // Note that if no support is specified, the default is MS-DOM // on Windows and libxml2 otherwise if (*buf == '*') @@ -499,7 +503,6 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) // Get eventual table node attribute Attrib = GetStringCatInfo(g, "Attribute", ""); Hdattr = GetStringCatInfo(g, "HeadAttr", ""); - return false; } // end of DefineAM @@ -519,30 +522,6 @@ PTDB XMLDEF::GetTable(PGLOBAL g, MODE m) return tdbp; } // end of GetTable -#if 0 -/***********************************************************************/ -/* DeleteTableFile: Delete XML table files using platform API. */ -/***********************************************************************/ -bool XMLDEF::DeleteTableFile(PGLOBAL g) - { - char filename[_MAX_PATH]; - bool rc; - - // Delete the XML table file if not protected - if (!IsReadOnly()) { - PlugSetPath(filename, Fn, GetPath()); -#if defined(WIN32) - rc = !DeleteFile(filename); -#else // UNIX - rc = remove(filename); -#endif // UNIX - } else - rc =true; - - return rc; // Return true if error - } // end of DeleteTableFile -#endif // 0 - /* ------------------------- TDBXML Class ---------------------------- */ /***********************************************************************/ @@ -667,7 +646,7 @@ PCOL TDBXML::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ /* InsertSpecialColumn: Put a special column ahead of the column list.*/ /***********************************************************************/ -PCOL TDBXML::InsertSpecialColumn(PGLOBAL g, PCOL colp) +PCOL TDBXML::InsertSpecialColumn(PCOL colp) { if (!colp->IsSpecial()) return NULL; @@ -854,7 +833,6 @@ bool TDBXML::Initialize(PGLOBAL g) To_Xb = Docp->LinkXblock(g, Mode, rc, filename); // Add a CONNECT comment node -// sprintf(buf, " Created by CONNECT %s ", version); strcpy(buf, " Created by the MariaDB CONNECT Storage Engine"); Docp->AddComment(g, buf); @@ -1279,7 +1257,6 @@ void TDBXML::CloseDB(PGLOBAL g) if (Docp) { if (Changed) { char filename[_MAX_PATH]; -// PDBUSER dup = (PDBUSER)g->Activityp->Aptr; // We used the file name relative to recorded datapath PlugSetPath(filename, Xfile, GetPath()); @@ -1321,7 +1298,6 @@ void TDBXML::CloseDB(PGLOBAL g) NewRow = false; Hasnod = false; Write = false; -// Bufdone = false; Nodedone = false; Void = false; Nrow = -1; @@ -1413,8 +1389,6 @@ bool XMLCOL::AllocBuf(PGLOBAL g, bool mode) if (Valbuf) return false; // Already done -//Valbuf = (char*)PlugSubAlloc(g, NULL, Long + 1); -//Valbuf[Long] = '\0'; return ParseXpath(g, mode); } // end of AllocBuf @@ -1506,8 +1480,6 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode) // HTML like table, columns are retrieved by position new(this) XPOSCOL(Value); // Change the class of this column Inod = -1; -// Tdbp->Hasnod = true; -// return false; } else if (Type == 0 && !mode) { strcat(strcat(pbuf, "@"), Name); } else { // Type == 1 @@ -1657,7 +1629,6 @@ void XMLCOL::WriteColumn(PGLOBAL g) int done = 0; int i, n, k = 0; PXNODE TopNode = NULL; -//PXATTR AttNode = NULL; if (trace > 1) htrc("XML WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", @@ -1892,7 +1863,6 @@ void XMULCOL::WriteColumn(PGLOBAL g) int done = 0; int i, n, len, k = 0; PXNODE TopNode = NULL; -//PXATTR AttNode = NULL; if (trace) htrc("XML WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", diff --git a/storage/connect/tabxml.h b/storage/connect/tabxml.h index f6cfd3fb510..4eae5c082c1 100644 --- a/storage/connect/tabxml.h +++ b/storage/connect/tabxml.h @@ -84,7 +84,7 @@ class DllExport TDBXML : public TDBASE { // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); + virtual PCOL InsertSpecialColumn(PCOL colp); //virtual int GetMaxSame(PGLOBAL g) {return (Xpand) ? Limit : 1;} virtual int Cardinality(PGLOBAL g); virtual int GetMaxSize(PGLOBAL g); diff --git a/storage/connect/user_connect.cc b/storage/connect/user_connect.cc index 4affe447b00..34d192361a5 100644 --- a/storage/connect/user_connect.cc +++ b/storage/connect/user_connect.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2014 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ */ /****************************************************************************/ -/* Author: Olivier Bertrand -- bertrandop@gmail.com -- 2004-2014 */ +/* Author: Olivier Bertrand -- bertrandop@gmail.com -- 2004-2015 */ /****************************************************************************/ #ifdef USE_PRAGMA_IMPLEMENTATION #pragma implementation // gcc: Class implementation @@ -63,7 +63,7 @@ void SetWorkSize(uint); /****************************************************************************/ /* Constructor. */ /****************************************************************************/ -user_connect::user_connect(THD *thd, const char *dbn) +user_connect::user_connect(THD *thd) { thdp= thd; next= NULL; diff --git a/storage/connect/user_connect.h b/storage/connect/user_connect.h index 44e4e94fa8a..7f37973f378 100644 --- a/storage/connect/user_connect.h +++ b/storage/connect/user_connect.h @@ -45,7 +45,7 @@ class user_connect friend int connect_done_func(void *); public: // Constructor - user_connect(THD *thd, const char *dbn); + user_connect(THD *thd); // Destructor virtual ~user_connect(); diff --git a/storage/connect/valblk.cpp b/storage/connect/valblk.cpp index e731ad156d9..94e09e1a85c 100644 --- a/storage/connect/valblk.cpp +++ b/storage/connect/valblk.cpp @@ -132,7 +132,7 @@ VALBLK::VALBLK(void *mp, int type, int nval, bool un) /***********************************************************************/ /* Raise error for numeric types. */ /***********************************************************************/ -PSZ VALBLK::GetCharValue(int n) +PSZ VALBLK::GetCharValue(int) { PGLOBAL& g = Global; @@ -145,7 +145,7 @@ PSZ VALBLK::GetCharValue(int n) /***********************************************************************/ /* Set format so formatted dates can be converted on input. */ /***********************************************************************/ -bool VALBLK::SetFormat(PGLOBAL g, PSZ fmt, int len, int year) +bool VALBLK::SetFormat(PGLOBAL g, PSZ, int, int) { sprintf(g->Message, MSG(NO_DATE_FMT), Type); return true; @@ -752,7 +752,7 @@ double CHRBLK::GetFloatValue(int n) /***********************************************************************/ /* STRING GetCharString: get string representation of a char value. */ /***********************************************************************/ -char *CHRBLK::GetCharString(char *p, int n) +char *CHRBLK::GetCharString(char *, int n) { return (char *)GetValPtrEx(n); } // end of GetCharString diff --git a/storage/connect/valblk.h b/storage/connect/valblk.h index 5a98257f98f..f6eb7258a77 100644 --- a/storage/connect/valblk.h +++ b/storage/connect/valblk.h @@ -95,17 +95,17 @@ class VALBLK : public BLOCK { virtual bool IsCi(void) {return false;} // Methods - virtual void SetValue(short sval, int n) {assert(false);} - virtual void SetValue(ushort sval, int n) {assert(false);} - virtual void SetValue(int lval, int n) {assert(false);} - virtual void SetValue(uint lval, int n) {assert(false);} - virtual void SetValue(longlong lval, int n) {assert(false);} - virtual void SetValue(ulonglong lval, int n) {assert(false);} - virtual void SetValue(double fval, int n) {assert(false);} - virtual void SetValue(char cval, int n) {assert(false);} - virtual void SetValue(uchar cval, int n) {assert(false);} - virtual void SetValue(PSZ sp, int n) {assert(false);} - virtual void SetValue(char *sp, uint len, int n) {assert(false);} + virtual void SetValue(short, int) {assert(false);} + virtual void SetValue(ushort, int) {assert(false);} + virtual void SetValue(int, int) {assert(false);} + virtual void SetValue(uint, int) {assert(false);} + virtual void SetValue(longlong, int) {assert(false);} + virtual void SetValue(ulonglong, int) {assert(false);} + virtual void SetValue(double, int) {assert(false);} + virtual void SetValue(char, int) {assert(false);} + virtual void SetValue(uchar, int) {assert(false);} + virtual void SetValue(PSZ, int) {assert(false);} + virtual void SetValue(char *, uint, int) {assert(false);} virtual void SetValue(PVAL valp, int n) = 0; virtual void SetValue(PVBLK pv, int n1, int n2) = 0; virtual void SetMin(PVAL valp, int n) = 0; @@ -271,7 +271,7 @@ class STRBLK : public VALBLK { // Implementation virtual void SetNull(int n, bool b) {if (b) {Strp[n] = NULL;}} virtual bool IsNull(int n) {return Strp[n] == NULL;} - virtual void SetNullable(bool b) {} // Always nullable + virtual void SetNullable(bool) {} // Always nullable virtual bool Init(PGLOBAL g, bool check); virtual int GetVlen(void) {return sizeof(PSZ);} virtual PSZ GetCharValue(int n) {return Strp[n];} @@ -284,7 +284,7 @@ class STRBLK : public VALBLK { virtual longlong GetBigintValue(int n); virtual ulonglong GetUBigintValue(int n); virtual double GetFloatValue(int n) {return atof(Strp[n]);} - virtual char *GetCharString(char *p, int n) {return Strp[n];} + virtual char *GetCharString(char *, int n) {return Strp[n];} virtual void Reset(int n) {Strp[n] = NULL;} // Methods diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index d14fc367cc7..5a8b1de326a 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -475,7 +475,7 @@ PVAL AllocateValue(PGLOBAL g, PVAL valp, int newtype, int uns) break; case TYPE_DATE: - vp = new(g) DTVAL(g, valp->GetIntValue()); + vp = new(g) DTVAL(valp->GetIntValue()); break; case TYPE_DOUBLE: vp = new(g) TYPVAL(valp->GetFloatValue(), TYPE_DOUBLE, @@ -551,7 +551,7 @@ BYTE VALUE::TestValue(PVAL vp) /***********************************************************************/ /* Compute a function on a string. */ /***********************************************************************/ -bool VALUE::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) +bool VALUE::Compute(PGLOBAL g, PVAL *, int, OPVAL) { strcpy(g->Message, "Compute not implemented for this value type"); return true; @@ -976,7 +976,7 @@ ulonglong TYPVAL::MinMaxVal(bool b) {return (b) ? 0xFFFFFFFFFFFFFFFFLL : 0;} template <> -double TYPVAL::MinMaxVal(bool b) +double TYPVAL::MinMaxVal(bool) {assert(false); return 0.0;} template <> @@ -1566,7 +1566,7 @@ bool TYPVAL::GetBinValue(void *buf, int buflen, bool go) /***********************************************************************/ /* STRING ShowValue: get string representation of a char value. */ /***********************************************************************/ -char *TYPVAL::ShowValue(char *buf, int len) +char *TYPVAL::ShowValue(char *, int) { return Strp; } // end of ShowValue @@ -1574,7 +1574,7 @@ char *TYPVAL::ShowValue(char *buf, int len) /***********************************************************************/ /* STRING GetCharString: get string representation of a char value. */ /***********************************************************************/ -char *TYPVAL::GetCharString(char *p) +char *TYPVAL::GetCharString(char *) { return Strp; } // end of GetCharString @@ -1681,7 +1681,7 @@ bool TYPVAL::FormatValue(PVAL vp, char *fmt) /***********************************************************************/ /* STRING SetFormat function (used to set SELECT output format). */ /***********************************************************************/ -bool TYPVAL::SetConstFormat(PGLOBAL g, FORMAT& fmt) +bool TYPVAL::SetConstFormat(PGLOBAL, FORMAT& fmt) { fmt.Type[0] = 'C'; fmt.Length = Len; @@ -2300,7 +2300,7 @@ char *BINVAL::ShowValue(char *buf, int len) /***********************************************************************/ /* BINVAL GetCharString: get string representation of a binary value. */ /***********************************************************************/ -char *BINVAL::GetCharString(char *p) +char *BINVAL::GetCharString(char *) { if (!Chrp) Chrp = (char*)PlugSubAlloc(Global, NULL, Clen * 2 + 1); @@ -2349,7 +2349,7 @@ bool BINVAL::FormatValue(PVAL vp, char *fmt) /***********************************************************************/ /* BINVAL SetFormat function (used to set SELECT output format). */ /***********************************************************************/ -bool BINVAL::SetConstFormat(PGLOBAL g, FORMAT& fmt) +bool BINVAL::SetConstFormat(PGLOBAL, FORMAT& fmt) { fmt.Type[0] = 'B'; fmt.Length = Clen; @@ -2379,7 +2379,7 @@ DTVAL::DTVAL(PGLOBAL g, int n, int prec, PSZ fmt) /***********************************************************************/ /* DTVAL public constructor from int. */ /***********************************************************************/ -DTVAL::DTVAL(PGLOBAL g, int n) : TYPVAL(n, TYPE_DATE) +DTVAL::DTVAL(int n) : TYPVAL(n, TYPE_DATE) { Pdtp = NULL; Len = 19; diff --git a/storage/connect/value.h b/storage/connect/value.h index c5aeb5c2a2f..207944594f1 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -94,18 +94,18 @@ class DllExport VALUE : public BLOCK { virtual bool SetValue_pval(PVAL valp, bool chktype = false) = 0; virtual bool SetValue_char(char *p, int n) = 0; virtual void SetValue_psz(PSZ s) = 0; - virtual void SetValue_bool(bool b) {assert(FALSE);} + virtual void SetValue_bool(bool) {assert(FALSE);} virtual int CompareValue(PVAL vp) = 0; virtual BYTE TestValue(PVAL vp); - virtual void SetValue(char c) {assert(false);} - virtual void SetValue(uchar c) {assert(false);} - virtual void SetValue(short i) {assert(false);} - virtual void SetValue(ushort i) {assert(false);} - virtual void SetValue(int n) {assert(false);} - virtual void SetValue(uint n) {assert(false);} - virtual void SetValue(longlong n) {assert(false);} - virtual void SetValue(ulonglong n) {assert(false);} - virtual void SetValue(double f) {assert(false);} + virtual void SetValue(char) {assert(false);} + virtual void SetValue(uchar) {assert(false);} + virtual void SetValue(short) {assert(false);} + virtual void SetValue(ushort) {assert(false);} + virtual void SetValue(int) {assert(false);} + virtual void SetValue(uint) {assert(false);} + virtual void SetValue(longlong) {assert(false);} + virtual void SetValue(ulonglong) {assert(false);} + virtual void SetValue(double) {assert(false);} virtual void SetValue_pvblk(PVBLK blk, int n) = 0; virtual void SetBinValue(void *p) = 0; virtual bool GetBinValue(void *buf, int buflen, bool go) = 0; @@ -338,7 +338,7 @@ class DllExport BINVAL: public VALUE { virtual void SetValue(double f); virtual void SetBinValue(void *p); virtual bool GetBinValue(void *buf, int buflen, bool go); - virtual int CompareValue(PVAL vp) {assert(false); return 0;} + virtual int CompareValue(PVAL) {assert(false); return 0;} virtual char *ShowValue(char *buf, int); virtual char *GetCharString(char *p); virtual bool IsEqual(PVAL vp, bool chktype); @@ -359,11 +359,11 @@ class DllExport DTVAL : public TYPVAL { public: // Constructors DTVAL(PGLOBAL g, int n, int p, PSZ fmt); - DTVAL(PGLOBAL g, PSZ s, int n); - DTVAL(PGLOBAL g, short i); - DTVAL(PGLOBAL g, int n); - DTVAL(PGLOBAL g, longlong n); - DTVAL(PGLOBAL g, double f); +//DTVAL(PGLOBAL g, PSZ s, int n); +//DTVAL(PGLOBAL g, short i); + DTVAL(int n); +//DTVAL(PGLOBAL g, longlong n); +//DTVAL(PGLOBAL g, double f); // Implementation virtual bool IsZero(void) {return Null;} diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index 024a9c081cd..ee8dc3ac4cb 100755 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -1,7 +1,7 @@ /***************** Xindex C++ Class Xindex Code (.CPP) *****************/ /* Name: XINDEX.CPP Version 2.9 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ /* */ /* This file contains the class XINDEX implementation code. */ /***********************************************************************/ @@ -179,7 +179,7 @@ XXBASE::XXBASE(PTDBDOS tbxp, bool b) : CSORT(b), /***********************************************************************/ /* Make file output of XINDEX contents. */ /***********************************************************************/ -void XXBASE::Print(PGLOBAL g, FILE *f, uint n) +void XXBASE::Print(PGLOBAL, FILE *f, uint n) { char m[64]; @@ -191,7 +191,7 @@ void XXBASE::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of XINDEX contents. */ /***********************************************************************/ -void XXBASE::Print(PGLOBAL g, char *ps, uint z) +void XXBASE::Print(PGLOBAL, char *ps, uint z) { *ps = '\0'; strncat(ps, "Xindex", z); @@ -287,7 +287,7 @@ int XINDEX::Qcompare(int *i1, int *i2) /* Sure enough, it is done while records are read and permit to avoid */ /* reading the table while doing the join (Dynamic index only) */ /***********************************************************************/ -bool XINDEX::AddColumns(PIXDEF xdp) +bool XINDEX::AddColumns(void) { if (!Dynamic) return false; // Not applying to static index @@ -377,7 +377,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) To_LastCol = prev; - if (AddColumns(sxp)) { + if (AddColumns()) { PCOL kolp = To_Cols[0]; // Temporary while imposing Nk = 1 i = 0; @@ -733,7 +733,7 @@ int XINDEX::ColMaxSame(PXCOL kp) /* Reorder: use the sort index to reorder the data in storage so */ /* it will be physically sorted and sort index can be removed. */ /***********************************************************************/ -bool XINDEX::Reorder(PGLOBAL g) +bool XINDEX::Reorder(PGLOBAL g __attribute__((unused))) { register int i, j, k, n; bool sorted = true; @@ -1585,7 +1585,7 @@ int XINDEX::Range(PGLOBAL g, int limit, bool incl) if (++i == Nval) break; } // endfor kp - if ((k = FastFind(Nval)) < Num_K) + if ((k = FastFind()) < Num_K) n = k; // if (limit) // n = (Mul) ? k : kp->Val_K; @@ -1826,7 +1826,7 @@ int XINDEX::Fetch(PGLOBAL g) if (trace > 1) htrc("Fetch: Looking for new value\n"); - Cur_K = FastFind(Nval); + Cur_K = FastFind(); if (Cur_K >= Num_K) /*************************************************************/ @@ -1857,12 +1857,12 @@ int XINDEX::Fetch(PGLOBAL g) /* FastFind: Returns the index of matching record in a join using an */ /* optimized algorithm based on dichotomie and optimized comparing. */ /***********************************************************************/ -int XINDEX::FastFind(int nv) +int XINDEX::FastFind(void) { register int curk, sup, inf, i= 0, k, n = 2; register PXCOL kp, kcp; - assert((int)nv == Nval); +//assert((int)nv == Nval); if (Nblk && Op == OP_EQ) { // Look in block values to find in which block to search @@ -2018,7 +2018,7 @@ int XINDXS::Range(PGLOBAL g, int limit, bool incl) /*********************************************************************/ if (xp->GetType() == TYPE_CONST) { kp->Valp->SetValue_pval(xp->GetValue(), !kp->Prefix); - k = FastFind(Nval); + k = FastFind(); if (k < Num_K || Op != OP_EQ) if (limit) @@ -2162,7 +2162,7 @@ int XINDXS::Fetch(PGLOBAL g) if (trace > 1) htrc("Fetch: Looking for new value\n"); - Cur_K = FastFind(1); + Cur_K = FastFind(); if (Cur_K >= Num_K) // Rank not whithin index table, signal record not found @@ -2190,7 +2190,7 @@ int XINDXS::Fetch(PGLOBAL g) /* FastFind: Returns the index of matching indexed record using an */ /* optimized algorithm based on dichotomie and optimized comparing. */ /***********************************************************************/ -int XINDXS::FastFind(int nk) +int XINDXS::FastFind(void) { register int sup, inf, i= 0, n = 2; register PXCOL kcp = To_KeyCol; @@ -2360,7 +2360,8 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) /***********************************************************************/ /* Move into an index file. */ /***********************************************************************/ -bool XFILE::Seek(PGLOBAL g, int low, int high, int origin) +bool XFILE::Seek(PGLOBAL g, int low, int high __attribute__((unused)), + int origin) { #if defined(_DEBUG) assert(high == 0); @@ -2371,7 +2372,6 @@ bool XFILE::Seek(PGLOBAL g, int low, int high, int origin) return true; } // endif -//ftell(Xfile); return false; } // end of Seek @@ -2819,7 +2819,7 @@ void XHUGE::Close(char *fn, int id) /***********************************************************************/ /* Don't know whether this is possible for huge files. */ /***********************************************************************/ -void *XHUGE::FileView(PGLOBAL g, char *fn) +void *XHUGE::FileView(PGLOBAL g, char *) { strcpy(g->Message, MSG(NO_PART_MAP)); return NULL; @@ -2879,7 +2879,7 @@ bool XXROW::Init(PGLOBAL g) /***********************************************************************/ /* RANGE: Tell how many record exist in a given value range. */ /***********************************************************************/ -int XXROW::Range(PGLOBAL g, int limit, bool incl) +int XXROW::Range(PGLOBAL, int limit, bool incl) { int n = Valp->GetIntValue(); @@ -2895,7 +2895,7 @@ int XXROW::Range(PGLOBAL g, int limit, bool incl) /***********************************************************************/ /* XXROW: Fetch a physical or logical record. */ /***********************************************************************/ -int XXROW::Fetch(PGLOBAL g) +int XXROW::Fetch(PGLOBAL) { if (Num_K == 0) return -1; // means end of file @@ -2904,7 +2904,7 @@ int XXROW::Fetch(PGLOBAL g) /* Look for a key equal to the link column of previous table, */ /* and return its rank whithin the index table. */ /*********************************************************************/ - Cur_K = FastFind(1); + Cur_K = FastFind(); if (Cur_K >= Num_K) /*******************************************************************/ @@ -2926,7 +2926,7 @@ int XXROW::Fetch(PGLOBAL g) /***********************************************************************/ /* FastFind: Returns the index of matching record in a join. */ /***********************************************************************/ -int XXROW::FastFind(int nk) +int XXROW::FastFind(void) { int n = Valp->GetIntValue(); diff --git a/storage/connect/xindex.h b/storage/connect/xindex.h index 6e40e9b160e..079412b32cf 100644 --- a/storage/connect/xindex.h +++ b/storage/connect/xindex.h @@ -1,7 +1,7 @@ /*************** Xindex H Declares Source Code File (.H) ***************/ /* Name: XINDEX.H Version 3.5 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2004 - 2013 */ +/* (C) Copyright to the author Olivier BERTRAND 2004 - 2015 */ /* */ /* This file contains the XINDEX class declares. */ /***********************************************************************/ @@ -205,12 +205,11 @@ class DllExport XXBASE : public CSORT, public BLOCK { #endif // XMAP virtual int MaxRange(void) {return 1;} virtual int Fetch(PGLOBAL g) = 0; - virtual bool NextVal(bool eq) {return true;} + virtual bool NextVal(bool) {return true;} virtual bool PrevVal(void) {return true;} - virtual int FastFind(int nk) = 0; - virtual bool Reorder(PGLOBAL g) {return true;} - virtual int Range(PGLOBAL g, int limit = 0, bool incl = true) - {return -1;} // Means error + virtual int FastFind(void) = 0; + virtual bool Reorder(PGLOBAL) {return true;} + virtual int Range(PGLOBAL, int = 0, bool = true) {return -1;} // Means error virtual int Qcompare(int *, int *) = 0; virtual int GroupSize(void) {return 1;} virtual void Close(void) = 0; @@ -266,7 +265,7 @@ class DllExport XINDEX : public XXBASE { #endif // XMAP virtual int Qcompare(int *, int *); virtual int Fetch(PGLOBAL g); - virtual int FastFind(int nk); + virtual int FastFind(void); virtual int GroupSize(void); virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); virtual int MaxRange(void) {return MaxSame;} @@ -280,7 +279,7 @@ class DllExport XINDEX : public XXBASE { bool GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk); protected: - bool AddColumns(PIXDEF xdp); + bool AddColumns(void); bool NextValDif(void); // Members @@ -312,7 +311,7 @@ class DllExport XINDXS : public XINDEX { // Methods virtual int Qcompare(int *, int *); virtual int Fetch(PGLOBAL g); - virtual int FastFind(int nk); + virtual int FastFind(void); virtual bool NextVal(bool eq); virtual bool PrevVal(void); virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); @@ -421,14 +420,14 @@ class DllExport XXROW : public XXBASE { // Methods virtual bool Init(PGLOBAL g); #if defined(XMAP) - virtual bool MapInit(PGLOBAL g) {return true;} + virtual bool MapInit(PGLOBAL) {return true;} #endif // XMAP virtual int Fetch(PGLOBAL g); - virtual int FastFind(int nk); + virtual int FastFind(void); virtual int MaxRange(void) {return 1;} virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); virtual int Qcompare(int *, int *) {assert(false); return 0;} - virtual bool Make(PGLOBAL g, PIXDEF sxp) {return false;} + virtual bool Make(PGLOBAL, PIXDEF) {return false;} virtual void Close(void) {} protected: diff --git a/storage/connect/xobject.h b/storage/connect/xobject.h index 8e2358dd526..82ff9e21225 100644 --- a/storage/connect/xobject.h +++ b/storage/connect/xobject.h @@ -42,9 +42,9 @@ class DllExport XOBJECT : public BLOCK { virtual int GetResultType(void) {return TYPE_VOID;} virtual int GetKey(void) {return 0;} #if defined(_DEBUG) - virtual void SetKey(int k) {assert(false);} + virtual void SetKey(int) {assert(false);} #else // !_DEBUG - virtual void SetKey(int k) {} // Only defined for COLBLK + virtual void SetKey(int) {} // Only defined for COLBLK #endif // !_DEBUG virtual int GetLength(void) = 0; virtual int GetLengthEx(void) = 0; diff --git a/storage/connect/xtable.h b/storage/connect/xtable.h index d1ea2b0d85f..1a75d97bafa 100644 --- a/storage/connect/xtable.h +++ b/storage/connect/xtable.h @@ -77,21 +77,21 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. virtual int GetTdb_No(void) {return Tdb_No;} virtual PTDB GetNext(void) {return Next;} virtual PCATLG GetCat(void) {return NULL;} - virtual void SetAbort(bool b) {;} + virtual void SetAbort(bool) {;} // Methods virtual bool IsSame(PTDB tp) {return tp == this;} virtual bool IsSpecial(PSZ name) = 0; - virtual bool GetBlockValues(PGLOBAL g) {return false;} - virtual int Cardinality(PGLOBAL g) {return 0;} + virtual bool GetBlockValues(PGLOBAL) {return false;} + virtual int Cardinality(PGLOBAL) {return 0;} virtual int GetMaxSize(PGLOBAL) = 0; virtual int GetProgMax(PGLOBAL) = 0; virtual int GetProgCur(void) = 0; virtual int RowNumber(PGLOBAL g, bool b = false); virtual bool IsReadOnly(void) {return true;} virtual const CHARSET_INFO *data_charset() {return NULL;} - virtual PTDB Duplicate(PGLOBAL g) {return NULL;} - virtual PTDB CopyOne(PTABS t) {return this;} + virtual PTDB Duplicate(PGLOBAL) {return NULL;} + virtual PTDB CopyOne(PTABS) {return this;} virtual PTDB Copy(PTABS t); virtual void PrintAM(FILE *f, char *m) {fprintf(f, "%s AM(%d)\n", m, GetAmType());} @@ -108,7 +108,7 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. virtual int WriteDB(PGLOBAL) = 0; virtual int DeleteDB(PGLOBAL, int) = 0; virtual void CloseDB(PGLOBAL) = 0; - virtual int CheckWrite(PGLOBAL g) {return 0;} + virtual int CheckWrite(PGLOBAL) {return 0;} virtual bool ReadKey(PGLOBAL, OPVAL, const void *, int) = 0; protected: @@ -155,7 +155,7 @@ class DllExport TDBASE : public TDB { PCOL Key(int i) {return (To_Key_Col) ? To_Key_Col[i] : NULL;} // Methods - virtual bool IsUsingTemp(PGLOBAL g) {return false;} + virtual bool IsUsingTemp(PGLOBAL) {return false;} virtual bool IsIndexed(void) {return false;} virtual bool IsSpecial(PSZ name); virtual PCATLG GetCat(void); @@ -170,9 +170,9 @@ class DllExport TDBASE : public TDB { virtual CHARSET_INFO *data_charset(void); virtual int GetProgMax(PGLOBAL g) {return GetMaxSize(g);} virtual int GetProgCur(void) {return GetRecpos();} - virtual PSZ GetFile(PGLOBAL g) {return "Not a file";} + virtual PSZ GetFile(PGLOBAL) {return "Not a file";} virtual int GetRemote(void) {return 0;} - virtual void SetFile(PGLOBAL g, PSZ fn) {} + virtual void SetFile(PGLOBAL, PSZ) {} virtual void ResetDB(void) {} virtual void ResetSize(void) {MaxSize = -1;} virtual void RestoreNrec(void) {} @@ -183,12 +183,12 @@ class DllExport TDBASE : public TDB { virtual PCOL ColDB(PGLOBAL g, PSZ name, int num); virtual PCOL MakeCol(PGLOBAL, PCOLDEF, PCOL, int) {assert(false); return NULL;} - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); + virtual PCOL InsertSpecialColumn(PCOL colp); virtual PCOL InsertSpcBlk(PGLOBAL g, PCOLDEF cdp); virtual void MarkDB(PGLOBAL g, PTDB tdb2); - virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) + virtual int MakeIndex(PGLOBAL g, PIXDEF, bool) {strcpy(g->Message, "Remote index"); return RC_INFO;} - virtual bool ReadKey(PGLOBAL g, OPVAL op, const void *key, int len) + virtual bool ReadKey(PGLOBAL, OPVAL, const void *, int) {assert(false); return true;} protected: @@ -225,7 +225,7 @@ class DllExport TDBCAT : public TDBASE { // Methods virtual int GetRecpos(void) {return N;} virtual int GetProgCur(void) {return N;} - virtual int RowNumber(PGLOBAL g, bool b = false) {return N + 1;} + virtual int RowNumber(PGLOBAL, bool = false) {return N + 1;} virtual bool SetRecpos(PGLOBAL g, int recpos); // Database routines From 83ca074c7501335a643cf2a7583b1c2233234755 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 10 May 2015 12:52:28 +0200 Subject: [PATCH 11/39] Last commit was done with wrong files --- storage/connect/array.cpp | 10 +- storage/connect/blkfil.cpp | 22 +- storage/connect/block.h | 2 +- storage/connect/catalog.h | 48 +- storage/connect/colblk.cpp | 834 ++++++++++++++++---------------- storage/connect/colblk.h | 6 +- storage/connect/connect.cc | 4 +- storage/connect/filamap.cpp | 14 +- storage/connect/filamdbf.cpp | 31 +- storage/connect/filamfix.cpp | 7 +- storage/connect/filamtxt.cpp | 12 +- storage/connect/filamtxt.h | 4 +- storage/connect/filamvct.cpp | 16 +- storage/connect/filamzip.cpp | 22 +- storage/connect/filter.h | 4 +- storage/connect/ha_connect.cc | 116 ++--- storage/connect/jsonudf.cpp | 122 +++-- storage/connect/mycat.cc | 8 +- storage/connect/mycat.h | 4 +- storage/connect/myconn.cpp | 4 +- storage/connect/plgdbutl.cpp | 2 +- storage/connect/reldef.cpp | 4 +- storage/connect/reldef.h | 4 +- storage/connect/tabcol.cpp | 8 +- storage/connect/tabdos.cpp | 25 +- storage/connect/tabdos.h | 12 +- storage/connect/tabfix.cpp | 4 +- storage/connect/tabfmt.cpp | 6 +- storage/connect/tabfmt.h | 4 +- storage/connect/tabjson.cpp | 39 +- storage/connect/tabjson.h | 5 +- storage/connect/table.cpp | 28 +- storage/connect/tabmul.cpp | 18 +- storage/connect/tabmysql.cpp | 35 +- storage/connect/tabmysql.h | 8 +- storage/connect/taboccur.cpp | 6 +- storage/connect/tabpivot.cpp | 8 +- storage/connect/tabsys.cpp | 56 +-- storage/connect/tabtbl.cpp | 10 +- storage/connect/tabtbl.h | 2 +- storage/connect/tabutil.cpp | 15 +- storage/connect/tabutil.h | 4 +- storage/connect/tabvct.cpp | 8 +- storage/connect/tabvir.cpp | 12 +- storage/connect/tabvir.h | 2 +- storage/connect/tabxcl.cpp | 8 +- storage/connect/tabxcl.h | 2 +- storage/connect/tabxml.cpp | 75 +-- storage/connect/tabxml.h | 2 +- storage/connect/user_connect.cc | 6 +- storage/connect/user_connect.h | 2 +- storage/connect/valblk.cpp | 6 +- storage/connect/valblk.h | 26 +- storage/connect/value.cpp | 20 +- storage/connect/value.h | 32 +- storage/connect/xindex.cpp | 40 +- storage/connect/xindex.h | 23 +- storage/connect/xobject.h | 4 +- storage/connect/xtable.h | 26 +- 59 files changed, 957 insertions(+), 930 deletions(-) diff --git a/storage/connect/array.cpp b/storage/connect/array.cpp index a2f537436c9..0e8829d66a6 100644 --- a/storage/connect/array.cpp +++ b/storage/connect/array.cpp @@ -1,7 +1,7 @@ /************* Array C++ Functions Source Code File (.CPP) *************/ /* Name: ARRAY.CPP Version 2.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* This file contains the XOBJECT derived class ARRAY functions. */ /* ARRAY is used for elaborate type of processing, such as sorting */ @@ -186,7 +186,7 @@ ARRAY::ARRAY(PGLOBAL g, int type, int size, int length, int prec) // The error message was built by PlgDBalloc Type = TYPE_ERROR; else if (type != TYPE_PCHAR) - Value = AllocateValue(g, type, Len, prec, NULL); + Value = AllocateValue(g, type, Len, prec); Constant = TRUE; } // end of ARRAY constructor @@ -610,7 +610,7 @@ int ARRAY::Convert(PGLOBAL g, int k, PVAL vp) // The error message was built by PlgDBalloc return TYPE_ERROR; else - Value = AllocateValue(g, Type, Len, prec, NULL); + Value = AllocateValue(g, Type, Len, prec); /*********************************************************************/ /* Converting STRING to DATE can be done according to date format. */ @@ -848,7 +848,7 @@ void *ARRAY::GetSortIndex(PGLOBAL g) /* the indication of whether the Find will be always true, always not */ /* true or other. */ /***********************************************************************/ -int ARRAY::BlockTest(PGLOBAL g, int opc, int opm, +int ARRAY::BlockTest(PGLOBAL, int opc, int opm, void *minp, void *maxp, bool s) { bool bin, bax, pin, pax, veq, all = (opm == 2); @@ -1038,7 +1038,7 @@ void ARRAY::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of ARRAY contents. */ /***********************************************************************/ -void ARRAY::Print(PGLOBAL g, char *ps, uint z) +void ARRAY::Print(PGLOBAL, char *ps, uint z) { if (z < 16) return; diff --git a/storage/connect/blkfil.cpp b/storage/connect/blkfil.cpp index 802231b24ec..c6fb528aa5f 100644 --- a/storage/connect/blkfil.cpp +++ b/storage/connect/blkfil.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -56,7 +56,7 @@ BLOCKFILTER::BLOCKFILTER(PTDBDOS tdbp, int op) /***********************************************************************/ /* Make file output of BLOCKFILTER contents. */ /***********************************************************************/ -void BLOCKFILTER::Print(PGLOBAL g, FILE *f, uint n) +void BLOCKFILTER::Print(PGLOBAL, FILE *f, uint n) { char m[64]; @@ -70,7 +70,7 @@ void BLOCKFILTER::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of BLOCKFILTER contents. */ /***********************************************************************/ -void BLOCKFILTER::Print(PGLOBAL g, char *ps, uint z) +void BLOCKFILTER::Print(PGLOBAL, char *ps, uint z) { strncat(ps, "BlockFilter(s)", z); } // end of Print @@ -186,7 +186,7 @@ void BLKFILARI::Reset(PGLOBAL g) /***********************************************************************/ /* Evaluate block filter for arithmetic operators. */ /***********************************************************************/ -int BLKFILARI::BlockEval(PGLOBAL g) +int BLKFILARI::BlockEval(PGLOBAL) { int mincmp, maxcmp, n; @@ -306,7 +306,7 @@ void BLKFILAR2::MakeValueBitmap(void) /***********************************************************************/ /* Evaluate XDB2 block filter for arithmetic operators. */ /***********************************************************************/ -int BLKFILAR2::BlockEval(PGLOBAL g) +int BLKFILAR2::BlockEval(PGLOBAL) { #if defined(_DEBUG) assert (Colp->IsClustered()); @@ -428,7 +428,7 @@ void BLKFILMR2::MakeValueBitmap(void) /***********************************************************************/ /* Evaluate XDB2 block filter for arithmetic operators. */ /***********************************************************************/ -int BLKFILMR2::BlockEval(PGLOBAL g) +int BLKFILMR2::BlockEval(PGLOBAL) { #if defined(_DEBUG) assert (Colp->IsClustered()); @@ -514,7 +514,7 @@ void BLKSPCARI::Reset(PGLOBAL g) /***********************************************************************/ /* Evaluate block filter for arithmetic operators (ROWID) */ /***********************************************************************/ -int BLKSPCARI::BlockEval(PGLOBAL g) +int BLKSPCARI::BlockEval(PGLOBAL) { int mincmp, maxcmp, n, m; @@ -605,7 +605,7 @@ BLKFILIN::BLKFILIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp) /***********************************************************************/ /* Reset: have the sorted array reset its Bot value to -1 (bottom). */ /***********************************************************************/ -void BLKFILIN::Reset(PGLOBAL g) +void BLKFILIN::Reset(PGLOBAL) { Arap->Reset(); // MakeValueBitmap(); // Does nothing for class BLKFILIN @@ -736,7 +736,7 @@ void BLKFILIN2::MakeValueBitmap(void) /* ended string in case of string argument. This is because the ARRAY */ /* can have a different width than the char column. */ /***********************************************************************/ -int BLKFILIN2::BlockEval(PGLOBAL g) +int BLKFILIN2::BlockEval(PGLOBAL) { if (N < 0) return Result; // Was set in MakeValueBitmap @@ -909,7 +909,7 @@ int BLKFILIN2::BlockEval(PGLOBAL g) /***********************************************************************/ /* BLKSPCIN constructor. */ /***********************************************************************/ -BLKSPCIN::BLKSPCIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, +BLKSPCIN::BLKSPCIN(PGLOBAL, PTDBDOS tdbp, int op, int opm, PXOB *xp, int bsize) : BLOCKFILTER(tdbp, op) { @@ -930,7 +930,7 @@ BLKSPCIN::BLKSPCIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, /***********************************************************************/ /* Reset: have the sorted array reset its Bot value to -1 (bottom). */ /***********************************************************************/ -void BLKSPCIN::Reset(PGLOBAL g) +void BLKSPCIN::Reset(PGLOBAL) { Arap->Reset(); } // end of Reset diff --git a/storage/connect/block.h b/storage/connect/block.h index d63a899d1f5..40529ffc81f 100644 --- a/storage/connect/block.h +++ b/storage/connect/block.h @@ -50,7 +50,7 @@ class DllExport BLOCK { #if !defined(__BORLANDC__) // Avoid warning C4291 by defining a matching dummy delete operator void operator delete(void *, PGLOBAL, void *) {} - void operator delete(void *ptr,size_t size) {} + void operator delete(void *, size_t) {} #endif virtual ~BLOCK() {} diff --git a/storage/connect/catalog.h b/storage/connect/catalog.h index 5baab294737..6488b513ba9 100644 --- a/storage/connect/catalog.h +++ b/storage/connect/catalog.h @@ -1,7 +1,7 @@ /*************** Catalog H Declares Source Code File (.H) **************/ /* Name: CATALOG.H Version 3.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2000-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2000-2015 */ /* */ /* This file contains the CATALOG PlugDB classes definitions. */ /***********************************************************************/ @@ -73,33 +73,29 @@ class DllExport CATALOG { // Methods virtual void Reset(void) {} //virtual void SetDataPath(PGLOBAL g, const char *path) {} - virtual bool CheckName(PGLOBAL g, char *name) {return true;} - virtual bool ClearName(PGLOBAL g, PSZ name) {return true;} - virtual PRELDEF MakeOneTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) {return NULL;} - virtual PRELDEF GetTableDescEx(PGLOBAL g, PTABLE tablep) {return NULL;} - virtual PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, LPCSTR type, - PRELDEF *prp = NULL) {return NULL;} - virtual PRELDEF GetFirstTable(PGLOBAL g) {return NULL;} - virtual PRELDEF GetNextTable(PGLOBAL g) {return NULL;} - virtual bool TestCond(PGLOBAL g, const char *name, const char *type) - {return true;} - virtual bool DropTable(PGLOBAL g, PSZ name, bool erase) {return true;} - virtual PTDB GetTable(PGLOBAL g, PTABLE tablep, - MODE mode = MODE_READ, LPCSTR type = NULL) - {return NULL;} - virtual void TableNames(PGLOBAL g, char *buffer, int maxbuf, int info[]) {} - virtual void ColumnNames(PGLOBAL g, char *tabname, char *buffer, - int maxbuf, int info[]) {} - virtual void ColumnDefs(PGLOBAL g, char *tabname, char *buffer, - int maxbuf, int info[]) {} - virtual void *DecodeValues(PGLOBAL g, char *tabname, char *colname, - char *buffer, int maxbuf, int info[]) {return NULL;} - virtual int ColumnType(PGLOBAL g, char *tabname, char *colname) {return 0;} - virtual void ClearDB(PGLOBAL g) {} + virtual bool CheckName(PGLOBAL, char*) {return true;} + virtual bool ClearName(PGLOBAL, PSZ) {return true;} + virtual PRELDEF MakeOneTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;} + virtual PRELDEF GetTableDescEx(PGLOBAL, PTABLE) {return NULL;} + virtual PRELDEF GetTableDesc(PGLOBAL, LPCSTR, LPCSTR, + PRELDEF* = NULL) {return NULL;} + virtual PRELDEF GetFirstTable(PGLOBAL) {return NULL;} + virtual PRELDEF GetNextTable(PGLOBAL) {return NULL;} + virtual bool TestCond(PGLOBAL, const char*, const char*) {return true;} + virtual bool DropTable(PGLOBAL, PSZ, bool) {return true;} + virtual PTDB GetTable(PGLOBAL, PTABLE, + MODE = MODE_READ, LPCSTR = NULL) {return NULL;} + virtual void TableNames(PGLOBAL, char*, int, int[]) {} + virtual void ColumnNames(PGLOBAL, char*, char*, int, int[]) {} + virtual void ColumnDefs(PGLOBAL, char*, char*, int, int[]) {} + virtual void *DecodeValues(PGLOBAL, char*, char*, char*, + int, int[]) {return NULL;} + virtual int ColumnType(PGLOBAL, char*, char*) {return 0;} + virtual void ClearDB(PGLOBAL) {} protected: - virtual bool ClearSection(PGLOBAL g, const char *key, const char *section) {return true;} - virtual PRELDEF MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) {return NULL;} + virtual bool ClearSection(PGLOBAL, const char*, const char*) {return true;} + virtual PRELDEF MakeTableDesc(PGLOBAL, LPCSTR, LPCSTR) {return NULL;} // Members char *Cbuf; /* Buffer used for col section */ diff --git a/storage/connect/colblk.cpp b/storage/connect/colblk.cpp index 78aba7bc494..7166af8027b 100644 --- a/storage/connect/colblk.cpp +++ b/storage/connect/colblk.cpp @@ -1,417 +1,417 @@ -/************* Colblk C++ Functions Source Code File (.CPP) ************/ -/* Name: COLBLK.CPP Version 2.1 */ -/* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ -/* */ -/* This file contains the COLBLK class functions. */ -/***********************************************************************/ - -/***********************************************************************/ -/* Include relevant MariaDB header file. */ -/***********************************************************************/ -#include "my_global.h" - -/***********************************************************************/ -/* Include required application header files */ -/* global.h is header containing all global Plug declarations. */ -/* plgdbsem.h is header containing the DB applic. declarations. */ -/***********************************************************************/ -#include "global.h" -#include "plgdbsem.h" -#include "tabcol.h" -#include "colblk.h" -#include "xindex.h" -#include "xtable.h" - -/***********************************************************************/ -/* COLBLK protected constructor. */ -/***********************************************************************/ -COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i) - { - Next = NULL; - Index = i; -//Number = 0; - ColUse = 0; - - if ((Cdp = cdp)) { - Name = cdp->Name; - Format = cdp->F; - Opt = cdp->Opt; - Long = cdp->Long; - Precision = cdp->Precision; - Freq = cdp->Freq; - Buf_Type = cdp->Buf_Type; - ColUse |= cdp->Flags; // Used by CONNECT - Nullable = !!(cdp->Flags & U_NULLS); - Unsigned = !!(cdp->Flags & U_UNSIGNED); - } else { - Name = NULL; - memset(&Format, 0, sizeof(FORMAT)); - Opt = 0; - Long = 0; - Precision = 0; - Freq = 0; - Buf_Type = TYPE_ERROR; - Nullable = false; - Unsigned = false; - } // endif cdp - - To_Tdb = tdbp; - Status = BUF_NO; -//Value = NULL; done in XOBJECT constructor - To_Kcol = NULL; - } // end of COLBLK constructor - -/***********************************************************************/ -/* COLBLK constructor used for copying columns. */ -/* tdbp is the pointer to the new table descriptor. */ -/***********************************************************************/ -COLBLK::COLBLK(PCOL col1, PTDB tdbp) - { - PCOL colp; - - // Copy the old column block to the new one - *this = *col1; - Next = NULL; -//To_Orig = col1; - To_Tdb = tdbp; - - if (trace > 1) - htrc(" copying COLBLK %s from %p to %p\n", Name, col1, this); - - if (tdbp) - // Attach the new column to the table block - if (!tdbp->GetColumns()) - tdbp->SetColumns(this); - else { - for (colp = tdbp->GetColumns(); colp->Next; colp = colp->Next) ; - - colp->Next = this; - } // endelse - - } // end of COLBLK copy constructor - -/***********************************************************************/ -/* Reset the column descriptor to non evaluated yet. */ -/***********************************************************************/ -void COLBLK::Reset(void) - { - Status &= ~BUF_READ; - } // end of Reset - -/***********************************************************************/ -/* Compare: compares itself to an (expression) object and returns */ -/* true if it is equivalent. */ -/***********************************************************************/ -bool COLBLK::Compare(PXOB xp) - { - return (this == xp); - } // end of Compare - -/***********************************************************************/ -/* SetFormat: function used to set SELECT output format. */ -/***********************************************************************/ -bool COLBLK::SetFormat(PGLOBAL g, FORMAT& fmt) - { - fmt = Format; - - if (trace > 1) - htrc("COLBLK: %p format=%c(%d,%d)\n", - this, *fmt.Type, fmt.Length, fmt.Prec); - - return false; - } // end of SetFormat - -/***********************************************************************/ -/* Eval: get the column value from the last read record or from a */ -/* matching Index column if there is one. */ -/***********************************************************************/ -bool COLBLK::Eval(PGLOBAL g) - { - if (trace > 1) - htrc("Col Eval: %s status=%.4X\n", Name, Status); - - if (!GetStatus(BUF_READ)) { -// if (To_Tdb->IsNull()) -// Value->Reset(); - if (To_Kcol) - To_Kcol->FillValue(Value); - else - ReadColumn(g); - - AddStatus(BUF_READ); - } // endif - - return false; - } // end of Eval - -/***********************************************************************/ -/* InitValue: prepare a column block for read operation. */ -/* Now we use Format.Length for the len parameter to avoid strings */ -/* to be truncated when converting from string to coded string. */ -/* Added in version 1.5 is the arguments GetScale() and Domain */ -/* in calling AllocateValue. Domain is used for TYPE_DATE only. */ -/***********************************************************************/ -bool COLBLK::InitValue(PGLOBAL g) - { - if (Value) - return false; // Already done - - // Allocate a Value object - if (!(Value = AllocateValue(g, Buf_Type, Precision, - GetScale(), Unsigned, GetDomain()))) - return true; - - AddStatus(BUF_READY); - Value->SetNullable(Nullable); - - if (trace > 1) - htrc(" colp=%p type=%d value=%p coluse=%.4X status=%.4X\n", - this, Buf_Type, Value, ColUse, Status); - - return false; - } // end of InitValue - -/***********************************************************************/ -/* SetBuffer: prepare a column block for write operation. */ -/***********************************************************************/ -bool COLBLK::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) - { - sprintf(g->Message, MSG(UNDEFINED_AM), "SetBuffer"); - return true; - } // end of SetBuffer - -/***********************************************************************/ -/* GetLength: returns an evaluation of the column string length. */ -/***********************************************************************/ -int COLBLK::GetLengthEx(void) - { - return Long; - } // end of GetLengthEx - -/***********************************************************************/ -/* ReadColumn: what this routine does is to access the last line */ -/* read from the corresponding table, extract from it the field */ -/* corresponding to this column and convert it to buffer type. */ -/***********************************************************************/ -void COLBLK::ReadColumn(PGLOBAL g) - { - sprintf(g->Message, MSG(UNDEFINED_AM), "ReadColumn"); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of ReadColumn - -/***********************************************************************/ -/* WriteColumn: what this routine does is to access the last line */ -/* read from the corresponding table, and rewrite the field */ -/* corresponding to this column from the column buffer and type. */ -/***********************************************************************/ -void COLBLK::WriteColumn(PGLOBAL g) - { - sprintf(g->Message, MSG(UNDEFINED_AM), "WriteColumn"); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of WriteColumn - -/***********************************************************************/ -/* Make file output of a column descriptor block. */ -/***********************************************************************/ -void COLBLK::Print(PGLOBAL g, FILE *f, uint n) - { - char m[64]; - int i; - PCOL colp; - - memset(m, ' ', n); // Make margin string - m[n] = '\0'; - - for (colp = To_Tdb->GetColumns(), i = 1; colp; colp = colp->Next, i++) - if (colp == this) - break; - - fprintf(f, "%sR%dC%d type=%d F=%.2s(%d,%d)", m, To_Tdb->GetTdb_No(), - i, GetAmType(), Format.Type, Format.Length, Format.Prec); - fprintf(f, - " coluse=%04X status=%04X buftyp=%d value=%p name=%s\n", - ColUse, Status, Buf_Type, Value, Name); - } // end of Print - -/***********************************************************************/ -/* Make string output of a column descriptor block. */ -/***********************************************************************/ -void COLBLK::Print(PGLOBAL g, char *ps, uint z) - { - sprintf(ps, "R%d.%s", To_Tdb->GetTdb_No(), Name); - } // end of Print - - -/***********************************************************************/ -/* SPCBLK constructor. */ -/***********************************************************************/ -SPCBLK::SPCBLK(PCOLUMN cp) - : COLBLK((PCOLDEF)NULL, cp->GetTo_Table()->GetTo_Tdb(), 0) - { - Name = (char*)cp->GetName(); - Precision = Long = 0; - Buf_Type = TYPE_ERROR; - } // end of SPCBLK constructor - -/***********************************************************************/ -/* WriteColumn: what this routine does is to access the last line */ -/* read from the corresponding table, and rewrite the field */ -/* corresponding to this column from the column buffer and type. */ -/***********************************************************************/ -void SPCBLK::WriteColumn(PGLOBAL g) - { - sprintf(g->Message, MSG(SPCOL_READONLY), Name); - longjmp(g->jumper[g->jump_level], TYPE_COLBLK); - } // end of WriteColumn - -/***********************************************************************/ -/* RIDBLK constructor for the ROWID special column. */ -/***********************************************************************/ -RIDBLK::RIDBLK(PCOLUMN cp, bool rnm) : SPCBLK(cp) - { - Precision = Long = 10; - Buf_Type = TYPE_INT; - Rnm = rnm; - *Format.Type = 'N'; - Format.Length = 10; - } // end of RIDBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the ordinal */ -/* number of the current row in the table (if Rnm is true) or in the */ -/* current file (if Rnm is false) the same except for multiple tables.*/ -/***********************************************************************/ -void RIDBLK::ReadColumn(PGLOBAL g) - { - Value->SetValue(To_Tdb->RowNumber(g, Rnm)); - } // end of ReadColumn - -/***********************************************************************/ -/* FIDBLK constructor for the FILEID special column. */ -/***********************************************************************/ -FIDBLK::FIDBLK(PCOLUMN cp, OPVAL op) : SPCBLK(cp), Op(op) - { -//Is_Key = 2; for when the MUL table indexed reading will be implemented. - Precision = Long = _MAX_PATH; - Buf_Type = TYPE_STRING; - *Format.Type = 'C'; - Format.Length = Long; -#if defined(WIN32) - Format.Prec = 1; // Case insensitive -#endif // WIN32 - Constant = (!((PTDBASE)To_Tdb)->GetDef()->GetMultiple() && - To_Tdb->GetAmType() != TYPE_AM_PLG && - To_Tdb->GetAmType() != TYPE_AM_PLM); - Fn = NULL; - } // end of FIDBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the current */ -/* file ID of the table (can change for Multiple tables). */ -/***********************************************************************/ -void FIDBLK::ReadColumn(PGLOBAL g) - { - if (Fn != ((PTDBASE)To_Tdb)->GetFile(g)) { - char filename[_MAX_PATH]; - - Fn = ((PTDBASE)To_Tdb)->GetFile(g); - PlugSetPath(filename, Fn, ((PTDBASE)To_Tdb)->GetPath()); - - if (Op != OP_XX) { - char buff[_MAX_PATH]; - - Value->SetValue_psz(ExtractFromPath(g, buff, filename, Op)); - } else - Value->SetValue_psz(filename); - - } // endif Fn - - } // end of ReadColumn - -/***********************************************************************/ -/* TIDBLK constructor for the TABID special column. */ -/***********************************************************************/ -TIDBLK::TIDBLK(PCOLUMN cp) : SPCBLK(cp) - { -//Is_Key = 2; for when the MUL table indexed reading will be implemented. - Precision = Long = 64; - Buf_Type = TYPE_STRING; - *Format.Type = 'C'; - Format.Length = Long; - Format.Prec = 1; // Case insensitive - Constant = (To_Tdb->GetAmType() != TYPE_AM_TBL); - Tname = NULL; - } // end of TIDBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the table ID. */ -/***********************************************************************/ -void TIDBLK::ReadColumn(PGLOBAL g) - { - if (Tname == NULL) { - Tname = (char*)To_Tdb->GetName(); - Value->SetValue_psz(Tname); - } // endif Tname - - } // end of ReadColumn - -/***********************************************************************/ -/* PRTBLK constructor for the PARTID special column. */ -/***********************************************************************/ -PRTBLK::PRTBLK(PCOLUMN cp) : SPCBLK(cp) - { -//Is_Key = 2; for when the MUL table indexed reading will be implemented. - Precision = Long = 64; - Buf_Type = TYPE_STRING; - *Format.Type = 'C'; - Format.Length = Long; - Format.Prec = 1; // Case insensitive - Constant = true; // TODO: check whether this is true indeed - Pname = NULL; - } // end of PRTBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the partition ID. */ -/***********************************************************************/ -void PRTBLK::ReadColumn(PGLOBAL g) - { - if (Pname == NULL) { - char *p; - PTDBASE tdbp = (PTDBASE)To_Tdb; - - Pname = tdbp->GetDef()->GetStringCatInfo(g, "partname", "?"); - - p = strrchr(Pname, '#'); - Value->SetValue_psz((p) ? p + 1 : Pname); - } // endif Pname - - } // end of ReadColumn - -/***********************************************************************/ -/* SIDBLK constructor for the SERVID special column. */ -/***********************************************************************/ -SIDBLK::SIDBLK(PCOLUMN cp) : SPCBLK(cp) - { -//Is_Key = 2; for when the MUL table indexed reading will be implemented. - Precision = Long = 64; - Buf_Type = TYPE_STRING; - *Format.Type = 'C'; - Format.Length = Long; - Format.Prec = 1; // Case insensitive - Constant = (To_Tdb->GetAmType() != TYPE_AM_TBL); - Sname = NULL; - } // end of TIDBLK constructor - -/***********************************************************************/ -/* ReadColumn: what this routine does is to return the server ID. */ -/***********************************************************************/ -void SIDBLK::ReadColumn(PGLOBAL g) - { -//if (Sname == NULL) { - Sname = (char*)To_Tdb->GetServer(); - Value->SetValue_psz(Sname); -// } // endif Sname - - } // end of ReadColumn - +/************* Colblk C++ Functions Source Code File (.CPP) ************/ +/* Name: COLBLK.CPP Version 2.1 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ +/* */ +/* This file contains the COLBLK class functions. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant MariaDB header file. */ +/***********************************************************************/ +#include "my_global.h" + +/***********************************************************************/ +/* Include required application header files */ +/* global.h is header containing all global Plug declarations. */ +/* plgdbsem.h is header containing the DB applic. declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "tabcol.h" +#include "colblk.h" +#include "xindex.h" +#include "xtable.h" + +/***********************************************************************/ +/* COLBLK protected constructor. */ +/***********************************************************************/ +COLBLK::COLBLK(PCOLDEF cdp, PTDB tdbp, int i) + { + Next = NULL; + Index = i; +//Number = 0; + ColUse = 0; + + if ((Cdp = cdp)) { + Name = cdp->Name; + Format = cdp->F; + Opt = cdp->Opt; + Long = cdp->Long; + Precision = cdp->Precision; + Freq = cdp->Freq; + Buf_Type = cdp->Buf_Type; + ColUse |= cdp->Flags; // Used by CONNECT + Nullable = !!(cdp->Flags & U_NULLS); + Unsigned = !!(cdp->Flags & U_UNSIGNED); + } else { + Name = NULL; + memset(&Format, 0, sizeof(FORMAT)); + Opt = 0; + Long = 0; + Precision = 0; + Freq = 0; + Buf_Type = TYPE_ERROR; + Nullable = false; + Unsigned = false; + } // endif cdp + + To_Tdb = tdbp; + Status = BUF_NO; +//Value = NULL; done in XOBJECT constructor + To_Kcol = NULL; + } // end of COLBLK constructor + +/***********************************************************************/ +/* COLBLK constructor used for copying columns. */ +/* tdbp is the pointer to the new table descriptor. */ +/***********************************************************************/ +COLBLK::COLBLK(PCOL col1, PTDB tdbp) + { + PCOL colp; + + // Copy the old column block to the new one + *this = *col1; + Next = NULL; +//To_Orig = col1; + To_Tdb = tdbp; + + if (trace > 1) + htrc(" copying COLBLK %s from %p to %p\n", Name, col1, this); + + if (tdbp) + // Attach the new column to the table block + if (!tdbp->GetColumns()) + tdbp->SetColumns(this); + else { + for (colp = tdbp->GetColumns(); colp->Next; colp = colp->Next) ; + + colp->Next = this; + } // endelse + + } // end of COLBLK copy constructor + +/***********************************************************************/ +/* Reset the column descriptor to non evaluated yet. */ +/***********************************************************************/ +void COLBLK::Reset(void) + { + Status &= ~BUF_READ; + } // end of Reset + +/***********************************************************************/ +/* Compare: compares itself to an (expression) object and returns */ +/* true if it is equivalent. */ +/***********************************************************************/ +bool COLBLK::Compare(PXOB xp) + { + return (this == xp); + } // end of Compare + +/***********************************************************************/ +/* SetFormat: function used to set SELECT output format. */ +/***********************************************************************/ +bool COLBLK::SetFormat(PGLOBAL, FORMAT& fmt) + { + fmt = Format; + + if (trace > 1) + htrc("COLBLK: %p format=%c(%d,%d)\n", + this, *fmt.Type, fmt.Length, fmt.Prec); + + return false; + } // end of SetFormat + +/***********************************************************************/ +/* Eval: get the column value from the last read record or from a */ +/* matching Index column if there is one. */ +/***********************************************************************/ +bool COLBLK::Eval(PGLOBAL g) + { + if (trace > 1) + htrc("Col Eval: %s status=%.4X\n", Name, Status); + + if (!GetStatus(BUF_READ)) { +// if (To_Tdb->IsNull()) +// Value->Reset(); + if (To_Kcol) + To_Kcol->FillValue(Value); + else + ReadColumn(g); + + AddStatus(BUF_READ); + } // endif + + return false; + } // end of Eval + +/***********************************************************************/ +/* InitValue: prepare a column block for read operation. */ +/* Now we use Format.Length for the len parameter to avoid strings */ +/* to be truncated when converting from string to coded string. */ +/* Added in version 1.5 is the arguments GetScale() and Domain */ +/* in calling AllocateValue. Domain is used for TYPE_DATE only. */ +/***********************************************************************/ +bool COLBLK::InitValue(PGLOBAL g) + { + if (Value) + return false; // Already done + + // Allocate a Value object + if (!(Value = AllocateValue(g, Buf_Type, Precision, + GetScale(), Unsigned, GetDomain()))) + return true; + + AddStatus(BUF_READY); + Value->SetNullable(Nullable); + + if (trace > 1) + htrc(" colp=%p type=%d value=%p coluse=%.4X status=%.4X\n", + this, Buf_Type, Value, ColUse, Status); + + return false; + } // end of InitValue + +/***********************************************************************/ +/* SetBuffer: prepare a column block for write operation. */ +/***********************************************************************/ +bool COLBLK::SetBuffer(PGLOBAL g, PVAL, bool, bool) + { + sprintf(g->Message, MSG(UNDEFINED_AM), "SetBuffer"); + return true; + } // end of SetBuffer + +/***********************************************************************/ +/* GetLength: returns an evaluation of the column string length. */ +/***********************************************************************/ +int COLBLK::GetLengthEx(void) + { + return Long; + } // end of GetLengthEx + +/***********************************************************************/ +/* ReadColumn: what this routine does is to access the last line */ +/* read from the corresponding table, extract from it the field */ +/* corresponding to this column and convert it to buffer type. */ +/***********************************************************************/ +void COLBLK::ReadColumn(PGLOBAL g) + { + sprintf(g->Message, MSG(UNDEFINED_AM), "ReadColumn"); + longjmp(g->jumper[g->jump_level], TYPE_COLBLK); + } // end of ReadColumn + +/***********************************************************************/ +/* WriteColumn: what this routine does is to access the last line */ +/* read from the corresponding table, and rewrite the field */ +/* corresponding to this column from the column buffer and type. */ +/***********************************************************************/ +void COLBLK::WriteColumn(PGLOBAL g) + { + sprintf(g->Message, MSG(UNDEFINED_AM), "WriteColumn"); + longjmp(g->jumper[g->jump_level], TYPE_COLBLK); + } // end of WriteColumn + +/***********************************************************************/ +/* Make file output of a column descriptor block. */ +/***********************************************************************/ +void COLBLK::Print(PGLOBAL, FILE *f, uint n) + { + char m[64]; + int i; + PCOL colp; + + memset(m, ' ', n); // Make margin string + m[n] = '\0'; + + for (colp = To_Tdb->GetColumns(), i = 1; colp; colp = colp->Next, i++) + if (colp == this) + break; + + fprintf(f, "%sR%dC%d type=%d F=%.2s(%d,%d)", m, To_Tdb->GetTdb_No(), + i, GetAmType(), Format.Type, Format.Length, Format.Prec); + fprintf(f, + " coluse=%04X status=%04X buftyp=%d value=%p name=%s\n", + ColUse, Status, Buf_Type, Value, Name); + } // end of Print + +/***********************************************************************/ +/* Make string output of a column descriptor block. */ +/***********************************************************************/ +void COLBLK::Print(PGLOBAL, char *ps, uint) + { + sprintf(ps, "R%d.%s", To_Tdb->GetTdb_No(), Name); + } // end of Print + + +/***********************************************************************/ +/* SPCBLK constructor. */ +/***********************************************************************/ +SPCBLK::SPCBLK(PCOLUMN cp) + : COLBLK((PCOLDEF)NULL, cp->GetTo_Table()->GetTo_Tdb(), 0) + { + Name = (char*)cp->GetName(); + Precision = Long = 0; + Buf_Type = TYPE_ERROR; + } // end of SPCBLK constructor + +/***********************************************************************/ +/* WriteColumn: what this routine does is to access the last line */ +/* read from the corresponding table, and rewrite the field */ +/* corresponding to this column from the column buffer and type. */ +/***********************************************************************/ +void SPCBLK::WriteColumn(PGLOBAL g) + { + sprintf(g->Message, MSG(SPCOL_READONLY), Name); + longjmp(g->jumper[g->jump_level], TYPE_COLBLK); + } // end of WriteColumn + +/***********************************************************************/ +/* RIDBLK constructor for the ROWID special column. */ +/***********************************************************************/ +RIDBLK::RIDBLK(PCOLUMN cp, bool rnm) : SPCBLK(cp) + { + Precision = Long = 10; + Buf_Type = TYPE_INT; + Rnm = rnm; + *Format.Type = 'N'; + Format.Length = 10; + } // end of RIDBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the ordinal */ +/* number of the current row in the table (if Rnm is true) or in the */ +/* current file (if Rnm is false) the same except for multiple tables.*/ +/***********************************************************************/ +void RIDBLK::ReadColumn(PGLOBAL g) + { + Value->SetValue(To_Tdb->RowNumber(g, Rnm)); + } // end of ReadColumn + +/***********************************************************************/ +/* FIDBLK constructor for the FILEID special column. */ +/***********************************************************************/ +FIDBLK::FIDBLK(PCOLUMN cp, OPVAL op) : SPCBLK(cp), Op(op) + { +//Is_Key = 2; for when the MUL table indexed reading will be implemented. + Precision = Long = _MAX_PATH; + Buf_Type = TYPE_STRING; + *Format.Type = 'C'; + Format.Length = Long; +#if defined(WIN32) + Format.Prec = 1; // Case insensitive +#endif // WIN32 + Constant = (!((PTDBASE)To_Tdb)->GetDef()->GetMultiple() && + To_Tdb->GetAmType() != TYPE_AM_PLG && + To_Tdb->GetAmType() != TYPE_AM_PLM); + Fn = NULL; + } // end of FIDBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the current */ +/* file ID of the table (can change for Multiple tables). */ +/***********************************************************************/ +void FIDBLK::ReadColumn(PGLOBAL g) + { + if (Fn != ((PTDBASE)To_Tdb)->GetFile(g)) { + char filename[_MAX_PATH]; + + Fn = ((PTDBASE)To_Tdb)->GetFile(g); + PlugSetPath(filename, Fn, ((PTDBASE)To_Tdb)->GetPath()); + + if (Op != OP_XX) { + char buff[_MAX_PATH]; + + Value->SetValue_psz(ExtractFromPath(g, buff, filename, Op)); + } else + Value->SetValue_psz(filename); + + } // endif Fn + + } // end of ReadColumn + +/***********************************************************************/ +/* TIDBLK constructor for the TABID special column. */ +/***********************************************************************/ +TIDBLK::TIDBLK(PCOLUMN cp) : SPCBLK(cp) + { +//Is_Key = 2; for when the MUL table indexed reading will be implemented. + Precision = Long = 64; + Buf_Type = TYPE_STRING; + *Format.Type = 'C'; + Format.Length = Long; + Format.Prec = 1; // Case insensitive + Constant = (To_Tdb->GetAmType() != TYPE_AM_TBL); + Tname = NULL; + } // end of TIDBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the table ID. */ +/***********************************************************************/ +void TIDBLK::ReadColumn(PGLOBAL) + { + if (Tname == NULL) { + Tname = (char*)To_Tdb->GetName(); + Value->SetValue_psz(Tname); + } // endif Tname + + } // end of ReadColumn + +/***********************************************************************/ +/* PRTBLK constructor for the PARTID special column. */ +/***********************************************************************/ +PRTBLK::PRTBLK(PCOLUMN cp) : SPCBLK(cp) + { +//Is_Key = 2; for when the MUL table indexed reading will be implemented. + Precision = Long = 64; + Buf_Type = TYPE_STRING; + *Format.Type = 'C'; + Format.Length = Long; + Format.Prec = 1; // Case insensitive + Constant = true; // TODO: check whether this is true indeed + Pname = NULL; + } // end of PRTBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the partition ID. */ +/***********************************************************************/ +void PRTBLK::ReadColumn(PGLOBAL g) + { + if (Pname == NULL) { + char *p; + PTDBASE tdbp = (PTDBASE)To_Tdb; + + Pname = tdbp->GetDef()->GetStringCatInfo(g, "partname", "?"); + + p = strrchr(Pname, '#'); + Value->SetValue_psz((p) ? p + 1 : Pname); + } // endif Pname + + } // end of ReadColumn + +/***********************************************************************/ +/* SIDBLK constructor for the SERVID special column. */ +/***********************************************************************/ +SIDBLK::SIDBLK(PCOLUMN cp) : SPCBLK(cp) + { +//Is_Key = 2; for when the MUL table indexed reading will be implemented. + Precision = Long = 64; + Buf_Type = TYPE_STRING; + *Format.Type = 'C'; + Format.Length = Long; + Format.Prec = 1; // Case insensitive + Constant = (To_Tdb->GetAmType() != TYPE_AM_TBL); + Sname = NULL; + } // end of TIDBLK constructor + +/***********************************************************************/ +/* ReadColumn: what this routine does is to return the server ID. */ +/***********************************************************************/ +void SIDBLK::ReadColumn(PGLOBAL) + { +//if (Sname == NULL) { + Sname = (char*)To_Tdb->GetServer(); + Value->SetValue_psz(Sname); +// } // endif Sname + + } // end of ReadColumn + diff --git a/storage/connect/colblk.h b/storage/connect/colblk.h index 5e8dc77ff69..c64f9d95129 100644 --- a/storage/connect/colblk.h +++ b/storage/connect/colblk.h @@ -1,7 +1,7 @@ /*************** Colblk H Declares Source Code File (.H) ***************/ /* Name: COLBLK.H Version 1.7 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* This file contains the COLBLK and derived classes declares. */ /***********************************************************************/ @@ -23,7 +23,7 @@ class DllExport COLBLK : public XOBJECT { // Default constructors used by derived classes COLBLK(PCOLDEF cdp = NULL, PTDB tdbp = NULL, int i = 0); COLBLK(PCOL colp, PTDB tdbp = NULL); // Used in copy process - COLBLK(int n) {} // Used when changing a column class in TDBXML + COLBLK(int) {} // Used when changing a column class in TDBXML public: // Implementation @@ -69,7 +69,7 @@ class DllExport COLBLK : public XOBJECT { virtual bool IsSpecial(void) {return false;} virtual bool Eval(PGLOBAL g); virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void SetTo_Val(PVAL valp) {} + virtual void SetTo_Val(PVAL) {} virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); virtual void Print(PGLOBAL g, FILE *, uint); diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index 7c32c65226d..12b23878891 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2012 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -237,7 +237,7 @@ PTDB CntGetTDB(PGLOBAL g, LPCSTR name, MODE mode, PHC h) /* OPENTAB: Open a Table. */ /***********************************************************************/ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, - bool del, PHC h) + bool del, PHC) { char *p; int i, n, rc; diff --git a/storage/connect/filamap.cpp b/storage/connect/filamap.cpp index 1e65fa2a413..cac34827b7a 100644 --- a/storage/connect/filamap.cpp +++ b/storage/connect/filamap.cpp @@ -276,7 +276,7 @@ bool MAPFAM::SetPos(PGLOBAL g, int pos) /***********************************************************************/ /* Record file position in case of UPDATE or DELETE. */ /***********************************************************************/ -bool MAPFAM::RecordPos(PGLOBAL g) +bool MAPFAM::RecordPos(PGLOBAL) { Fpos = Mempos; return false; @@ -285,7 +285,7 @@ bool MAPFAM::RecordPos(PGLOBAL g) /***********************************************************************/ /* Initialize Fpos and Mempos for indexed DELETE. */ /***********************************************************************/ -int MAPFAM::InitDelete(PGLOBAL g, int fpos, int spos) +int MAPFAM::InitDelete(PGLOBAL, int fpos, int spos) { Fpos = Memory + (ptrdiff_t)fpos; Mempos = Memory + (ptrdiff_t)spos; @@ -371,7 +371,7 @@ int MAPFAM::ReadBuffer(PGLOBAL g) /***********************************************************************/ /* WriteBuffer: File write routine for MAP access method. */ /***********************************************************************/ -int MAPFAM::WriteBuffer(PGLOBAL g) +int MAPFAM::WriteBuffer(PGLOBAL g __attribute__((unused))) { #if defined(_DEBUG) // Insert mode is no more handled using file mapping @@ -495,7 +495,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Table file close routine for MAP access method. */ /***********************************************************************/ -void MAPFAM::CloseTableFile(PGLOBAL g, bool abort) +void MAPFAM::CloseTableFile(PGLOBAL g, bool) { PlugCloseFile(g, To_Fb); To_Fb = NULL; // To get correct file size in Cardinality @@ -551,7 +551,7 @@ int MBKFAM::Cardinality(PGLOBAL g) /***********************************************************************/ /* Skip one record in file. */ /***********************************************************************/ -int MBKFAM::SkipRecord(PGLOBAL g, bool header) +int MBKFAM::SkipRecord(PGLOBAL, bool) { return RC_OK; } // end of SkipRecord @@ -685,7 +685,7 @@ bool MPXFAM::SetPos(PGLOBAL g, int pos) /***********************************************************************/ /* Initialize CurBlk, CurNum, Mempos and Fpos for indexed DELETE. */ /***********************************************************************/ -int MPXFAM::InitDelete(PGLOBAL g, int fpos, int spos) +int MPXFAM::InitDelete(PGLOBAL, int fpos, int) { Fpos = Memory + Headlen + (ptrdiff_t)fpos * Lrecl; Mempos = Fpos + Lrecl; @@ -740,7 +740,7 @@ int MPXFAM::ReadBuffer(PGLOBAL g) /***********************************************************************/ /* WriteBuffer: File write routine for MAP access method. */ /***********************************************************************/ -int MPXFAM::WriteBuffer(PGLOBAL g) +int MPXFAM::WriteBuffer(PGLOBAL g __attribute__((unused))) { #if defined(_DEBUG) // Insert mode is no more handled using file mapping diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 98b8bb6fd95..8a88b743a15 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -1,11 +1,11 @@ /*********** File AM Dbf C++ Program Source Code File (.CPP) ****************/ /* PROGRAM NAME: FILAMDBF */ /* ------------- */ -/* Version 1.7 */ +/* Version 1.8 */ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -115,6 +115,7 @@ typedef struct _descriptor { /* Side effects: */ /* Moves file pointer to byte 32; fills buffer at buf with */ /* first 32 bytes of file. */ +/* Converts numeric values to platform byte ordering (LE in file) */ /****************************************************************************/ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) { @@ -142,6 +143,11 @@ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) } else strcpy(g->Message, MSG(DBASE_FILE)); + // Convert numeric fields to have them in platform byte ordering + buf->Records = uint4korr(&buf->Records); + buf->Headlen = uint2korr(&buf->Headlen); + buf->Reclen = uint2korr(&buf->Reclen); + // Check last byte(s) of header if (fseek(file, buf->Headlen - dbc, SEEK_SET) != 0) { sprintf(g->Message, MSG(BAD_HEADER), fn); @@ -565,8 +571,8 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) header->Filedate[0] = datm->tm_year - 100; header->Filedate[1] = datm->tm_mon + 1; header->Filedate[2] = datm->tm_mday; - header->Headlen = (ushort)hlen; - header->Reclen = (ushort)reclen; + int2store(&header->Headlen, hlen); + int2store(&header->Reclen, reclen); descp = (DESCRIPTOR*)header; // Currently only standard Xbase types are supported @@ -729,7 +735,7 @@ bool DBFFAM::CopyHeader(PGLOBAL g) if (Headlen) { void *hdr = PlugSubAlloc(g, NULL, Headlen); size_t n, hlen = (size_t)Headlen; - int pos = ftell(Stream); + int pos = ftell(Stream); if (fseek(Stream, 0, SEEK_SET)) strcpy(g->Message, "Seek error in CopyHeader"); @@ -863,13 +869,14 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) if (n > Records) { // Update the number of rows in the file header - char filename[_MAX_PATH]; + char filename[_MAX_PATH], nRecords[4]; + int4store(&nRecords, n); PlugSetPath(filename, To_File, Tdbp->GetPath()); if ((Stream= global_fopen(g, MSGID_OPEN_MODE_STRERROR, filename, "r+b"))) { fseek(Stream, 4, SEEK_SET); // Get header.Records position - fwrite(&n, sizeof(int), 1, Stream); + fwrite(nRecords, sizeof(nRecords), 1, Stream); fclose(Stream); Stream= NULL; Records= n; // Update Records value @@ -944,13 +951,13 @@ bool DBMFAM::AllocateBuffer(PGLOBAL g) /************************************************************************/ DBFHEADER *hp = (DBFHEADER*)Memory; - if (Lrecl != (int)hp->Reclen) { - sprintf(g->Message, MSG(BAD_LRECL), Lrecl, hp->Reclen); + if (Lrecl != (int)uint2korr(&hp->Reclen)) { + sprintf(g->Message, MSG(BAD_LRECL), Lrecl, uint2korr(&hp->Reclen)); return true; } // endif Lrecl - Records = (int)hp->Records; - Headlen = (int)hp->Headlen; + Records = (int)uint4korr(&hp->Records); + Headlen = (int)uint2korr(&hp->Headlen); } // endif Headlen /**************************************************************************/ @@ -1004,7 +1011,7 @@ int DBMFAM::ReadBuffer(PGLOBAL g) /* Data Base delete line routine for DBF access methods. */ /* Deleted lines are just flagged in the first buffer character. */ /****************************************************************************/ -int DBMFAM::DeleteRecords(PGLOBAL g, int irc) +int DBMFAM::DeleteRecords(PGLOBAL, int irc) { if (irc == RC_OK) *Fpos = '*'; diff --git a/storage/connect/filamfix.cpp b/storage/connect/filamfix.cpp index 980d558eee5..4dedd3375b0 100644 --- a/storage/connect/filamfix.cpp +++ b/storage/connect/filamfix.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -102,7 +102,7 @@ bool FIXFAM::SetPos(PGLOBAL g, int pos) /***********************************************************************/ /* Initialize CurBlk and CurNum for indexed DELETE. */ /***********************************************************************/ -int FIXFAM::InitDelete(PGLOBAL g, int fpos, int spos) +int FIXFAM::InitDelete(PGLOBAL, int fpos, int) { CurBlk = fpos / Nrec; CurNum = fpos % Nrec; @@ -690,7 +690,8 @@ bool BGXFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, int org) /***********************************************************************/ /* Read from a big file. */ /***********************************************************************/ -int BGXFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) +int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)), + HANDLE h, void *inbuf, int req) { int rc; diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index eb4e026ee8a..cce9cec56bd 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -436,7 +436,7 @@ err: /* The purpose of this function is to deal with access methods that */ /* are not coherent regarding the use of SetPos and GetPos. */ /***********************************************************************/ -int TXTFAM::InitDelete(PGLOBAL g, int fpos, int spos) +int TXTFAM::InitDelete(PGLOBAL g, int, int) { strcpy(g->Message, "InitDelete should not be used by this table type"); return RC_FX; @@ -519,7 +519,7 @@ int DOSFAM::Cardinality(PGLOBAL g) /* Use BlockTest to reduce the table estimated size. */ /* Note: This function is not really implemented yet. */ /***********************************************************************/ -int DOSFAM::MaxBlkSize(PGLOBAL g, int s) +int DOSFAM::MaxBlkSize(PGLOBAL, int s) { return s; } // end of MaxBlkSize @@ -1272,7 +1272,7 @@ int BLKFAM::Cardinality(PGLOBAL g) /***********************************************************************/ /* Use BlockTest to reduce the table estimated size. */ /***********************************************************************/ -int BLKFAM::MaxBlkSize(PGLOBAL g, int s) +int BLKFAM::MaxBlkSize(PGLOBAL g, int) { int rc = RC_OK, savcur = CurBlk; int size; @@ -1343,7 +1343,7 @@ int BLKFAM::GetNextPos(void) /***********************************************************************/ /* SetPos: Replace the table at the specified position. */ /***********************************************************************/ -bool BLKFAM::SetPos(PGLOBAL g, int pos) +bool BLKFAM::SetPos(PGLOBAL g, int) { strcpy(g->Message, "Blocked variable tables cannot be used indexed"); return true; @@ -1353,7 +1353,7 @@ bool BLKFAM::SetPos(PGLOBAL g, int pos) /* Record file position in case of UPDATE or DELETE. */ /* Not used yet for blocked tables. */ /***********************************************************************/ -bool BLKFAM::RecordPos(PGLOBAL g) +bool BLKFAM::RecordPos(PGLOBAL) { Fpos = (CurNum + Nrec * CurBlk); // Computed file index return false; @@ -1362,7 +1362,7 @@ bool BLKFAM::RecordPos(PGLOBAL g) /***********************************************************************/ /* Skip one record in file. */ /***********************************************************************/ -int BLKFAM::SkipRecord(PGLOBAL g, bool header) +int BLKFAM::SkipRecord(PGLOBAL, bool header) { if (header) { // For Delete diff --git a/storage/connect/filamtxt.h b/storage/connect/filamtxt.h index 1c8ea1e3a6c..ae8f74a9830 100644 --- a/storage/connect/filamtxt.h +++ b/storage/connect/filamtxt.h @@ -57,8 +57,8 @@ class DllExport TXTFAM : public BLOCK { virtual int GetFileLength(PGLOBAL g); virtual int Cardinality(PGLOBAL g); virtual int MaxBlkSize(PGLOBAL g, int s); - virtual bool AllocateBuffer(PGLOBAL g) {return false;} - virtual void ResetBuffer(PGLOBAL g) {} + virtual bool AllocateBuffer(PGLOBAL) {return false;} + virtual void ResetBuffer(PGLOBAL) {} virtual int GetNerr(void) {return 0;} virtual int GetRowID(void) = 0; virtual bool RecordPos(PGLOBAL g) = 0; diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index e1f11bbf4cf..60a8875e015 100755 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -279,7 +279,7 @@ bool VCTFAM::SetBlockInfo(PGLOBAL g) /***********************************************************************/ /* Use BlockTest to reduce the table estimated size. */ /***********************************************************************/ -int VCTFAM::MaxBlkSize(PGLOBAL g, int s) +int VCTFAM::MaxBlkSize(PGLOBAL g, int) { int rc = RC_OK, savcur = CurBlk; int size; @@ -1716,7 +1716,7 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Move intermediate deleted or updated lines. */ /***********************************************************************/ -bool VCMFAM::MoveIntermediateLines(PGLOBAL g, bool *b) +bool VCMFAM::MoveIntermediateLines(PGLOBAL, bool *) { int i, m, n; @@ -1765,7 +1765,7 @@ bool VCMFAM::MoveIntermediateLines(PGLOBAL g, bool *b) /***********************************************************************/ /* Data Base close routine for VMP access method. */ /***********************************************************************/ -void VCMFAM::CloseTableFile(PGLOBAL g, bool abort) +void VCMFAM::CloseTableFile(PGLOBAL g, bool) { int wrc = RC_OK; MODE mode = Tdbp->GetMode(); @@ -1800,7 +1800,7 @@ void VCMFAM::CloseTableFile(PGLOBAL g, bool abort) /***********************************************************************/ /* ReadBlock: Read column values from current block. */ /***********************************************************************/ -bool VCMFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) +bool VCMFAM::ReadBlock(PGLOBAL, PVCTCOL colp) { char *mempos; int i = colp->Index - 1; @@ -1830,7 +1830,7 @@ bool VCMFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) /* the mapped file, except when checking for Update but in this case */ /* we do not want to write back the modifications either. */ /***********************************************************************/ -bool VCMFAM::WriteBlock(PGLOBAL g, PVCTCOL colp) +bool VCMFAM::WriteBlock(PGLOBAL, PVCTCOL colp __attribute__((unused))) { #if defined(_DEBUG) char *mempos; @@ -2124,7 +2124,7 @@ bool VECFAM::AllocateBuffer(PGLOBAL g) /***********************************************************************/ /* Do initial action when inserting. */ /***********************************************************************/ -bool VECFAM::InitInsert(PGLOBAL g) +bool VECFAM::InitInsert(PGLOBAL) { // We come here in MODE_INSERT only CurBlk = 0; @@ -2365,7 +2365,7 @@ bool VECFAM::MoveLines(PGLOBAL g) /***********************************************************************/ /* Move intermediate deleted or updated lines. */ /***********************************************************************/ -bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *bn) +bool VECFAM::MoveIntermediateLines(PGLOBAL g, bool *) { int i, n; bool b = false; @@ -3009,7 +3009,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for VMP access method. */ /***********************************************************************/ -void VMPFAM::CloseTableFile(PGLOBAL g, bool abort) +void VMPFAM::CloseTableFile(PGLOBAL g, bool) { if (Tdbp->GetMode() == MODE_DELETE) { // Set Block and Nrec values for TDBVCT::MakeBlockValues diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index 1288689325c..54af93e11fa 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2005-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2005-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -247,7 +247,7 @@ int ZIPFAM::GetNextPos(void) /***********************************************************************/ /* SetPos: Replace the table at the specified position. */ /***********************************************************************/ -bool ZIPFAM::SetPos(PGLOBAL g, int pos) +bool ZIPFAM::SetPos(PGLOBAL g, int pos __attribute__((unused))) { sprintf(g->Message, MSG(NO_SETPOS_YET), "ZIP"); return true; @@ -267,7 +267,7 @@ bool ZIPFAM::SetPos(PGLOBAL g, int pos) /***********************************************************************/ /* Record file position in case of UPDATE or DELETE. */ /***********************************************************************/ -bool ZIPFAM::RecordPos(PGLOBAL g) +bool ZIPFAM::RecordPos(PGLOBAL) { Zpos = gztell(Zfile); return false; @@ -376,7 +376,7 @@ int ZIPFAM::WriteBuffer(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for ZDOS access method. (NIY) */ /***********************************************************************/ -int ZIPFAM::DeleteRecords(PGLOBAL g, int irc) +int ZIPFAM::DeleteRecords(PGLOBAL g, int) { strcpy(g->Message, MSG(NO_ZIP_DELETE)); return RC_FX; @@ -385,7 +385,7 @@ int ZIPFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for DOS access method. */ /***********************************************************************/ -void ZIPFAM::CloseTableFile(PGLOBAL g, bool abort) +void ZIPFAM::CloseTableFile(PGLOBAL, bool) { int rc = gzclose(Zfile); @@ -431,7 +431,7 @@ ZBKFAM::ZBKFAM(PZBKFAM txfp) : ZIPFAM(txfp) /***********************************************************************/ /* Use BlockTest to reduce the table estimated size. */ /***********************************************************************/ -int ZBKFAM::MaxBlkSize(PGLOBAL g, int s) +int ZBKFAM::MaxBlkSize(PGLOBAL g, int) { int rc = RC_OK, savcur = CurBlk; int size; @@ -503,7 +503,7 @@ int ZBKFAM::GetPos(void) /* Record file position in case of UPDATE or DELETE. */ /* Not used yet for fixed tables. */ /***********************************************************************/ -bool ZBKFAM::RecordPos(PGLOBAL g) +bool ZBKFAM::RecordPos(PGLOBAL /*g*/) { //strcpy(g->Message, "RecordPos not implemented for zip blocked tables"); //return true; @@ -513,7 +513,7 @@ bool ZBKFAM::RecordPos(PGLOBAL g) /***********************************************************************/ /* Skip one record in file. */ /***********************************************************************/ -int ZBKFAM::SkipRecord(PGLOBAL g, bool header) +int ZBKFAM::SkipRecord(PGLOBAL /*g*/, bool) { //strcpy(g->Message, "SkipRecord not implemented for zip blocked tables"); //return RC_FX; @@ -668,7 +668,7 @@ int ZBKFAM::DeleteRecords(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for ZBK access method. */ /***********************************************************************/ -void ZBKFAM::CloseTableFile(PGLOBAL g, bool abort) +void ZBKFAM::CloseTableFile(PGLOBAL g, bool) { int rc = RC_OK; @@ -1060,7 +1060,7 @@ int ZLBFAM::GetNextPos(void) /***********************************************************************/ /* SetPos: Replace the table at the specified position. */ /***********************************************************************/ -bool ZLBFAM::SetPos(PGLOBAL g, int pos) +bool ZLBFAM::SetPos(PGLOBAL g, int pos __attribute__((unused))) { sprintf(g->Message, MSG(NO_SETPOS_YET), "ZIP"); return true; @@ -1350,7 +1350,7 @@ bool ZLBFAM::WriteCompressedBuffer(PGLOBAL g) /***********************************************************************/ /* Table file close routine for DOS access method. */ /***********************************************************************/ -void ZLBFAM::CloseTableFile(PGLOBAL g, bool abort) +void ZLBFAM::CloseTableFile(PGLOBAL g, bool) { int rc = RC_OK; diff --git a/storage/connect/filter.h b/storage/connect/filter.h index 78e066d9ab7..ab7c2139b68 100644 --- a/storage/connect/filter.h +++ b/storage/connect/filter.h @@ -1,7 +1,7 @@ /*************** Filter H Declares Source Code File (.H) ***************/ /* Name: FILTER.H Version 1.2 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2010-2012 */ +/* (C) Copyright to the author Olivier BERTRAND 2010-2015 */ /* */ /* This file contains the FILTER and derived classes declares. */ /***********************************************************************/ @@ -105,7 +105,7 @@ class FILTERX : public FILTER { virtual bool Eval(PGLOBAL) = 0; // just to prevent direct FILTERX use // Fake operator new used to change a filter into a derived filter - void * operator new(size_t size, PFIL filp) {return filp;} + void * operator new(size_t, PFIL filp) {return filp;} #if defined(WIN32) // Avoid warning C4291 by defining a matching dummy delete operator void operator delete(void *, PFIL) {} diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index a3f88bfe7eb..72f48d72bb1 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -168,35 +168,21 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.03.0006 April 12, 2015"; - + char version[]= "Version 1.03.0007 April 30, 2015"; #if defined(WIN32) - char compver[]= "Version 1.03.0006 " __DATE__ " " __TIME__; + char compver[]= "Version 1.03.0007 " __DATE__ " " __TIME__; char slash= '\\'; #else // !WIN32 char slash= '/'; #endif // !WIN32 - -// int trace= 0; // The general trace value -// ulong xconv= 0; // The type conversion option -// int zconv= 0; // The text conversion size } // extern "C" #if defined(XMAP) my_bool xmap= false; #endif // XMAP -// uint worksize= 0; ulong ha_connect::num= 0; -//int DTVAL::Shift= 0; -/* CONNECT system variables */ -//atic int conv_size= 0; -//atic uint work_size= 0; -//atic ulong type_conv= 0; -#if defined(XMAP) -//atic my_bool indx_map= 0; -#endif // XMAP #if defined(XMSG) extern "C" { char *msg_path; @@ -207,7 +193,7 @@ extern "C" { /* Utility functions. */ /***********************************************************************/ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); -PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info); +PQRYRES VirColumns(PGLOBAL g, bool info); PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, int pretty, int lvl, int mxr, bool info); PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info); @@ -363,7 +349,7 @@ int GetConvSize(void) {return THDVAR(current_thd, conv_size);} TYPCONV GetTypeConv(void) {return (TYPCONV)THDVAR(current_thd, type_conv);} uint GetJsonGrpSize(void) {return THDVAR(current_thd, json_grp_size);} uint GetWorkSize(void) {return THDVAR(current_thd, work_size);} -void SetWorkSize(uint n) +void SetWorkSize(uint) { // Changing the session variable value seems to be impossible here // and should be done in a check function @@ -613,9 +599,9 @@ DllExport LPCSTR PlugSetPath(LPSTR to, LPCSTR name, LPCSTR dir) delete_table method in handler.cc */ static const char *ha_connect_exts[]= { - ".dos", ".fix", ".csv", ".bin", ".fmt", ".dbf", ".xml", ".ini", ".vec", - ".dnx", ".fnx", ".bnx", ".vnx", ".dbx", ".dop", ".fop", ".bop", ".vop", - NULL}; + ".dos", ".fix", ".csv", ".bin", ".fmt", ".dbf", ".xml", ".json", ".ini", + ".vec", ".dnx", ".fnx", ".bnx", ".vnx", ".dbx", ".dop", ".fop", ".bop", + ".vop", NULL}; /** @brief @@ -678,7 +664,7 @@ static int connect_init_func(void *p) @brief Plugin clean up */ -static int connect_done_func(void *p) +static int connect_done_func(void *) { int error= 0; PCONNECT pc, pn; @@ -836,8 +822,6 @@ ha_connect::~ha_connect(void) /****************************************************************************/ static PCONNECT GetUser(THD *thd, PCONNECT xp) { - const char *dbn= NULL; - if (!thd) return NULL; @@ -849,7 +833,7 @@ static PCONNECT GetUser(THD *thd, PCONNECT xp) break; if (!xp) { - xp= new user_connect(thd, dbn); + xp= new user_connect(thd); if (xp->user_init()) { delete xp; @@ -922,7 +906,8 @@ const char *ha_connect::index_type(uint inx) If all_parts is set, MySQL wants to know the flags for the combined index, up to and including 'part'. */ -ulong ha_connect::index_flags(uint inx, uint part, bool all_parts) const +//ong ha_connect::index_flags(uint inx, uint part, bool all_parts) const +ulong ha_connect::index_flags(uint, uint, bool) const { ulong flags= HA_READ_NEXT | HA_READ_RANGE | HA_KEYREAD_ONLY | HA_KEY_SCAN_NOT_ROR; @@ -2022,7 +2007,7 @@ int ha_connect::MakeRecord(char *buf) /***********************************************************************/ /* Set row values from a MySQL pseudo record. Specific to MySQL. */ /***********************************************************************/ -int ha_connect::ScanRecord(PGLOBAL g, uchar *buf) +int ha_connect::ScanRecord(PGLOBAL g, uchar *) { char attr_buffer[1024]; char data_buffer[1024]; @@ -2164,7 +2149,7 @@ int ha_connect::ScanRecord(PGLOBAL g, uchar *buf) /* Check change in index column. Specific to MySQL. */ /* Should be elaborated to check for real changes. */ /***********************************************************************/ -int ha_connect::CheckRecord(PGLOBAL g, const uchar *oldbuf, uchar *newbuf) +int ha_connect::CheckRecord(PGLOBAL g, const uchar *, uchar *newbuf) { return ScanRecord(g, newbuf); } // end of dummy CheckRecord @@ -2937,7 +2922,7 @@ bool ha_connect::get_error_message(int error, String* buf) &dummy_errors); if (trace) - htrc("GEM(%u): %s\n", len, g->Message); + htrc("GEM(%d): len=%u %s\n", error, len, g->Message); msg[len]= '\0'; buf->copy(msg, (uint)strlen(msg), system_charset_info); @@ -3033,7 +3018,7 @@ int ha_connect::open(const char *name, int mode, uint test_if_locked) @brief Make the indexes for this table */ -int ha_connect::optimize(THD* thd, HA_CHECK_OPT* check_opt) +int ha_connect::optimize(THD* thd, HA_CHECK_OPT*) { int rc= 0; PGLOBAL& g= xp->g; @@ -3237,7 +3222,7 @@ int ha_connect::update_row(const uchar *old_data, uchar *new_data) @see sql_acl.cc, sql_udf.cc, sql_delete.cc, sql_insert.cc and sql_select.cc */ -int ha_connect::delete_row(const uchar *buf) +int ha_connect::delete_row(const uchar *) { int rc= 0; DBUG_ENTER("ha_connect::delete_row"); @@ -3517,7 +3502,8 @@ int ha_connect::index_last(uchar *buf) /****************************************************************************/ /* This is called to get more rows having the same index value. */ /****************************************************************************/ -int ha_connect::index_next_same(uchar *buf, const uchar *key, uint keylen) +//t ha_connect::index_next_same(uchar *buf, const uchar *key, uint keylen) +int ha_connect::index_next_same(uchar *buf, const uchar *, uint) { int rc; DBUG_ENTER("ha_connect::index_next_same"); @@ -3707,7 +3693,7 @@ int ha_connect::rnd_next(uchar *buf) @see filesort.cc, sql_select.cc, sql_delete.cc and sql_update.cc */ -void ha_connect::position(const uchar *record) +void ha_connect::position(const uchar *) { DBUG_ENTER("ha_connect::position"); //if (((PTDBASE)tdbp)->GetDef()->Indexable()) @@ -3890,7 +3876,7 @@ int ha_connect::info(uint flag) @see ha_innodb.cc */ -int ha_connect::extra(enum ha_extra_function operation) +int ha_connect::extra(enum ha_extra_function /*operation*/) { DBUG_ENTER("ha_connect::extra"); DBUG_RETURN(0); @@ -4498,7 +4484,7 @@ int ha_connect::external_lock(THD *thd, int lock_type) @see get_lock_data() in lock.cc */ -THR_LOCK_DATA **ha_connect::store_lock(THD *thd, +THR_LOCK_DATA **ha_connect::store_lock(THD *, THR_LOCK_DATA **to, enum thr_lock_type lock_type) { @@ -4646,8 +4632,13 @@ int ha_connect::delete_or_rename_table(const char *name, const char *to) } // endif pos - } else // Avoid infamous DBUG_ASSERT - thd->get_stmt_da()->reset_diagnostics_area(); + } // endif open_table_def + +// This below was done to avoid DBUG_ASSERT in some case that +// we don't know anymore what they were. It was suppressed because +// it did cause assertion in other cases (see MDEV-7935) +// } else // Avoid infamous DBUG_ASSERT +// thd->get_stmt_da()->reset_diagnostics_area(); free_table_share(share); } else // Temporary file @@ -4730,6 +4721,25 @@ ha_rows ha_connect::records_in_range(uint inx, key_range *min_key, DBUG_RETURN(rows); } // end of records_in_range +// Used to check whether a MYSQL table is created on itself +bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, + const char *db, char *tab, const char *src, int port) +{ + if (src) + return false; + else if (host && stricmp(host, "localhost") && strcmp(host, "127.0.0.1")) + return false; + else if (db && stricmp(db, s->db.str)) + return false; + else if (tab && stricmp(tab, s->table_name.str)) + return false; + else if (port && port != (signed)GetDefaultPort()) + return false; + + strcpy(g->Message, "This MySQL table is defined on itself"); + return true; +} // end of CheckSelf + /** Convert an ISO-8859-1 column name to UTF-8 */ @@ -4891,7 +4901,7 @@ static int init_table_share(THD* thd, oom|= sql->append(' '); oom|= sql->append(opt->name); oom|= sql->append('='); - oom|= sql->append(vull ? "ON" : "OFF"); + oom|= sql->append(vull ? "YES" : "NO"); } // endif vull break; @@ -4933,25 +4943,6 @@ static int init_table_share(THD* thd, sql->ptr(), sql->length()); } // end of init_table_share -// Used to check whether a MYSQL table is created on itself -bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, - const char *db, char *tab, const char *src, int port) -{ - if (src) - return false; - else if (host && stricmp(host, "localhost") && strcmp(host, "127.0.0.1")) - return false; - else if (db && stricmp(db, s->db.str)) - return false; - else if (tab && stricmp(tab, s->table_name.str)) - return false; - else if (port && port != (signed)GetDefaultPort()) - return false; - - strcpy(g->Message, "This MySQL table is defined on itself"); - return true; -} // end of CheckSelf - /** @brief connect_assisted_discovery() is called when creating a table with no columns. @@ -4964,7 +4955,7 @@ bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, @note this function is no more called in case of CREATE .. SELECT */ -static int connect_assisted_discovery(handlerton *hton, THD* thd, +static int connect_assisted_discovery(handlerton *, THD* thd, TABLE_SHARE *table_s, HA_CREATE_INFO *create_info) { @@ -4976,8 +4967,8 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, #if defined(WIN32) char *nsp= NULL, *cls= NULL; #endif // WIN32 - int port= 0, hdr= 0, mxr __attribute__((unused))= 0, mxe= 0, rc= 0; - int cop __attribute__((unused))= 0, pty= 2, lrecl= 0, lvl= 0; + int port= 0, hdr= 0, mxr= 0, mxe= 0, rc= 0, lvl= 0; + int cop __attribute__((unused))= 0, pty= 2, lrecl= 0; #if defined(ODBC_SUPPORT) POPARM sop = NULL; char *ucnc = NULL; @@ -5346,7 +5337,7 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd, break; #endif // PIVOT_SUPPORT case TAB_VIR: - qrp= VirColumns(g, tab, (char*)db, fnc == FNC_COL); + qrp= VirColumns(g, fnc == FNC_COL); break; case TAB_JSON: qrp= JSONColumns(g, (char*)db, fn, objn, pty, lrecl, lvl, fnc == FNC_COL); @@ -6473,8 +6464,7 @@ fin: @note: This function is no more called by check_if_supported_inplace_alter */ -bool ha_connect::check_if_incompatible_data(HA_CREATE_INFO *info, - uint table_changes) +bool ha_connect::check_if_incompatible_data(HA_CREATE_INFO *, uint) { DBUG_ENTER("ha_connect::check_if_incompatible_data"); // TO DO: really implement and check it. diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 194cb6defd6..1ad33d83068 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -17,40 +17,45 @@ #include "json.h" #define MEMFIX 512 +#define UDF_EXEC_ARGS \ + UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* uint GetJsonGrpSize(void); extern "C" { DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Value(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Value(UDF_EXEC_ARGS); DllExport void Json_Value_deinit(UDF_INIT*); + DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Array(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Array(UDF_EXEC_ARGS); DllExport void Json_Array_deinit(UDF_INIT*); + DllExport my_bool Json_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Array_Add(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Array_Add(UDF_EXEC_ARGS); DllExport void Json_Array_Add_deinit(UDF_INIT*); + +DllExport my_bool Json_Array_Delete_init(UDF_INIT*, UDF_ARGS*, char*); +DllExport char *Json_Array_Delete(UDF_EXEC_ARGS); +DllExport void Json_Array_Delete_deinit(UDF_INIT*); + DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Object(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Object(UDF_EXEC_ARGS); DllExport void Json_Object_deinit(UDF_INIT*); + DllExport my_bool Json_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Object_Nonull(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Object_Nonull(UDF_EXEC_ARGS); DllExport void Json_Object_Nonull_deinit(UDF_INIT*); + DllExport my_bool Json_Array_Grp_init(UDF_INIT*, UDF_ARGS*, char*); DllExport void Json_Array_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); -DllExport char *Json_Array_Grp(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Array_Grp(UDF_EXEC_ARGS); DllExport void Json_Array_Grp_clear(UDF_INIT *, char *, char *); DllExport void Json_Array_Grp_deinit(UDF_INIT*); + DllExport my_bool Json_Object_Grp_init(UDF_INIT*, UDF_ARGS*, char*); DllExport void Json_Object_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); -DllExport char *Json_Object_Grp(UDF_INIT*, UDF_ARGS*, char*, - unsigned long*, char *, char *); +DllExport char *Json_Object_Grp(UDF_EXEC_ARGS); DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *); DllExport void Json_Object_Grp_deinit(UDF_INIT*); } // extern "C" @@ -291,7 +296,7 @@ my_bool Json_Value_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Value_init char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; PJVAL jvp; @@ -324,7 +329,7 @@ my_bool Json_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Array_init char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; uint i; @@ -371,7 +376,7 @@ my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Array_Add_init char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; PJVAL jvp; @@ -404,6 +409,67 @@ void Json_Array_Add_deinit(UDF_INIT* initid) PlugExit((PGLOBAL)initid->ptr); } // end of Json_Array_Add_deinit +/***********************************************************************/ +/* Add values to a Json array. */ +/***********************************************************************/ +my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count != 2) { + strcpy(message, "Json_Value_Delete must have 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Json_Value_Delete first argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, message, reslen, memlen); +} // end of Json_Array_Delete_init + +char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *str; + int n; + PJVAL jvp; + PJAR arp; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + jvp = MakeValue(g, args, 0); + + if (jvp->GetValType() != TYPE_JAR) { + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, + "First argument is not an array"); + str = args->args[0]; + } else if (args->arg_type[1] != INT_RESULT) { + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, + "Second argument is not an integer"); + str = args->args[0]; + } else { + n = *(int*)args->args[1]; + arp = jvp->GetArray(); + arp->DeleteValue(n - 1); + arp->InitArray(g); + + if (!(str = Serialize(g, arp, NULL, 0))) { + str = strcpy(result, g->Message); + push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, str); + } // endif str + + } // endif's + + *res_length = strlen(str); + return str; +} // end of Json_Array_Delete + +void Json_Array_Delete_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Array_Delete_deinit + /***********************************************************************/ /* Make a Json Oject containing all the parameters. */ /***********************************************************************/ @@ -416,7 +482,7 @@ my_bool Json_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Object_init char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; uint i; @@ -454,7 +520,7 @@ my_bool Json_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, } // end of Json_Object_Nonull_init char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, char *, char *) { char *str; uint i; @@ -508,8 +574,7 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of Json_Array_Grp_init -void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) +void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; PJAR arp = (PJAR)g->Activityp; @@ -519,8 +584,8 @@ void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, } // end of Json_Array_Grp_add -char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) +char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, + unsigned long *res_length, char *, char *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -539,7 +604,7 @@ char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, return str; } // end of Json_Array_Grp -void Json_Array_Grp_clear(UDF_INIT *initid, char *is_null, char *error) +void Json_Array_Grp_clear(UDF_INIT *initid, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -580,8 +645,7 @@ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of Json_Object_Grp_init -void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) +void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; PJOB objp = (PJOB)g->Activityp; @@ -591,8 +655,8 @@ void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, } // end of Json_Object_Grp_add -char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) +char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, + unsigned long *res_length, char *, char *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -609,7 +673,7 @@ char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *args, char *result, return str; } // end of Json_Object_Grp -void Json_Object_Grp_clear(UDF_INIT *initid, char *is_null, char *error) +void Json_Object_Grp_clear(UDF_INIT *initid, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index b15c8fa2322..0bc82cd80ce 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2014 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ /* ------------- */ /* Version 1.4 */ /* */ -/* Author: Olivier Bertrand 2012 - 2014 */ +/* Author: Olivier Bertrand 2012 - 2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -478,7 +478,7 @@ void MYCAT::SetPath(PGLOBAL g, LPCSTR *datapath, const char *path) /* Look for a table descriptor matching the name and type. */ /***********************************************************************/ PRELDEF MYCAT::GetTableDesc(PGLOBAL g, LPCSTR name, - LPCSTR type, PRELDEF *prp) + LPCSTR type, PRELDEF *) { if (trace) printf("GetTableDesc: name=%s am=%s\n", name, SVP(type)); @@ -589,7 +589,7 @@ PTDB MYCAT::GetTable(PGLOBAL g, PTABLE tablep, MODE mode, LPCSTR type) /***********************************************************************/ /* ClearDB: Terminates Database usage. */ /***********************************************************************/ -void MYCAT::ClearDB(PGLOBAL g) +void MYCAT::ClearDB(PGLOBAL) { } // end of ClearDB diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h index cdbe4e5bca9..f7c4c70eaf5 100644 --- a/storage/connect/mycat.h +++ b/storage/connect/mycat.h @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2013 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -98,7 +98,7 @@ class MYCAT : public CATALOG { void Reset(void); //void SetDataPath(PGLOBAL g, const char *path) // {SetPath(g, &DataPath, path);} - bool StoreIndex(PGLOBAL g, PTABDEF defp) {return false;} // Temporary + bool StoreIndex(PGLOBAL, PTABDEF) {return false;} // Temporary PRELDEF GetTableDesc(PGLOBAL g, LPCSTR name, LPCSTR type, PRELDEF *prp = NULL); PTDB GetTable(PGLOBAL g, PTABLE tablep, diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index 47d781d9ff6..2b958b512f3 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2007-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2007-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -720,7 +720,7 @@ int MYSQLC::ExecSQL(PGLOBAL g, const char *query, int *w) /***********************************************************************/ /* Get table size by executing "select count(*) from table_name". */ /***********************************************************************/ -int MYSQLC::GetTableSize(PGLOBAL g, PSZ query) +int MYSQLC::GetTableSize(PGLOBAL g __attribute__((unused)), PSZ query) { if (mysql_real_query(m_DB, query, strlen(query))) { #if defined(_DEBUG) diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index 32f6d6f8366..a2b1baf1249 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -888,7 +888,7 @@ FILE *PlugReopenFile(PGLOBAL g, PFBLOCK fp, LPCSTR md) /* Close file routine: the purpose of this routine is to avoid */ /* double closing that freeze the system on some Unix platforms. */ /***********************************************************************/ -int PlugCloseFile(PGLOBAL g, PFBLOCK fp, bool all) +int PlugCloseFile(PGLOBAL g __attribute__((unused)), PFBLOCK fp, bool all) { int rc = 0; diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 47f825e965d..d0483b5075d 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -548,7 +548,7 @@ bool OEMDEF::DeleteTableFile(PGLOBAL g) /***********************************************************************/ /* Define: initialize the table definition block from XDB file. */ /***********************************************************************/ -bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR, int) { Module = GetStringCatInfo(g, "Module", ""); Subtype = GetStringCatInfo(g, "Subtype", Module); @@ -715,7 +715,7 @@ COLDEF::COLDEF(void) : COLCRT() /***********************************************************************/ /* Define: initialize a column definition from a COLINFO structure. */ /***********************************************************************/ -int COLDEF::Define(PGLOBAL g, void *memp, PCOLINFO cfp, int poff) +int COLDEF::Define(PGLOBAL g, void *, PCOLINFO cfp, int poff) { Name = (PSZ)PlugDup(g, cfp->Name); diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h index 13bd392b706..ec70f18e151 100644 --- a/storage/connect/reldef.h +++ b/storage/connect/reldef.h @@ -1,7 +1,7 @@ /*************** RelDef H Declares Source Code File (.H) ***************/ /* Name: RELDEF.H Version 1.5 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ /* */ /* This file contains the DEF classes definitions. */ /***********************************************************************/ @@ -89,7 +89,7 @@ class DllExport TABDEF : public RELDEF { /* Logical table descriptor */ bool IsReadOnly(void) {return Read_Only;} virtual AMT GetDefType(void) {return TYPE_AM_TAB;} virtual PIXDEF GetIndx(void) {return NULL;} - virtual void SetIndx(PIXDEF xp) {} + virtual void SetIndx(PIXDEF) {} virtual bool IsHuge(void) {return false;} const CHARSET_INFO *data_charset() {return m_data_charset;} diff --git a/storage/connect/tabcol.cpp b/storage/connect/tabcol.cpp index 8f350c6f074..662c0b514cf 100644 --- a/storage/connect/tabcol.cpp +++ b/storage/connect/tabcol.cpp @@ -1,7 +1,7 @@ /************* TabCol C++ Functions Source Code File (.CPP) ************/ /* Name: TABCOL.CPP Version 2.7 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2013 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ /* This file contains the PlugDB++ XTAB, COLUMN and XORDER methods. */ /***********************************************************************/ @@ -91,7 +91,7 @@ void XTAB::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of XTAB contents. */ /***********************************************************************/ -void XTAB::Print(PGLOBAL g, char *ps, uint z) +void XTAB::Print(PGLOBAL, char *ps, uint z) { char buf[128]; int i, n = (int)z - 1; @@ -125,7 +125,7 @@ COLUMN::COLUMN(LPCSTR name) : Name(name) /***********************************************************************/ /* COLUMN SetFormat: should never be called. */ /***********************************************************************/ -bool COLUMN::SetFormat(PGLOBAL g, FORMAT& fmt) +bool COLUMN::SetFormat(PGLOBAL g, FORMAT&) { strcpy(g->Message, MSG(NO_FORMAT_COL)); return true; @@ -154,7 +154,7 @@ void COLUMN::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of COLUMN contents. */ /***********************************************************************/ -void COLUMN::Print(PGLOBAL g, char *ps, uint z) +void COLUMN::Print(PGLOBAL, char *ps, uint z) { char buf[80]; diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index ba22da52998..37bd94cf1bb 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -117,7 +117,7 @@ DOSDEF::DOSDEF(void) /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /***********************************************************************/ -bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int) { char buf[8]; bool map = (am && (*am == 'M' || *am == 'm')); @@ -303,7 +303,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) /***********************************************************************/ /* InvalidateIndex: mark all indexes as invalid. */ /***********************************************************************/ -bool DOSDEF::InvalidateIndex(PGLOBAL g) +bool DOSDEF::InvalidateIndex(PGLOBAL) { if (To_Indx) for (PIXDEF xp = To_Indx; xp; xp = xp->Next) @@ -1736,15 +1736,16 @@ err: /***********************************************************************/ /* Make a dynamic index. */ /***********************************************************************/ -bool TDBDOS::InitialyzeIndex(PGLOBAL g, PIXDEF xdp, bool sorted) +bool TDBDOS::InitialyzeIndex(PGLOBAL g, volatile PIXDEF xdp, bool sorted) { int k, rc; - bool brc, dynamic; + volatile bool dynamic; + bool brc; PCOL colp; PCOLDEF cdp; PVAL valp; PXLOAD pxp; - PKXBASE kxp; + volatile PKXBASE kxp; PKPDEF kdp; if (!xdp && !(xdp = To_Xdp)) { @@ -1864,7 +1865,7 @@ int TDBDOS::GetProgCur(void) /***********************************************************************/ /* RowNumber: return the ordinal number of the current row. */ /***********************************************************************/ -int TDBDOS::RowNumber(PGLOBAL g, bool b) +int TDBDOS::RowNumber(PGLOBAL g, bool) { if (To_Kindex) { /*******************************************************************/ @@ -1944,7 +1945,7 @@ int TDBDOS::Cardinality(PGLOBAL g) rec = ((PDOSDEF)To_Def)->Ending; if (AvgLen <= 0) // No given average estimate - rec += EstimatedLength(g); + rec += EstimatedLength(); else // An estimate was given for the average record length rec += AvgLen; @@ -1988,7 +1989,7 @@ int TDBDOS::GetMaxSize(PGLOBAL g) /* Estimate the number of lines in the table (if not known) by */ /* dividing the file length by minimum record length. */ /*****************************************************************/ - rec = EstimatedLength(g) + ((PDOSDEF)To_Def)->Ending; + rec = EstimatedLength() + ((PDOSDEF)To_Def)->Ending; MaxSize = (len + rec - 1) / rec; if (trace) @@ -2005,7 +2006,7 @@ int TDBDOS::GetMaxSize(PGLOBAL g) /***********************************************************************/ /* DOS EstimatedLength. Returns an estimated minimum line length. */ /***********************************************************************/ -int TDBDOS::EstimatedLength(PGLOBAL g) +int TDBDOS::EstimatedLength(void) { int dep = 0; PCOLDEF cdp = To_Def->GetCols(); @@ -2023,7 +2024,7 @@ int TDBDOS::EstimatedLength(PGLOBAL g) /***********************************************************************/ /* DOS tables favor the use temporary files for Update. */ /***********************************************************************/ -bool TDBDOS::IsUsingTemp(PGLOBAL g) +bool TDBDOS::IsUsingTemp(PGLOBAL) { USETEMP utp = UseTemp(); @@ -2183,7 +2184,7 @@ int TDBDOS::ReadDB(PGLOBAL g) /***********************************************************************/ /* PrepareWriting: Prepare the line to write. */ /***********************************************************************/ -bool TDBDOS::PrepareWriting(PGLOBAL g) +bool TDBDOS::PrepareWriting(PGLOBAL) { if (!Ftype && (Mode == MODE_INSERT || Txfp->GetUseTemp())) { char *p; diff --git a/storage/connect/tabdos.h b/storage/connect/tabdos.h index b7150294e9b..9115b1fae86 100644 --- a/storage/connect/tabdos.h +++ b/storage/connect/tabdos.h @@ -1,7 +1,7 @@ /*************** TabDos H Declares Source Code File (.H) ***************/ /* Name: TABDOS.H Version 3.3 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ /* */ /* This file contains the DOS classes declares. */ /***********************************************************************/ @@ -123,11 +123,11 @@ class DllExport TDBDOS : public TDBASE { // Implementation virtual AMT GetAmType(void) {return Txfp->GetAmType();} - virtual PSZ GetFile(PGLOBAL g) {return Txfp->To_File;} - virtual void SetFile(PGLOBAL g, PSZ fn) {Txfp->To_File = fn;} + virtual PSZ GetFile(PGLOBAL) {return Txfp->To_File;} + virtual void SetFile(PGLOBAL, PSZ fn) {Txfp->To_File = fn;} virtual void SetAbort(bool b) {Abort = b;} virtual RECFM GetFtype(void) {return Ftype;} - virtual bool SkipHeader(PGLOBAL g) {return false;} + virtual bool SkipHeader(PGLOBAL) {return false;} virtual void RestoreNrec(void) {Txfp->SetNrec(1);} virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBDOS(g, this);} @@ -149,7 +149,7 @@ class DllExport TDBDOS : public TDBASE { // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual char *GetOpenMode(PGLOBAL g, char *opmode) {return NULL;} + virtual char *GetOpenMode(PGLOBAL, char*) {return NULL;} virtual int GetFileLength(PGLOBAL g) {return Txfp->GetFileLength(g);} virtual int GetProgMax(PGLOBAL g); virtual int GetProgCur(void); @@ -168,7 +168,7 @@ class DllExport TDBDOS : public TDBASE { virtual int ReadBuffer(PGLOBAL g) {return Txfp->ReadBuffer(g);} // Specific routine - virtual int EstimatedLength(PGLOBAL g); + virtual int EstimatedLength(void); // Optimization routines virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add); diff --git a/storage/connect/tabfix.cpp b/storage/connect/tabfix.cpp index 77e47e6f8dd..5cfd5a726ef 100644 --- a/storage/connect/tabfix.cpp +++ b/storage/connect/tabfix.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1998-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1998-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -271,7 +271,7 @@ int TDBFIX::RowNumber(PGLOBAL g, bool b) /***********************************************************************/ /* FIX tables don't use temporary files except if specified as do it. */ /***********************************************************************/ -bool TDBFIX::IsUsingTemp(PGLOBAL g) +bool TDBFIX::IsUsingTemp(PGLOBAL) { // Not ready yet to handle using a temporary file with mapping // or while deleting from DBF files. diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index d5f8dc50a89..a5e14e1b81f 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 2001 - 2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2001 - 2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -625,7 +625,7 @@ bool TDBCSV::CheckErr(void) /***********************************************************************/ /* CSV EstimatedLength. Returns an estimated minimum line length. */ /***********************************************************************/ -int TDBCSV::EstimatedLength(PGLOBAL g) +int TDBCSV::EstimatedLength(void) { int n = 0; PCOLDEF cdp; @@ -1118,7 +1118,7 @@ PCOL TDBFMT::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /* FMT EstimatedLength. Returns an estimated minimum line length. */ /* The big problem here is how can we astimated that minimum ? */ /***********************************************************************/ -int TDBFMT::EstimatedLength(PGLOBAL g) +int TDBFMT::EstimatedLength(void) { // This is rather stupid !!! return ((PDOSDEF)To_Def)->GetEnding() + (int)((Lrecl / 10) + 1); diff --git a/storage/connect/tabfmt.h b/storage/connect/tabfmt.h index 8a1e1f17561..ce80a276cdc 100644 --- a/storage/connect/tabfmt.h +++ b/storage/connect/tabfmt.h @@ -75,7 +75,7 @@ class TDBCSV : public TDBDOS { virtual int ReadBuffer(PGLOBAL g); // Physical file read // Specific routines - virtual int EstimatedLength(PGLOBAL g); + virtual int EstimatedLength(void); virtual bool SkipHeader(PGLOBAL g); virtual bool CheckErr(void); @@ -157,7 +157,7 @@ class TDBFMT : public TDBCSV { virtual int ReadBuffer(PGLOBAL g); // Physical file read // Specific routines - virtual int EstimatedLength(PGLOBAL g); + virtual int EstimatedLength(void); protected: virtual bool PrepareWriting(PGLOBAL g) diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 4432f164cf8..f22bdd15528 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -78,11 +78,13 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, PJVAL jvp; PJOB row; PJDEF tdp; - TDBJSN *tjnp; - PJTDB tjsp; + TDBJSN *tjnp = NULL; + PJTDB tjsp = NULL; PQRYRES qrp; PCOLRES crp; + jcol.Name = jcol.Fmt = NULL; + if (info) { length[0] = 128; length[7] = 256; @@ -362,7 +364,7 @@ JSONDEF::JSONDEF(void) /***********************************************************************/ /* DefineAM: define specific AM block values. */ /***********************************************************************/ -bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR, int poff) { Jmode = (JMODE)GetIntCatInfo("Jmode", MODE_OBJECT); Objname = GetStringCatInfo(g, "Object", NULL); @@ -506,7 +508,7 @@ PCOL TDBJSN::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ /* InsertSpecialColumn: Put a special column ahead of the column list.*/ /***********************************************************************/ -PCOL TDBJSN::InsertSpecialColumn(PGLOBAL g, PCOL colp) +PCOL TDBJSN::InsertSpecialColumn(PCOL colp) { if (!colp->IsSpecial()) return NULL; @@ -968,6 +970,20 @@ bool JSONCOL::ParseJpath(PGLOBAL g) else if (!Jpath) Jpath = Name; + if (To_Tdb->GetOrig()) { + // This is an updated column, get nodes from origin + for (PJCOL colp = (PJCOL)Tjp->GetColumns(); colp; + colp = (PJCOL)colp->GetNext()) + if (!stricmp(Name, colp->GetName())) { + Nod = colp->Nod; + Nodes = colp->Nodes; + goto fin; + } // endif Name + + sprintf(g->Message, "Cannot parse updated column %s", Name); + return true; + } // endif To_Orig + pbuf = PlugDup(g, Jpath); // The Jpath must be analyzed @@ -998,6 +1014,7 @@ bool JSONCOL::ParseJpath(PGLOBAL g) } // endfor i, p + fin: MulVal = AllocateValue(g, Value); Parsed = true; return false; @@ -1147,7 +1164,7 @@ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n) ars = MY_MIN(Tjp->Limit, arp->size()); - if (!(jvp = arp->GetValue(Nodes[n].Nx))) { + if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) { strcpy(g->Message, "Logical error expanding array"); longjmp(g->jumper[g->jump_level], 666); } // endif jvp @@ -1278,7 +1295,7 @@ PJSON JSONCOL::GetRow(PGLOBAL g) if (Nodes[i].Rank) val = arp->GetValue(Nodes[i].Rank - 1); else - val = arp->GetValue(Nodes[i].Nx); + val = arp->GetValue(Nodes[i].Rx); } else val = NULL; @@ -1471,7 +1488,7 @@ int TDBJSON::MakeNewDoc(PGLOBAL g) /***********************************************************************/ int TDBJSON::MakeDocument(PGLOBAL g) { - char *p, *memory, *objpath, *key; + char *p, *memory, *objpath, *key = NULL; int len, i = 0; MODE mode = Mode; PJSON jsp; @@ -1631,7 +1648,7 @@ void TDBJSON::ResetSize(void) /***********************************************************************/ /* TDBJSON is not indexable. */ /***********************************************************************/ -int TDBJSON::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) +int TDBJSON::MakeIndex(PGLOBAL g, PIXDEF pxdf, bool) { if (pxdf) { strcpy(g->Message, "JSON not indexable when pretty = 2"); @@ -1662,7 +1679,7 @@ int TDBJSON::GetRecpos(void) /***********************************************************************/ /* Set the position in the table. */ /***********************************************************************/ -bool TDBJSON::SetRecpos(PGLOBAL g, int recpos) +bool TDBJSON::SetRecpos(PGLOBAL, int recpos) { #if 0 union { @@ -1724,9 +1741,9 @@ bool TDBJSON::OpenDB(PGLOBAL g) /***********************************************************************/ /* ReadDB: Data Base read routine for JSON access method. */ /***********************************************************************/ -int TDBJSON::ReadDB(PGLOBAL g) +int TDBJSON::ReadDB(PGLOBAL) { - int rc; + int rc; N++; diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 7e9896c3b75..dc682e067e3 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -25,7 +25,8 @@ typedef struct _jnode { PVAL CncVal; // To cont value used for OP_CNC PVAL Valp; // The internal array VALUE int Rank; // The rank in array - int Nx; // Same row number + int Rx; // Read row number + int Nx; // Next to read row number } JNODE, *PJNODE; /***********************************************************************/ @@ -81,7 +82,7 @@ class TDBJSN : public TDBDOS { // Methods virtual PTDB CopyOne(PTABS t); virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); + virtual PCOL InsertSpecialColumn(PCOL colp); virtual int RowNumber(PGLOBAL g, bool b = FALSE) {return (b) ? N : Fpos + 1;} diff --git a/storage/connect/table.cpp b/storage/connect/table.cpp index d163c443cd5..933e072c1bb 100644 --- a/storage/connect/table.cpp +++ b/storage/connect/table.cpp @@ -1,7 +1,7 @@ /************** Table C++ Functions Source Code File (.CPP) ************/ /* Name: TABLE.CPP Version 2.7 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ /* */ /* This file contains the TBX, TDB and OPJOIN classes functions. */ /***********************************************************************/ @@ -74,7 +74,7 @@ TDB::TDB(PTDB tdbp) : Tdb_No(++Tnum) /***********************************************************************/ /* RowNumber: returns the current row ordinal number. */ /***********************************************************************/ -int TDB::RowNumber(PGLOBAL g, bool b) +int TDB::RowNumber(PGLOBAL g, bool) { sprintf(g->Message, MSG(ROWID_NOT_IMPL), GetAmName(g, GetAmType())); return 0; @@ -122,7 +122,7 @@ void TDB::Print(PGLOBAL g, FILE *f, uint n) } // end of Print -void TDB::Print(PGLOBAL g, char *ps, uint z) +void TDB::Print(PGLOBAL, char *ps, uint) { sprintf(ps, "R%d.%s", Tdb_No, Name); } // end of Print @@ -263,7 +263,7 @@ PCOL TDBASE::ColDB(PGLOBAL g, PSZ name, int num) /***********************************************************************/ /* InsertSpecialColumn: Put a special column ahead of the column list.*/ /***********************************************************************/ -PCOL TDBASE::InsertSpecialColumn(PGLOBAL g, PCOL colp) +PCOL TDBASE::InsertSpecialColumn(PCOL colp) { if (!colp->IsSpecial()) return NULL; @@ -327,7 +327,7 @@ PCOL TDBASE::InsertSpcBlk(PGLOBAL g, PCOLDEF cdp) return NULL; } // endif's name - if (!(colp = InsertSpecialColumn(g, colp))) { + if (!(colp = InsertSpecialColumn(colp))) { sprintf(g->Message, MSG(BAD_SPECIAL_COL), name); return NULL; } // endif Insert @@ -338,7 +338,7 @@ PCOL TDBASE::InsertSpcBlk(PGLOBAL g, PCOLDEF cdp) /***********************************************************************/ /* ResetTableOpt: Wrong for this table type. */ /***********************************************************************/ -int TDBASE::ResetTableOpt(PGLOBAL g, bool dop, bool dox) +int TDBASE::ResetTableOpt(PGLOBAL g, bool, bool) { strcpy(g->Message, "This table is not indexable"); return RC_INFO; @@ -365,7 +365,7 @@ void TDBASE::ResetKindex(PGLOBAL g, PKXBASE kxp) /***********************************************************************/ /* SetRecpos: Replace the table at the specified position. */ /***********************************************************************/ -bool TDBASE::SetRecpos(PGLOBAL g, int recpos) +bool TDBASE::SetRecpos(PGLOBAL g, int) { strcpy(g->Message, MSG(SETRECPOS_NIY)); return true; @@ -386,7 +386,7 @@ void TDBASE::PrintAM(FILE *f, char *m) /* Two questions here: exact meaning of U_J_INT ? */ /* Why is the eventual reference to To_Key_Col not marked U_J_EXT ? */ /***********************************************************************/ -void TDBASE::MarkDB(PGLOBAL g, PTDB tdb2) +void TDBASE::MarkDB(PGLOBAL, PTDB tdb2) { if (trace) htrc("DOS MarkDB: tdbp=%p tdb2=%p\n", this, tdb2); @@ -453,7 +453,7 @@ bool TDBCAT::Initialize(PGLOBAL g) /***********************************************************************/ /* CAT: Get the number of properties. */ /***********************************************************************/ -int TDBCAT::GetMaxSize(PGLOBAL g) +int TDBCAT::GetMaxSize(PGLOBAL g __attribute__((unused))) { if (MaxSize < 0) { // if (Initialize(g)) @@ -528,7 +528,7 @@ bool TDBCAT::InitCol(PGLOBAL g) /***********************************************************************/ /* SetRecpos: Replace the table at the specified position. */ /***********************************************************************/ -bool TDBCAT::SetRecpos(PGLOBAL g, int recpos) +bool TDBCAT::SetRecpos(PGLOBAL, int recpos) { N = recpos - 1; return false; @@ -537,7 +537,7 @@ bool TDBCAT::SetRecpos(PGLOBAL g, int recpos) /***********************************************************************/ /* Data Base read routine for CAT access method. */ /***********************************************************************/ -int TDBCAT::ReadDB(PGLOBAL g) +int TDBCAT::ReadDB(PGLOBAL) { return (++N < Qrp->Nblin) ? RC_OK : RC_EF; } // end of ReadDB @@ -554,7 +554,7 @@ int TDBCAT::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for CAT access methods. */ /***********************************************************************/ -int TDBCAT::DeleteDB(PGLOBAL g, int irc) +int TDBCAT::DeleteDB(PGLOBAL g, int) { strcpy(g->Message, "Delete not enabled for CAT tables"); return RC_FX; @@ -563,7 +563,7 @@ int TDBCAT::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for WMI access method. */ /***********************************************************************/ -void TDBCAT::CloseDB(PGLOBAL g) +void TDBCAT::CloseDB(PGLOBAL) { // Nothing to do } // end of CloseDB @@ -584,7 +584,7 @@ CATCOL::CATCOL(PCOLDEF cdp, PTDB tdbp, int n) /***********************************************************************/ /* Read the next Data Source elements. */ /***********************************************************************/ -void CATCOL::ReadColumn(PGLOBAL g) +void CATCOL::ReadColumn(PGLOBAL) { // Get the value of the Name or Description property if (Crp->Kdata) diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 36f3fc73210..12e8de2c808 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -171,8 +171,10 @@ bool TDBMUL::InitFileNames(PGLOBAL g) } // endif hSearch while (n < PFNZ) { - strcat(strcat(strcpy(filename, drive), direc), FileData.cFileName); - pfn[n++] = PlugDup(g, filename); + if (!(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + strcat(strcat(strcpy(filename, drive), direc), FileData.cFileName); + pfn[n++] = PlugDup(g, filename); + } // endif dwFileAttributes if (!FindNextFile(hSearch, &FileData)) { rc = GetLastError(); @@ -559,7 +561,7 @@ int TDBMUL::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for MUL access method. */ /***********************************************************************/ -int TDBMUL::DeleteDB(PGLOBAL g, int irc) +int TDBMUL::DeleteDB(PGLOBAL g, int) { // When implementing DELETE_MODE InitFileNames must be updated to // eliminate CRLF under Windows if the file is read in binary. @@ -584,7 +586,7 @@ void TDBMUL::CloseDB(PGLOBAL g) /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /***********************************************************************/ -bool DIRDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool DIRDEF::DefineAM(PGLOBAL g, LPCSTR, int) { Desc = Fn = GetStringCatInfo(g, "Filename", NULL); Incl = (GetIntCatInfo("Subdir", 0) != 0); @@ -595,7 +597,7 @@ bool DIRDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new Table Description Block. */ /***********************************************************************/ -PTDB DIRDEF::GetTable(PGLOBAL g, MODE m) +PTDB DIRDEF::GetTable(PGLOBAL g, MODE) { #if 0 if (Huge) @@ -863,7 +865,7 @@ int TDBDIR::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for DIR access method. */ /***********************************************************************/ -int TDBDIR::DeleteDB(PGLOBAL g, int irc) +int TDBDIR::DeleteDB(PGLOBAL g, int) { strcpy(g->Message, MSG(TABDIR_READONLY)); return RC_FX; // NIY @@ -872,7 +874,7 @@ int TDBDIR::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for MUL access method. */ /***********************************************************************/ -void TDBDIR::CloseDB(PGLOBAL g) +void TDBDIR::CloseDB(PGLOBAL) { #if defined(WIN32) // Close the search handle. @@ -893,7 +895,7 @@ void TDBDIR::CloseDB(PGLOBAL g) /***********************************************************************/ /* DIRCOL public constructor. */ /***********************************************************************/ -DIRCOL::DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +DIRCOL::DIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 66f275796b5..cb7011822d8 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -5,7 +5,7 @@ /* */ /* AUTHOR: */ /* ------- */ -/* Olivier BERTRAND 2007-2014 */ +/* Olivier BERTRAND 2007-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -307,7 +307,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) /***********************************************************************/ /* DefineAM: define specific AM block values from XCV file. */ /***********************************************************************/ -bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int) { char *url; @@ -380,7 +380,7 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB MYSQLDEF::GetTable(PGLOBAL g, MODE m) +PTDB MYSQLDEF::GetTable(PGLOBAL g, MODE) { if (Xsrc) return new(g) TDBMYEXC(this); @@ -438,7 +438,7 @@ TDBMYSQL::TDBMYSQL(PMYDEF tdp) : TDBASE(tdp) Nparm = 0; } // end of TDBMYSQL constructor -TDBMYSQL::TDBMYSQL(PGLOBAL g, PTDBMY tdbp) : TDBASE(tdbp) +TDBMYSQL::TDBMYSQL(PTDBMY tdbp) : TDBASE(tdbp) { Host = tdbp->Host; Database = tdbp->Database; @@ -468,7 +468,7 @@ PTDB TDBMYSQL::CopyOne(PTABS t) PCOL cp1, cp2; PGLOBAL g = t->G; - tp = new(g) TDBMYSQL(g, this); + tp = new(g) TDBMYSQL(this); for (cp1 = Columns; cp1; cp1 = cp1->GetNext()) { cp2 = new(g) MYSQLCOL((PMYCOL)cp1, tp); @@ -816,7 +816,7 @@ int TDBMYSQL::GetMaxSize(PGLOBAL g) /***********************************************************************/ /* This a fake routine as ROWID does not exist in MySQL. */ /***********************************************************************/ -int TDBMYSQL::RowNumber(PGLOBAL g, bool b) +int TDBMYSQL::RowNumber(PGLOBAL, bool) { return N + 1; } // end of RowNumber @@ -832,7 +832,7 @@ int TDBMYSQL::GetProgMax(PGLOBAL g) /***********************************************************************/ /* MySQL Bind Parameter function. */ /***********************************************************************/ -int TDBMYSQL::BindColumns(PGLOBAL g) +int TDBMYSQL::BindColumns(PGLOBAL g __attribute__((unused))) { #if defined(MYSQL_PREPARED_STATEMENTS) if (Prep) { @@ -1060,9 +1060,16 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len) int oldlen = Query->GetLength(); if (!key || op == OP_NEXT || - Mode == MODE_UPDATE || Mode == MODE_DELETE) + Mode == MODE_UPDATE || Mode == MODE_DELETE) { + if (!key && Mode == MODE_READX) { + // This is a false indexed read + m_Rc = Myc.ExecSQL(g, Query->GetStr()); + Mode = MODE_READ; + return (m_Rc == RC_FX) ? true : false; + } // endif key + return false; - else if (op == OP_FIRST) { + } else if (op == OP_FIRST) { if (To_CondFil) { oom = Query->Append(" WHERE "); @@ -1418,7 +1425,7 @@ void MYSQLCOL::ReadColumn(PGLOBAL g) /***********************************************************************/ /* WriteColumn: make sure the bind buffer is updated. */ /***********************************************************************/ -void MYSQLCOL::WriteColumn(PGLOBAL g) +void MYSQLCOL::WriteColumn(PGLOBAL) { /*********************************************************************/ /* Do convert the column value if necessary. */ @@ -1456,7 +1463,7 @@ TDBMYEXC::TDBMYEXC(PMYDEF tdp) : TDBMYSQL(tdp) Nerr = 0; } // end of TDBMYEXC constructor -TDBMYEXC::TDBMYEXC(PGLOBAL g, PTDBMYX tdbp) : TDBMYSQL(g, tdbp) +TDBMYEXC::TDBMYEXC(PTDBMYX tdbp) : TDBMYSQL(tdbp) { Cmdlist = tdbp->Cmdlist; Cmdcol = tdbp->Cmdcol; @@ -1474,7 +1481,7 @@ PTDB TDBMYEXC::CopyOne(PTABS t) PCOL cp1, cp2; PGLOBAL g = t->G; - tp = new(g) TDBMYEXC(g, this); + tp = new(g) TDBMYEXC(this); for (cp1 = Columns; cp1; cp1 = cp1->GetNext()) { cp2 = new(g) MYXCOL((PMYXCOL)cp1, tp); @@ -1527,7 +1534,7 @@ PCMD TDBMYEXC::MakeCMD(PGLOBAL g) /***********************************************************************/ /* EXC GetMaxSize: returns the maximum number of rows in the table. */ /***********************************************************************/ -int TDBMYEXC::GetMaxSize(PGLOBAL g) +int TDBMYEXC::GetMaxSize(PGLOBAL) { if (MaxSize < 0) { MaxSize = 10; // a guess @@ -1704,7 +1711,7 @@ void MYXCOL::ReadColumn(PGLOBAL g) /***********************************************************************/ /* WriteColumn: should never be called. */ /***********************************************************************/ -void MYXCOL::WriteColumn(PGLOBAL g) +void MYXCOL::WriteColumn(PGLOBAL) { assert(false); } // end of WriteColumn diff --git a/storage/connect/tabmysql.h b/storage/connect/tabmysql.h index 99930d43a57..17d7b190340 100644 --- a/storage/connect/tabmysql.h +++ b/storage/connect/tabmysql.h @@ -73,11 +73,11 @@ class TDBMYSQL : public TDBASE { public: // Constructor TDBMYSQL(PMYDEF tdp); - TDBMYSQL(PGLOBAL g, PTDBMY tdbp); + TDBMYSQL(PTDBMY tdbp); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_MYSQL;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYSQL(g, this);} + virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYSQL(this);} // Methods virtual PTDB CopyOne(PTABS t); @@ -180,11 +180,11 @@ class TDBMYEXC : public TDBMYSQL { public: // Constructors TDBMYEXC(PMYDEF tdp); - TDBMYEXC(PGLOBAL g, PTDBMYX tdbp); + TDBMYEXC(PTDBMYX tdbp); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_MYX;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYEXC(g, this);} + virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYEXC(this);} // Methods virtual PTDB CopyOne(PTABS t); diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index 7f7b1c5d50c..da3cafc3c8f 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -266,7 +266,7 @@ bool OCCURDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB OCCURDEF::GetTable(PGLOBAL g, MODE m) +PTDB OCCURDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc != FNC_COL) return new(g) TDBOCCUR(this); @@ -432,7 +432,7 @@ int TDBOCCUR::GetMaxSize(PGLOBAL g) /* In this sample, ROWID will be the (virtual) row number, */ /* while ROWNUM will be the occurence rank in the multiple column. */ /***********************************************************************/ -int TDBOCCUR::RowNumber(PGLOBAL g, bool b) +int TDBOCCUR::RowNumber(PGLOBAL, bool b) { return (b) ? M : N; } // end of RowNumber @@ -567,7 +567,7 @@ void OCCURCOL::ReadColumn(PGLOBAL g) /* ReadColumn: what this routine does is to access the Mth columns of */ /* list, extract its name and set to it the rank column value. */ /***********************************************************************/ -void RANKCOL::ReadColumn(PGLOBAL g) +void RANKCOL::ReadColumn(PGLOBAL) { PTDBOCCUR tdbp = (PTDBOCCUR)To_Tdb; PCOL *col = tdbp->Col; diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index 401ffa3780e..b36dcbf94af 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -376,7 +376,7 @@ bool PIVOTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB PIVOTDEF::GetTable(PGLOBAL g, MODE m) +PTDB PIVOTDEF::GetTable(PGLOBAL g, MODE) { return new(g) TDBPIVOT(this); } // end of GetTable @@ -634,7 +634,7 @@ bool TDBPIVOT::MakeViewColumns(PGLOBAL g) /***********************************************************************/ /* PIVOT GetMaxSize: returns the maximum number of rows in the table. */ /***********************************************************************/ -int TDBPIVOT::GetMaxSize(PGLOBAL g) +int TDBPIVOT::GetMaxSize(PGLOBAL g __attribute__((unused))) { #if 0 if (MaxSize < 0) @@ -649,7 +649,7 @@ int TDBPIVOT::GetMaxSize(PGLOBAL g) /* In this sample, ROWID will be the (virtual) row number, */ /* while ROWNUM will be the occurence rank in the multiple column. */ /***********************************************************************/ -int TDBPIVOT::RowNumber(PGLOBAL g, bool b) +int TDBPIVOT::RowNumber(PGLOBAL, bool b) { return (b) ? M : N; } // end of RowNumber @@ -806,7 +806,7 @@ int TDBPIVOT::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for PIVOT access methods. */ /***********************************************************************/ -int TDBPIVOT::DeleteDB(PGLOBAL g, int irc) +int TDBPIVOT::DeleteDB(PGLOBAL g, int) { sprintf(g->Message, MSG(NO_TABLE_DEL), "PIVOT"); return RC_FX; diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index 3ed182c5e33..623aeca36fe 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -3,7 +3,7 @@ /* ------------- */ /* Version 2.3 */ /* */ -/* Author Olivier BERTRAND 2004-2014 */ +/* Author Olivier BERTRAND 2004-2015 */ /* */ /* This program are the INI/CFG tables classes. */ /***********************************************************************/ @@ -70,7 +70,7 @@ INIDEF::INIDEF(void) /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /***********************************************************************/ -bool INIDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool INIDEF::DefineAM(PGLOBAL g, LPCSTR, int) { char buf[8]; @@ -96,7 +96,7 @@ bool INIDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB INIDEF::GetTable(PGLOBAL g, MODE m) +PTDB INIDEF::GetTable(PGLOBAL g, MODE) { PTDBASE tdbp; @@ -277,49 +277,27 @@ bool TDBINI::OpenDB(PGLOBAL g) /***********************************************************************/ /* Data Base read routine for INI access method. */ /***********************************************************************/ -int TDBINI::ReadDB(PGLOBAL g) +int TDBINI::ReadDB(PGLOBAL) { /*********************************************************************/ /* Now start the pseudo reading process. */ /*********************************************************************/ -#if 0 // INI tables are not indexable - if (To_Kindex) { - /*******************************************************************/ - /* Reading is by an index table. */ - /*******************************************************************/ - int recpos = To_Kindex->Fetch(g); + if (!Section) + Section = Seclist; + else + Section += (strlen(Section) + 1); - switch (recpos) { - case -1: // End of file reached - return RC_EF; - case -2: // No match for join - return RC_NF; - case -3: // Same record as last non null one - return RC_OK; - default: - Section = (char*)recpos; // No good on 64 bit machines - } // endswitch recpos - - } else { -#endif // 0 - if (!Section) - Section = Seclist; - else - Section += (strlen(Section) + 1); - - if (trace > 1) - htrc("INI ReadDB: section=%s N=%d\n", Section, N); - - N++; -//} // endif To_Kindex + if (trace > 1) + htrc("INI ReadDB: section=%s N=%d\n", Section, N); + N++; return (*Section) ? RC_OK : RC_EF; } // end of ReadDB /***********************************************************************/ /* WriteDB: Data Base write routine for INI access methods. */ /***********************************************************************/ -int TDBINI::WriteDB(PGLOBAL g) +int TDBINI::WriteDB(PGLOBAL) { // This is to check that section name was given when inserting if (Mode == MODE_INSERT) @@ -365,7 +343,7 @@ int TDBINI::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* Data Base close routine for INI access methods. */ /***********************************************************************/ -void TDBINI::CloseDB(PGLOBAL g) +void TDBINI::CloseDB(PGLOBAL) { #if !defined(WIN32) PROFILE_Close(Ifile); @@ -377,7 +355,7 @@ void TDBINI::CloseDB(PGLOBAL g) /***********************************************************************/ /* INICOL public constructor. */ /***********************************************************************/ -INICOL::INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +INICOL::INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -471,7 +449,7 @@ bool INICOL::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) /* from the corresponding section, extract from it the key value */ /* corresponding to this column name and convert it to buffer type. */ /***********************************************************************/ -void INICOL::ReadColumn(PGLOBAL g) +void INICOL::ReadColumn(PGLOBAL) { PTDBINI tdbp = (PTDBINI)To_Tdb; @@ -747,7 +725,7 @@ int TDBXIN::ReadDB(PGLOBAL g) /***********************************************************************/ /* WriteDB: Data Base write routine for XIN access methods. */ /***********************************************************************/ -int TDBXIN::WriteDB(PGLOBAL g) +int TDBXIN::WriteDB(PGLOBAL) { // To check that section and key names were given when inserting if (Mode == MODE_INSERT) { @@ -809,7 +787,7 @@ XINCOL::XINCOL(XINCOL *col1, PTDB tdbp) : INICOL(col1, tdbp) /* from the corresponding section, extract from it the key value */ /* corresponding to this column name and convert it to buffer type. */ /***********************************************************************/ -void XINCOL::ReadColumn(PGLOBAL g) +void XINCOL::ReadColumn(PGLOBAL) { PTDBXIN tdbp = (PTDBXIN)To_Tdb; diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index 1ef70549751..f2affe75d2b 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to PlugDB Software Development 2008-2014 */ +/* (C) Copyright to PlugDB Software Development 2008-2015 */ /* Author: Olivier BERTRAND */ /* */ /* WHAT THIS PROGRAM DOES: */ @@ -101,7 +101,7 @@ TBLDEF::TBLDEF(void) /**************************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /**************************************************************************/ -bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR, int) { char *tablist, *dbname, *def = NULL; @@ -161,7 +161,7 @@ bool TBLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new Table Description Block. */ /***********************************************************************/ -PTDB TBLDEF::GetTable(PGLOBAL g, MODE m) +PTDB TBLDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc == FNC_COL) return new(g) TDBTBC(this); @@ -202,7 +202,7 @@ PCOL TDBTBL::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ /* InsertSpecialColumn: Put a special column ahead of the column list.*/ /***********************************************************************/ -PCOL TDBTBL::InsertSpecialColumn(PGLOBAL g, PCOL scp) +PCOL TDBTBL::InsertSpecialColumn(PCOL scp) { PCOL colp; @@ -548,7 +548,7 @@ int TDBTBL::ReadDB(PGLOBAL g) /***********************************************************************/ /* ReadColumn: */ /***********************************************************************/ -void TBTBLK::ReadColumn(PGLOBAL g) +void TBTBLK::ReadColumn(PGLOBAL) { if (trace) htrc("TBT ReadColumn: name=%s\n", Name); diff --git a/storage/connect/tabtbl.h b/storage/connect/tabtbl.h index 8bf440985ea..9d3f297f9e7 100644 --- a/storage/connect/tabtbl.h +++ b/storage/connect/tabtbl.h @@ -81,7 +81,7 @@ class DllExport TDBTBL : public TDBPRX { virtual int Cardinality(PGLOBAL g); virtual int GetMaxSize(PGLOBAL g); virtual int RowNumber(PGLOBAL g, bool b = FALSE); - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL scp); + virtual PCOL InsertSpecialColumn(PCOL scp); virtual bool OpenDB(PGLOBAL g); virtual int ReadDB(PGLOBAL g); diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index 1c238bcf6f2..5ed958b2f7a 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -52,7 +52,6 @@ #include "tabutil.h" #include "ha_connect.h" -//extern "C" int zconv; int GetConvSize(void); /************************************************************************/ @@ -72,11 +71,8 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db, { char key[256]; uint k; -//TABLE_LIST table_list; TABLE_SHARE *s; -//table_list.init_one_table(db, strlen(db), name, strlen(name), -// NULL, TL_IGNORE); k = sprintf(key, "%s", db) + 1; k += sprintf(key + k, "%s", name); key[++k] = 0; @@ -86,9 +82,6 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db, return NULL; } // endif s -// 1 2 4 8 -//flags = GTS_TABLE | GTS_VIEW | GTS_NOLOCK | GTS_FORCE_DISCOVERY; - if (!open_table_def(thd, s, GTS_TABLE | GTS_VIEW)) { if (!s->is_view) { if (stricmp(plugin_name(s->db_plugin)->str, "connect")) @@ -299,7 +292,7 @@ PRXDEF::PRXDEF(void) /***********************************************************************/ /* DefineAM: define specific AM block values from XCOL file. */ /***********************************************************************/ -bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR, int) { char *pn, *db, *tab, *def = NULL; @@ -329,7 +322,7 @@ bool PRXDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB PRXDEF::GetTable(PGLOBAL g, MODE mode) +PTDB PRXDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc == FNC_COL) return new(g) TDBTBC(this); @@ -348,7 +341,7 @@ TDBPRX::TDBPRX(PPRXDEF tdp) : TDBASE(tdp) Tdbp = NULL; // The object table } // end of TDBPRX constructor -TDBPRX::TDBPRX(PGLOBAL g, PTDBPRX tdbp) : TDBASE(tdbp) +TDBPRX::TDBPRX(PTDBPRX tdbp) : TDBASE(tdbp) { Tdbp = tdbp->Tdbp; } // end of TDBPRX copy constructor @@ -360,7 +353,7 @@ PTDB TDBPRX::CopyOne(PTABS t) PPRXCOL cp1, cp2; PGLOBAL g = t->G; - tp = new(g) TDBPRX(g, this); + tp = new(g) TDBPRX(this); for (cp1 = (PPRXCOL)Columns; cp1; cp1 = (PPRXCOL)cp1->GetNext()) { cp2 = new(g) PRXCOL(cp1, tp); // Make a copy diff --git a/storage/connect/tabutil.h b/storage/connect/tabutil.h index c5935d72184..b320d169b36 100644 --- a/storage/connect/tabutil.h +++ b/storage/connect/tabutil.h @@ -59,12 +59,12 @@ class DllExport TDBPRX : public TDBASE { public: // Constructors TDBPRX(PPRXDEF tdp); - TDBPRX(PGLOBAL g, PTDBPRX tdbp); + TDBPRX(PTDBPRX tdbp); // Implementation virtual AMT GetAmType(void) {return TYPE_AM_PRX;} virtual PTDB Duplicate(PGLOBAL g) - {return (PTDB)new(g) TDBPRX(g, this);} + {return (PTDB)new(g) TDBPRX(this);} // Methods virtual PTDB CopyOne(PTABS t); diff --git a/storage/connect/tabvct.cpp b/storage/connect/tabvct.cpp index 3ed40540395..6394ea5e2d6 100644 --- a/storage/connect/tabvct.cpp +++ b/storage/connect/tabvct.cpp @@ -5,7 +5,7 @@ /* */ /* COPYRIGHT: */ /* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -94,7 +94,7 @@ PVBLK AllocValBlock(PGLOBAL, void *, int, int, int, int, /***********************************************************************/ /* DefineAM: define specific AM block values from XDB file. */ /***********************************************************************/ -bool VCTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +bool VCTDEF::DefineAM(PGLOBAL g, LPCSTR, int poff) { DOSDEF::DefineAM(g, "BIN", poff); @@ -290,7 +290,7 @@ PCOL TDBVCT::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ /* VEC tables are not ready yet to use temporary files. */ /***********************************************************************/ -bool TDBVCT::IsUsingTemp(PGLOBAL g) +bool TDBVCT::IsUsingTemp(PGLOBAL) { // For developpers return (UseTemp() == TMP_TEST); @@ -570,7 +570,7 @@ void VCTCOL::ReadColumn(PGLOBAL g) /* On each change of block the buffer is written back to file and */ /* in mode Insert the buffer is filled with the block to update. */ /***********************************************************************/ -void VCTCOL::WriteColumn(PGLOBAL g) +void VCTCOL::WriteColumn(PGLOBAL) { PTXF txfp = ((PTDBVCT)To_Tdb)->Txfp;; diff --git a/storage/connect/tabvir.cpp b/storage/connect/tabvir.cpp index b4c76f5ad56..356fc981357 100644 --- a/storage/connect/tabvir.cpp +++ b/storage/connect/tabvir.cpp @@ -29,7 +29,7 @@ /***********************************************************************/ /* Return the unique column definition to MariaDB. */ /***********************************************************************/ -PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info) +PQRYRES VirColumns(PGLOBAL g, bool info) { int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_STRING, TYPE_STRING}; @@ -95,7 +95,7 @@ PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info) /***********************************************************************/ /* GetTable: makes a new Table Description Block. */ /***********************************************************************/ -PTDB VIRDEF::GetTable(PGLOBAL g, MODE m) +PTDB VIRDEF::GetTable(PGLOBAL g, MODE) { // Column blocks will be allocated only when needed. if (Catfunc == FNC_COL) @@ -241,7 +241,7 @@ bool TDBVIR::OpenDB(PGLOBAL g) /***********************************************************************/ /* Data Base read routine for the VIR access method. */ /***********************************************************************/ -int TDBVIR::ReadDB(PGLOBAL g) +int TDBVIR::ReadDB(PGLOBAL) { return (++N >= Size) ? RC_EF : RC_OK; } // end of ReadDB @@ -258,7 +258,7 @@ int TDBVIR::WriteDB(PGLOBAL g) /***********************************************************************/ /* Data Base delete line routine for the VIR access methods. */ /***********************************************************************/ -int TDBVIR::DeleteDB(PGLOBAL g, int irc) +int TDBVIR::DeleteDB(PGLOBAL g, int) { sprintf(g->Message, MSG(VIR_NO_DELETE), To_Def->GetType()); return RC_FX; @@ -269,7 +269,7 @@ int TDBVIR::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ /* VIRCOL public constructor. */ /***********************************************************************/ -VIRCOL::VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am) +VIRCOL::VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ) : COLBLK(cdp, tdbp, i) { if (cprec) { @@ -299,7 +299,7 @@ void VIRCOL::ReadColumn(PGLOBAL g) /***********************************************************************/ PQRYRES TDBVICL::GetResult(PGLOBAL g) { - return VirColumns(g, NULL, NULL, false); + return VirColumns(g, false); } // end of GetResult /* ------------------------- End of Virtual -------------------------- */ diff --git a/storage/connect/tabvir.h b/storage/connect/tabvir.h index 8d0caa257e7..a53aceaeceb 100644 --- a/storage/connect/tabvir.h +++ b/storage/connect/tabvir.h @@ -11,7 +11,7 @@ typedef class TDBVIR *PTDBVIR; /***********************************************************************/ /* Return the unique column definition to MariaDB. */ /***********************************************************************/ -PQRYRES VirColumns(PGLOBAL g, char *tab, char *db, bool info); +PQRYRES VirColumns(PGLOBAL g, bool info); /* --------------------------- VIR classes --------------------------- */ diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index dffbaf6e187..7d6d94d34c0 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -83,7 +83,7 @@ bool XCLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) /***********************************************************************/ /* GetTable: makes a new TDB of the proper type. */ /***********************************************************************/ -PTDB XCLDEF::GetTable(PGLOBAL g, MODE mode) +PTDB XCLDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc == FNC_COL) return new(g) TDBTBC(this); @@ -117,7 +117,7 @@ PCOL TDBXCL::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) PCOL colp; if (!stricmp(cdp->GetName(), Xcolumn)) { - Xcolp = new(g) XCLCOL(g, cdp, this, cprec, n); + Xcolp = new(g) XCLCOL(cdp, this, cprec, n); colp = Xcolp; } else colp = new(g) PRXCOL(cdp, this, cprec, n); @@ -144,7 +144,7 @@ int TDBXCL::GetMaxSize(PGLOBAL g) /* For this table type, ROWID is the (virtual) row number, */ /* while ROWNUM is be the occurence rank in the multiple column. */ /***********************************************************************/ -int TDBXCL::RowNumber(PGLOBAL g, bool b) +int TDBXCL::RowNumber(PGLOBAL, bool b) { return (b) ? M : N; } // end of RowNumber @@ -232,7 +232,7 @@ int TDBXCL::ReadDB(PGLOBAL g) /***********************************************************************/ /* XCLCOL public constructor. */ /***********************************************************************/ -XCLCOL::XCLCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) +XCLCOL::XCLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i) : PRXCOL(cdp, tdbp, cprec, i, "XCL") { // Set additional XXL access method information for column. diff --git a/storage/connect/tabxcl.h b/storage/connect/tabxcl.h index ed15a67b629..291f0b4263a 100644 --- a/storage/connect/tabxcl.h +++ b/storage/connect/tabxcl.h @@ -85,7 +85,7 @@ class XCLCOL : public PRXCOL { friend class TDBXCL; public: // Constructors - XCLCOL(PGLOBAL g, PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); + XCLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); // Methods using PRXCOL::Init; diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 8ea44fed2be..46f762efc35 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -118,7 +118,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; char *op, colname[65], fmt[129], buf[512]; - int i, j, lvl, rc, n = 0; + int i, j, lvl, n = 0; int ncol = sizeof(buftyp) / sizeof(int); bool ok = true; PXCL xcol, xcp, fxcp = NULL, pxcp = NULL; @@ -164,7 +164,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) txmp = new(g) TDBXML(tdp); if (txmp->Initialize(g)) - return NULL; + goto err; xcol = new(g) XMCOL; colname[64] = 0; @@ -224,8 +224,16 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) if (vp->atp) { strncpy(colname, vp->atp->GetName(g), sizeof(colname)); strncat(xcol->Name, colname, 64); - rc = vp->atp->GetText(g, buf, sizeof(buf)); - strncat(fmt, "@", sizeof(fmt)); + + switch (vp->atp->GetText(g, buf, sizeof(buf))) { + case RC_INFO: + PushWarning(g, txmp); + case RC_OK: + strncat(fmt, "@", sizeof(fmt)); + break; + default: + goto err; + } // enswitch rc if (j) strncat(fmt, colname, sizeof(fmt)); @@ -273,7 +281,15 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) } else ok = true; - rc = node->GetContent(g, buf, sizeof(buf)); + switch (node->GetContent(g, buf, sizeof(buf))) { + case RC_INFO: + PushWarning(g, txmp); + case RC_OK: + break; + default: + goto err; + } // enswitch rc + } // endif atp; xcol->Len = strlen(buf); @@ -313,10 +329,6 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) pxcp = xcp; -// for (j = lvl - 1; j >= 0; j--) -// if (jrp[j] && (jrp[j] = jrp[j]->GetNext())) -// goto more; - if (vp->atp) vp->atp = vp->atp->GetNext(g); @@ -421,8 +433,6 @@ XMLDEF::XMLDEF(void) bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { char *defrow, *defcol, buf[10]; -//void *memp = Cat->GetDescp(); -//PSZ dbfile = Cat->GetDescFile(); Fn = GetStringCatInfo(g, "Filename", NULL); Encoding = GetStringCatInfo(g, "Encoding", "UTF-8"); @@ -479,12 +489,6 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Header = GetIntCatInfo("Header", 0); GetCharCatInfo("Xmlsup", "*", buf, sizeof(buf)); -//if (*buf == '*') // Try the old (deprecated) option -// GetCharCatInfo("Method", "*", buf, sizeof(buf)); - -//if (*buf == '*') // Is there a default for the database? -// GetCharCatInfo("Defxml", XMLSUP, buf, sizeof(buf)); - // Note that if no support is specified, the default is MS-DOM // on Windows and libxml2 otherwise if (*buf == '*') @@ -499,7 +503,6 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) // Get eventual table node attribute Attrib = GetStringCatInfo(g, "Attribute", ""); Hdattr = GetStringCatInfo(g, "HeadAttr", ""); - return false; } // end of DefineAM @@ -519,30 +522,6 @@ PTDB XMLDEF::GetTable(PGLOBAL g, MODE m) return tdbp; } // end of GetTable -#if 0 -/***********************************************************************/ -/* DeleteTableFile: Delete XML table files using platform API. */ -/***********************************************************************/ -bool XMLDEF::DeleteTableFile(PGLOBAL g) - { - char filename[_MAX_PATH]; - bool rc; - - // Delete the XML table file if not protected - if (!IsReadOnly()) { - PlugSetPath(filename, Fn, GetPath()); -#if defined(WIN32) - rc = !DeleteFile(filename); -#else // UNIX - rc = remove(filename); -#endif // UNIX - } else - rc =true; - - return rc; // Return true if error - } // end of DeleteTableFile -#endif // 0 - /* ------------------------- TDBXML Class ---------------------------- */ /***********************************************************************/ @@ -667,7 +646,7 @@ PCOL TDBXML::MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) /***********************************************************************/ /* InsertSpecialColumn: Put a special column ahead of the column list.*/ /***********************************************************************/ -PCOL TDBXML::InsertSpecialColumn(PGLOBAL g, PCOL colp) +PCOL TDBXML::InsertSpecialColumn(PCOL colp) { if (!colp->IsSpecial()) return NULL; @@ -854,7 +833,6 @@ bool TDBXML::Initialize(PGLOBAL g) To_Xb = Docp->LinkXblock(g, Mode, rc, filename); // Add a CONNECT comment node -// sprintf(buf, " Created by CONNECT %s ", version); strcpy(buf, " Created by the MariaDB CONNECT Storage Engine"); Docp->AddComment(g, buf); @@ -1279,7 +1257,6 @@ void TDBXML::CloseDB(PGLOBAL g) if (Docp) { if (Changed) { char filename[_MAX_PATH]; -// PDBUSER dup = (PDBUSER)g->Activityp->Aptr; // We used the file name relative to recorded datapath PlugSetPath(filename, Xfile, GetPath()); @@ -1321,7 +1298,6 @@ void TDBXML::CloseDB(PGLOBAL g) NewRow = false; Hasnod = false; Write = false; -// Bufdone = false; Nodedone = false; Void = false; Nrow = -1; @@ -1413,8 +1389,6 @@ bool XMLCOL::AllocBuf(PGLOBAL g, bool mode) if (Valbuf) return false; // Already done -//Valbuf = (char*)PlugSubAlloc(g, NULL, Long + 1); -//Valbuf[Long] = '\0'; return ParseXpath(g, mode); } // end of AllocBuf @@ -1505,8 +1479,7 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode) } else if (Type == 2) { // HTML like table, columns are retrieved by position new(this) XPOSCOL(Value); // Change the class of this column - Tdbp->Hasnod = true; - return false; + Inod = -1; } else if (Type == 0 && !mode) { strcat(strcat(pbuf, "@"), Name); } else { // Type == 1 @@ -1656,7 +1629,6 @@ void XMLCOL::WriteColumn(PGLOBAL g) int done = 0; int i, n, k = 0; PXNODE TopNode = NULL; -//PXATTR AttNode = NULL; if (trace > 1) htrc("XML WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", @@ -1891,7 +1863,6 @@ void XMULCOL::WriteColumn(PGLOBAL g) int done = 0; int i, n, len, k = 0; PXNODE TopNode = NULL; -//PXATTR AttNode = NULL; if (trace) htrc("XML WriteColumn: col %s R%d coluse=%.4X status=%.4X\n", diff --git a/storage/connect/tabxml.h b/storage/connect/tabxml.h index f6cfd3fb510..4eae5c082c1 100644 --- a/storage/connect/tabxml.h +++ b/storage/connect/tabxml.h @@ -84,7 +84,7 @@ class DllExport TDBXML : public TDBASE { // Database routines virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); + virtual PCOL InsertSpecialColumn(PCOL colp); //virtual int GetMaxSame(PGLOBAL g) {return (Xpand) ? Limit : 1;} virtual int Cardinality(PGLOBAL g); virtual int GetMaxSize(PGLOBAL g); diff --git a/storage/connect/user_connect.cc b/storage/connect/user_connect.cc index 4affe447b00..34d192361a5 100644 --- a/storage/connect/user_connect.cc +++ b/storage/connect/user_connect.cc @@ -1,4 +1,4 @@ -/* Copyright (C) Olivier Bertrand 2004 - 2014 +/* Copyright (C) Olivier Bertrand 2004 - 2015 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +28,7 @@ */ /****************************************************************************/ -/* Author: Olivier Bertrand -- bertrandop@gmail.com -- 2004-2014 */ +/* Author: Olivier Bertrand -- bertrandop@gmail.com -- 2004-2015 */ /****************************************************************************/ #ifdef USE_PRAGMA_IMPLEMENTATION #pragma implementation // gcc: Class implementation @@ -63,7 +63,7 @@ void SetWorkSize(uint); /****************************************************************************/ /* Constructor. */ /****************************************************************************/ -user_connect::user_connect(THD *thd, const char *dbn) +user_connect::user_connect(THD *thd) { thdp= thd; next= NULL; diff --git a/storage/connect/user_connect.h b/storage/connect/user_connect.h index 44e4e94fa8a..7f37973f378 100644 --- a/storage/connect/user_connect.h +++ b/storage/connect/user_connect.h @@ -45,7 +45,7 @@ class user_connect friend int connect_done_func(void *); public: // Constructor - user_connect(THD *thd, const char *dbn); + user_connect(THD *thd); // Destructor virtual ~user_connect(); diff --git a/storage/connect/valblk.cpp b/storage/connect/valblk.cpp index e731ad156d9..94e09e1a85c 100644 --- a/storage/connect/valblk.cpp +++ b/storage/connect/valblk.cpp @@ -132,7 +132,7 @@ VALBLK::VALBLK(void *mp, int type, int nval, bool un) /***********************************************************************/ /* Raise error for numeric types. */ /***********************************************************************/ -PSZ VALBLK::GetCharValue(int n) +PSZ VALBLK::GetCharValue(int) { PGLOBAL& g = Global; @@ -145,7 +145,7 @@ PSZ VALBLK::GetCharValue(int n) /***********************************************************************/ /* Set format so formatted dates can be converted on input. */ /***********************************************************************/ -bool VALBLK::SetFormat(PGLOBAL g, PSZ fmt, int len, int year) +bool VALBLK::SetFormat(PGLOBAL g, PSZ, int, int) { sprintf(g->Message, MSG(NO_DATE_FMT), Type); return true; @@ -752,7 +752,7 @@ double CHRBLK::GetFloatValue(int n) /***********************************************************************/ /* STRING GetCharString: get string representation of a char value. */ /***********************************************************************/ -char *CHRBLK::GetCharString(char *p, int n) +char *CHRBLK::GetCharString(char *, int n) { return (char *)GetValPtrEx(n); } // end of GetCharString diff --git a/storage/connect/valblk.h b/storage/connect/valblk.h index 5a98257f98f..f6eb7258a77 100644 --- a/storage/connect/valblk.h +++ b/storage/connect/valblk.h @@ -95,17 +95,17 @@ class VALBLK : public BLOCK { virtual bool IsCi(void) {return false;} // Methods - virtual void SetValue(short sval, int n) {assert(false);} - virtual void SetValue(ushort sval, int n) {assert(false);} - virtual void SetValue(int lval, int n) {assert(false);} - virtual void SetValue(uint lval, int n) {assert(false);} - virtual void SetValue(longlong lval, int n) {assert(false);} - virtual void SetValue(ulonglong lval, int n) {assert(false);} - virtual void SetValue(double fval, int n) {assert(false);} - virtual void SetValue(char cval, int n) {assert(false);} - virtual void SetValue(uchar cval, int n) {assert(false);} - virtual void SetValue(PSZ sp, int n) {assert(false);} - virtual void SetValue(char *sp, uint len, int n) {assert(false);} + virtual void SetValue(short, int) {assert(false);} + virtual void SetValue(ushort, int) {assert(false);} + virtual void SetValue(int, int) {assert(false);} + virtual void SetValue(uint, int) {assert(false);} + virtual void SetValue(longlong, int) {assert(false);} + virtual void SetValue(ulonglong, int) {assert(false);} + virtual void SetValue(double, int) {assert(false);} + virtual void SetValue(char, int) {assert(false);} + virtual void SetValue(uchar, int) {assert(false);} + virtual void SetValue(PSZ, int) {assert(false);} + virtual void SetValue(char *, uint, int) {assert(false);} virtual void SetValue(PVAL valp, int n) = 0; virtual void SetValue(PVBLK pv, int n1, int n2) = 0; virtual void SetMin(PVAL valp, int n) = 0; @@ -271,7 +271,7 @@ class STRBLK : public VALBLK { // Implementation virtual void SetNull(int n, bool b) {if (b) {Strp[n] = NULL;}} virtual bool IsNull(int n) {return Strp[n] == NULL;} - virtual void SetNullable(bool b) {} // Always nullable + virtual void SetNullable(bool) {} // Always nullable virtual bool Init(PGLOBAL g, bool check); virtual int GetVlen(void) {return sizeof(PSZ);} virtual PSZ GetCharValue(int n) {return Strp[n];} @@ -284,7 +284,7 @@ class STRBLK : public VALBLK { virtual longlong GetBigintValue(int n); virtual ulonglong GetUBigintValue(int n); virtual double GetFloatValue(int n) {return atof(Strp[n]);} - virtual char *GetCharString(char *p, int n) {return Strp[n];} + virtual char *GetCharString(char *, int n) {return Strp[n];} virtual void Reset(int n) {Strp[n] = NULL;} // Methods diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 7d3d5463129..5a8b1de326a 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -1,7 +1,7 @@ /************* Value C++ Functions Source Code File (.CPP) *************/ /* Name: VALUE.CPP Version 2.5 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2001-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2001-2015 */ /* */ /* This file contains the VALUE and derived classes family functions. */ /* These classes contain values of different types. They are used so */ @@ -475,7 +475,7 @@ PVAL AllocateValue(PGLOBAL g, PVAL valp, int newtype, int uns) break; case TYPE_DATE: - vp = new(g) DTVAL(g, valp->GetIntValue()); + vp = new(g) DTVAL(valp->GetIntValue()); break; case TYPE_DOUBLE: vp = new(g) TYPVAL(valp->GetFloatValue(), TYPE_DOUBLE, @@ -551,7 +551,7 @@ BYTE VALUE::TestValue(PVAL vp) /***********************************************************************/ /* Compute a function on a string. */ /***********************************************************************/ -bool VALUE::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) +bool VALUE::Compute(PGLOBAL g, PVAL *, int, OPVAL) { strcpy(g->Message, "Compute not implemented for this value type"); return true; @@ -976,7 +976,7 @@ ulonglong TYPVAL::MinMaxVal(bool b) {return (b) ? 0xFFFFFFFFFFFFFFFFLL : 0;} template <> -double TYPVAL::MinMaxVal(bool b) +double TYPVAL::MinMaxVal(bool) {assert(false); return 0.0;} template <> @@ -1566,7 +1566,7 @@ bool TYPVAL::GetBinValue(void *buf, int buflen, bool go) /***********************************************************************/ /* STRING ShowValue: get string representation of a char value. */ /***********************************************************************/ -char *TYPVAL::ShowValue(char *buf, int len) +char *TYPVAL::ShowValue(char *, int) { return Strp; } // end of ShowValue @@ -1574,7 +1574,7 @@ char *TYPVAL::ShowValue(char *buf, int len) /***********************************************************************/ /* STRING GetCharString: get string representation of a char value. */ /***********************************************************************/ -char *TYPVAL::GetCharString(char *p) +char *TYPVAL::GetCharString(char *) { return Strp; } // end of GetCharString @@ -1681,7 +1681,7 @@ bool TYPVAL::FormatValue(PVAL vp, char *fmt) /***********************************************************************/ /* STRING SetFormat function (used to set SELECT output format). */ /***********************************************************************/ -bool TYPVAL::SetConstFormat(PGLOBAL g, FORMAT& fmt) +bool TYPVAL::SetConstFormat(PGLOBAL, FORMAT& fmt) { fmt.Type[0] = 'C'; fmt.Length = Len; @@ -2300,7 +2300,7 @@ char *BINVAL::ShowValue(char *buf, int len) /***********************************************************************/ /* BINVAL GetCharString: get string representation of a binary value. */ /***********************************************************************/ -char *BINVAL::GetCharString(char *p) +char *BINVAL::GetCharString(char *) { if (!Chrp) Chrp = (char*)PlugSubAlloc(Global, NULL, Clen * 2 + 1); @@ -2349,7 +2349,7 @@ bool BINVAL::FormatValue(PVAL vp, char *fmt) /***********************************************************************/ /* BINVAL SetFormat function (used to set SELECT output format). */ /***********************************************************************/ -bool BINVAL::SetConstFormat(PGLOBAL g, FORMAT& fmt) +bool BINVAL::SetConstFormat(PGLOBAL, FORMAT& fmt) { fmt.Type[0] = 'B'; fmt.Length = Clen; @@ -2379,7 +2379,7 @@ DTVAL::DTVAL(PGLOBAL g, int n, int prec, PSZ fmt) /***********************************************************************/ /* DTVAL public constructor from int. */ /***********************************************************************/ -DTVAL::DTVAL(PGLOBAL g, int n) : TYPVAL(n, TYPE_DATE) +DTVAL::DTVAL(int n) : TYPVAL(n, TYPE_DATE) { Pdtp = NULL; Len = 19; diff --git a/storage/connect/value.h b/storage/connect/value.h index c5aeb5c2a2f..207944594f1 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -94,18 +94,18 @@ class DllExport VALUE : public BLOCK { virtual bool SetValue_pval(PVAL valp, bool chktype = false) = 0; virtual bool SetValue_char(char *p, int n) = 0; virtual void SetValue_psz(PSZ s) = 0; - virtual void SetValue_bool(bool b) {assert(FALSE);} + virtual void SetValue_bool(bool) {assert(FALSE);} virtual int CompareValue(PVAL vp) = 0; virtual BYTE TestValue(PVAL vp); - virtual void SetValue(char c) {assert(false);} - virtual void SetValue(uchar c) {assert(false);} - virtual void SetValue(short i) {assert(false);} - virtual void SetValue(ushort i) {assert(false);} - virtual void SetValue(int n) {assert(false);} - virtual void SetValue(uint n) {assert(false);} - virtual void SetValue(longlong n) {assert(false);} - virtual void SetValue(ulonglong n) {assert(false);} - virtual void SetValue(double f) {assert(false);} + virtual void SetValue(char) {assert(false);} + virtual void SetValue(uchar) {assert(false);} + virtual void SetValue(short) {assert(false);} + virtual void SetValue(ushort) {assert(false);} + virtual void SetValue(int) {assert(false);} + virtual void SetValue(uint) {assert(false);} + virtual void SetValue(longlong) {assert(false);} + virtual void SetValue(ulonglong) {assert(false);} + virtual void SetValue(double) {assert(false);} virtual void SetValue_pvblk(PVBLK blk, int n) = 0; virtual void SetBinValue(void *p) = 0; virtual bool GetBinValue(void *buf, int buflen, bool go) = 0; @@ -338,7 +338,7 @@ class DllExport BINVAL: public VALUE { virtual void SetValue(double f); virtual void SetBinValue(void *p); virtual bool GetBinValue(void *buf, int buflen, bool go); - virtual int CompareValue(PVAL vp) {assert(false); return 0;} + virtual int CompareValue(PVAL) {assert(false); return 0;} virtual char *ShowValue(char *buf, int); virtual char *GetCharString(char *p); virtual bool IsEqual(PVAL vp, bool chktype); @@ -359,11 +359,11 @@ class DllExport DTVAL : public TYPVAL { public: // Constructors DTVAL(PGLOBAL g, int n, int p, PSZ fmt); - DTVAL(PGLOBAL g, PSZ s, int n); - DTVAL(PGLOBAL g, short i); - DTVAL(PGLOBAL g, int n); - DTVAL(PGLOBAL g, longlong n); - DTVAL(PGLOBAL g, double f); +//DTVAL(PGLOBAL g, PSZ s, int n); +//DTVAL(PGLOBAL g, short i); + DTVAL(int n); +//DTVAL(PGLOBAL g, longlong n); +//DTVAL(PGLOBAL g, double f); // Implementation virtual bool IsZero(void) {return Null;} diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index 024a9c081cd..ee8dc3ac4cb 100755 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -1,7 +1,7 @@ /***************** Xindex C++ Class Xindex Code (.CPP) *****************/ /* Name: XINDEX.CPP Version 2.9 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2015 */ /* */ /* This file contains the class XINDEX implementation code. */ /***********************************************************************/ @@ -179,7 +179,7 @@ XXBASE::XXBASE(PTDBDOS tbxp, bool b) : CSORT(b), /***********************************************************************/ /* Make file output of XINDEX contents. */ /***********************************************************************/ -void XXBASE::Print(PGLOBAL g, FILE *f, uint n) +void XXBASE::Print(PGLOBAL, FILE *f, uint n) { char m[64]; @@ -191,7 +191,7 @@ void XXBASE::Print(PGLOBAL g, FILE *f, uint n) /***********************************************************************/ /* Make string output of XINDEX contents. */ /***********************************************************************/ -void XXBASE::Print(PGLOBAL g, char *ps, uint z) +void XXBASE::Print(PGLOBAL, char *ps, uint z) { *ps = '\0'; strncat(ps, "Xindex", z); @@ -287,7 +287,7 @@ int XINDEX::Qcompare(int *i1, int *i2) /* Sure enough, it is done while records are read and permit to avoid */ /* reading the table while doing the join (Dynamic index only) */ /***********************************************************************/ -bool XINDEX::AddColumns(PIXDEF xdp) +bool XINDEX::AddColumns(void) { if (!Dynamic) return false; // Not applying to static index @@ -377,7 +377,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) To_LastCol = prev; - if (AddColumns(sxp)) { + if (AddColumns()) { PCOL kolp = To_Cols[0]; // Temporary while imposing Nk = 1 i = 0; @@ -733,7 +733,7 @@ int XINDEX::ColMaxSame(PXCOL kp) /* Reorder: use the sort index to reorder the data in storage so */ /* it will be physically sorted and sort index can be removed. */ /***********************************************************************/ -bool XINDEX::Reorder(PGLOBAL g) +bool XINDEX::Reorder(PGLOBAL g __attribute__((unused))) { register int i, j, k, n; bool sorted = true; @@ -1585,7 +1585,7 @@ int XINDEX::Range(PGLOBAL g, int limit, bool incl) if (++i == Nval) break; } // endfor kp - if ((k = FastFind(Nval)) < Num_K) + if ((k = FastFind()) < Num_K) n = k; // if (limit) // n = (Mul) ? k : kp->Val_K; @@ -1826,7 +1826,7 @@ int XINDEX::Fetch(PGLOBAL g) if (trace > 1) htrc("Fetch: Looking for new value\n"); - Cur_K = FastFind(Nval); + Cur_K = FastFind(); if (Cur_K >= Num_K) /*************************************************************/ @@ -1857,12 +1857,12 @@ int XINDEX::Fetch(PGLOBAL g) /* FastFind: Returns the index of matching record in a join using an */ /* optimized algorithm based on dichotomie and optimized comparing. */ /***********************************************************************/ -int XINDEX::FastFind(int nv) +int XINDEX::FastFind(void) { register int curk, sup, inf, i= 0, k, n = 2; register PXCOL kp, kcp; - assert((int)nv == Nval); +//assert((int)nv == Nval); if (Nblk && Op == OP_EQ) { // Look in block values to find in which block to search @@ -2018,7 +2018,7 @@ int XINDXS::Range(PGLOBAL g, int limit, bool incl) /*********************************************************************/ if (xp->GetType() == TYPE_CONST) { kp->Valp->SetValue_pval(xp->GetValue(), !kp->Prefix); - k = FastFind(Nval); + k = FastFind(); if (k < Num_K || Op != OP_EQ) if (limit) @@ -2162,7 +2162,7 @@ int XINDXS::Fetch(PGLOBAL g) if (trace > 1) htrc("Fetch: Looking for new value\n"); - Cur_K = FastFind(1); + Cur_K = FastFind(); if (Cur_K >= Num_K) // Rank not whithin index table, signal record not found @@ -2190,7 +2190,7 @@ int XINDXS::Fetch(PGLOBAL g) /* FastFind: Returns the index of matching indexed record using an */ /* optimized algorithm based on dichotomie and optimized comparing. */ /***********************************************************************/ -int XINDXS::FastFind(int nk) +int XINDXS::FastFind(void) { register int sup, inf, i= 0, n = 2; register PXCOL kcp = To_KeyCol; @@ -2360,7 +2360,8 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) /***********************************************************************/ /* Move into an index file. */ /***********************************************************************/ -bool XFILE::Seek(PGLOBAL g, int low, int high, int origin) +bool XFILE::Seek(PGLOBAL g, int low, int high __attribute__((unused)), + int origin) { #if defined(_DEBUG) assert(high == 0); @@ -2371,7 +2372,6 @@ bool XFILE::Seek(PGLOBAL g, int low, int high, int origin) return true; } // endif -//ftell(Xfile); return false; } // end of Seek @@ -2819,7 +2819,7 @@ void XHUGE::Close(char *fn, int id) /***********************************************************************/ /* Don't know whether this is possible for huge files. */ /***********************************************************************/ -void *XHUGE::FileView(PGLOBAL g, char *fn) +void *XHUGE::FileView(PGLOBAL g, char *) { strcpy(g->Message, MSG(NO_PART_MAP)); return NULL; @@ -2879,7 +2879,7 @@ bool XXROW::Init(PGLOBAL g) /***********************************************************************/ /* RANGE: Tell how many record exist in a given value range. */ /***********************************************************************/ -int XXROW::Range(PGLOBAL g, int limit, bool incl) +int XXROW::Range(PGLOBAL, int limit, bool incl) { int n = Valp->GetIntValue(); @@ -2895,7 +2895,7 @@ int XXROW::Range(PGLOBAL g, int limit, bool incl) /***********************************************************************/ /* XXROW: Fetch a physical or logical record. */ /***********************************************************************/ -int XXROW::Fetch(PGLOBAL g) +int XXROW::Fetch(PGLOBAL) { if (Num_K == 0) return -1; // means end of file @@ -2904,7 +2904,7 @@ int XXROW::Fetch(PGLOBAL g) /* Look for a key equal to the link column of previous table, */ /* and return its rank whithin the index table. */ /*********************************************************************/ - Cur_K = FastFind(1); + Cur_K = FastFind(); if (Cur_K >= Num_K) /*******************************************************************/ @@ -2926,7 +2926,7 @@ int XXROW::Fetch(PGLOBAL g) /***********************************************************************/ /* FastFind: Returns the index of matching record in a join. */ /***********************************************************************/ -int XXROW::FastFind(int nk) +int XXROW::FastFind(void) { int n = Valp->GetIntValue(); diff --git a/storage/connect/xindex.h b/storage/connect/xindex.h index 6e40e9b160e..079412b32cf 100644 --- a/storage/connect/xindex.h +++ b/storage/connect/xindex.h @@ -1,7 +1,7 @@ /*************** Xindex H Declares Source Code File (.H) ***************/ /* Name: XINDEX.H Version 3.5 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2004 - 2013 */ +/* (C) Copyright to the author Olivier BERTRAND 2004 - 2015 */ /* */ /* This file contains the XINDEX class declares. */ /***********************************************************************/ @@ -205,12 +205,11 @@ class DllExport XXBASE : public CSORT, public BLOCK { #endif // XMAP virtual int MaxRange(void) {return 1;} virtual int Fetch(PGLOBAL g) = 0; - virtual bool NextVal(bool eq) {return true;} + virtual bool NextVal(bool) {return true;} virtual bool PrevVal(void) {return true;} - virtual int FastFind(int nk) = 0; - virtual bool Reorder(PGLOBAL g) {return true;} - virtual int Range(PGLOBAL g, int limit = 0, bool incl = true) - {return -1;} // Means error + virtual int FastFind(void) = 0; + virtual bool Reorder(PGLOBAL) {return true;} + virtual int Range(PGLOBAL, int = 0, bool = true) {return -1;} // Means error virtual int Qcompare(int *, int *) = 0; virtual int GroupSize(void) {return 1;} virtual void Close(void) = 0; @@ -266,7 +265,7 @@ class DllExport XINDEX : public XXBASE { #endif // XMAP virtual int Qcompare(int *, int *); virtual int Fetch(PGLOBAL g); - virtual int FastFind(int nk); + virtual int FastFind(void); virtual int GroupSize(void); virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); virtual int MaxRange(void) {return MaxSame;} @@ -280,7 +279,7 @@ class DllExport XINDEX : public XXBASE { bool GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk); protected: - bool AddColumns(PIXDEF xdp); + bool AddColumns(void); bool NextValDif(void); // Members @@ -312,7 +311,7 @@ class DllExport XINDXS : public XINDEX { // Methods virtual int Qcompare(int *, int *); virtual int Fetch(PGLOBAL g); - virtual int FastFind(int nk); + virtual int FastFind(void); virtual bool NextVal(bool eq); virtual bool PrevVal(void); virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); @@ -421,14 +420,14 @@ class DllExport XXROW : public XXBASE { // Methods virtual bool Init(PGLOBAL g); #if defined(XMAP) - virtual bool MapInit(PGLOBAL g) {return true;} + virtual bool MapInit(PGLOBAL) {return true;} #endif // XMAP virtual int Fetch(PGLOBAL g); - virtual int FastFind(int nk); + virtual int FastFind(void); virtual int MaxRange(void) {return 1;} virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); virtual int Qcompare(int *, int *) {assert(false); return 0;} - virtual bool Make(PGLOBAL g, PIXDEF sxp) {return false;} + virtual bool Make(PGLOBAL, PIXDEF) {return false;} virtual void Close(void) {} protected: diff --git a/storage/connect/xobject.h b/storage/connect/xobject.h index 8e2358dd526..82ff9e21225 100644 --- a/storage/connect/xobject.h +++ b/storage/connect/xobject.h @@ -42,9 +42,9 @@ class DllExport XOBJECT : public BLOCK { virtual int GetResultType(void) {return TYPE_VOID;} virtual int GetKey(void) {return 0;} #if defined(_DEBUG) - virtual void SetKey(int k) {assert(false);} + virtual void SetKey(int) {assert(false);} #else // !_DEBUG - virtual void SetKey(int k) {} // Only defined for COLBLK + virtual void SetKey(int) {} // Only defined for COLBLK #endif // !_DEBUG virtual int GetLength(void) = 0; virtual int GetLengthEx(void) = 0; diff --git a/storage/connect/xtable.h b/storage/connect/xtable.h index d1ea2b0d85f..1a75d97bafa 100644 --- a/storage/connect/xtable.h +++ b/storage/connect/xtable.h @@ -77,21 +77,21 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. virtual int GetTdb_No(void) {return Tdb_No;} virtual PTDB GetNext(void) {return Next;} virtual PCATLG GetCat(void) {return NULL;} - virtual void SetAbort(bool b) {;} + virtual void SetAbort(bool) {;} // Methods virtual bool IsSame(PTDB tp) {return tp == this;} virtual bool IsSpecial(PSZ name) = 0; - virtual bool GetBlockValues(PGLOBAL g) {return false;} - virtual int Cardinality(PGLOBAL g) {return 0;} + virtual bool GetBlockValues(PGLOBAL) {return false;} + virtual int Cardinality(PGLOBAL) {return 0;} virtual int GetMaxSize(PGLOBAL) = 0; virtual int GetProgMax(PGLOBAL) = 0; virtual int GetProgCur(void) = 0; virtual int RowNumber(PGLOBAL g, bool b = false); virtual bool IsReadOnly(void) {return true;} virtual const CHARSET_INFO *data_charset() {return NULL;} - virtual PTDB Duplicate(PGLOBAL g) {return NULL;} - virtual PTDB CopyOne(PTABS t) {return this;} + virtual PTDB Duplicate(PGLOBAL) {return NULL;} + virtual PTDB CopyOne(PTABS) {return this;} virtual PTDB Copy(PTABS t); virtual void PrintAM(FILE *f, char *m) {fprintf(f, "%s AM(%d)\n", m, GetAmType());} @@ -108,7 +108,7 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. virtual int WriteDB(PGLOBAL) = 0; virtual int DeleteDB(PGLOBAL, int) = 0; virtual void CloseDB(PGLOBAL) = 0; - virtual int CheckWrite(PGLOBAL g) {return 0;} + virtual int CheckWrite(PGLOBAL) {return 0;} virtual bool ReadKey(PGLOBAL, OPVAL, const void *, int) = 0; protected: @@ -155,7 +155,7 @@ class DllExport TDBASE : public TDB { PCOL Key(int i) {return (To_Key_Col) ? To_Key_Col[i] : NULL;} // Methods - virtual bool IsUsingTemp(PGLOBAL g) {return false;} + virtual bool IsUsingTemp(PGLOBAL) {return false;} virtual bool IsIndexed(void) {return false;} virtual bool IsSpecial(PSZ name); virtual PCATLG GetCat(void); @@ -170,9 +170,9 @@ class DllExport TDBASE : public TDB { virtual CHARSET_INFO *data_charset(void); virtual int GetProgMax(PGLOBAL g) {return GetMaxSize(g);} virtual int GetProgCur(void) {return GetRecpos();} - virtual PSZ GetFile(PGLOBAL g) {return "Not a file";} + virtual PSZ GetFile(PGLOBAL) {return "Not a file";} virtual int GetRemote(void) {return 0;} - virtual void SetFile(PGLOBAL g, PSZ fn) {} + virtual void SetFile(PGLOBAL, PSZ) {} virtual void ResetDB(void) {} virtual void ResetSize(void) {MaxSize = -1;} virtual void RestoreNrec(void) {} @@ -183,12 +183,12 @@ class DllExport TDBASE : public TDB { virtual PCOL ColDB(PGLOBAL g, PSZ name, int num); virtual PCOL MakeCol(PGLOBAL, PCOLDEF, PCOL, int) {assert(false); return NULL;} - virtual PCOL InsertSpecialColumn(PGLOBAL g, PCOL colp); + virtual PCOL InsertSpecialColumn(PCOL colp); virtual PCOL InsertSpcBlk(PGLOBAL g, PCOLDEF cdp); virtual void MarkDB(PGLOBAL g, PTDB tdb2); - virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) + virtual int MakeIndex(PGLOBAL g, PIXDEF, bool) {strcpy(g->Message, "Remote index"); return RC_INFO;} - virtual bool ReadKey(PGLOBAL g, OPVAL op, const void *key, int len) + virtual bool ReadKey(PGLOBAL, OPVAL, const void *, int) {assert(false); return true;} protected: @@ -225,7 +225,7 @@ class DllExport TDBCAT : public TDBASE { // Methods virtual int GetRecpos(void) {return N;} virtual int GetProgCur(void) {return N;} - virtual int RowNumber(PGLOBAL g, bool b = false) {return N + 1;} + virtual int RowNumber(PGLOBAL, bool = false) {return N + 1;} virtual bool SetRecpos(PGLOBAL g, int recpos); // Database routines From 893631a8c188817e3294edc11de2087630dde801 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Wed, 20 May 2015 12:39:17 +0200 Subject: [PATCH 12/39] All the last changes made in the ob-10.0 branch including also changes of line endings of some test files --- .gitignore | 6 +- storage/connect/.gitattributes | 25 + storage/connect/.gitignore | 260 + storage/connect/filamdbf.cpp | 74 +- storage/connect/filamfix.cpp | 33 +- storage/connect/global.h | 2 +- storage/connect/ha_connect.cc | 2 + storage/connect/json.cpp | 2324 ++--- storage/connect/json.h | 540 +- storage/connect/jsonudf.cpp | 4 +- storage/connect/mycat.cc | 41 +- storage/connect/mysql-test/connect/my.cnf | 34 +- .../connect/mysql-test/connect/r/bin.result | 28 +- .../connect/mysql-test/connect/r/json.result | 32 +- .../mysql-test/connect/r/xml_html.result | 32 + .../mysql-test/connect/std_data/beers.xml | 16 + .../mysql-test/connect/std_data/bookstore.xml | 62 +- .../mysql-test/connect/std_data/boyswin.txt | 12 +- .../mysql-test/connect/std_data/coffee.htm | 24 + .../mysql-test/connect/std_data/emp.txt | 9090 ++++++++--------- .../mysql-test/connect/std_data/expenses.txt | 48 +- .../mysql-test/connect/std_data/sexe.csv | 6 +- .../mysql-test/connect/std_data/sitmat.csv | 14 +- .../connect/mysql-test/connect/t/alter.test | 278 +- .../mysql-test/connect/t/alter_xml.test | 58 +- storage/connect/mysql-test/connect/t/bin.test | 154 +- .../connect/mysql-test/connect/t/datest.test | 32 +- storage/connect/mysql-test/connect/t/fmt.test | 170 +- .../connect/mysql-test/connect/t/general.test | 32 +- .../connect/mysql-test/connect/t/json.test | 20 +- .../connect/mysql-test/connect/t/json_udf.inc | 33 + .../mysql-test/connect/t/json_udf.test | 93 + storage/connect/mysql-test/connect/t/mrr.test | 132 +- storage/connect/mysql-test/connect/t/mul.test | 86 +- .../connect/mysql-test/connect/t/myconn.inc | 54 +- .../mysql-test/connect/t/myconn_cleanup.inc | 18 +- .../connect/mysql-test/connect/t/mysql.test | 944 +- .../mysql-test/connect/t/mysql_discovery.test | 66 +- .../mysql-test/connect/t/mysql_exec.test | 90 +- .../mysql-test/connect/t/mysql_grant.test | 156 +- .../mysql-test/connect/t/mysql_new.test | 650 +- .../connect/mysql-test/connect/t/null.test | 174 +- .../connect/mysql-test/connect/t/occur.test | 122 +- .../mysql-test/connect/t/odbc_sqlite3.test | 180 +- .../mysql-test/connect/t/part_file.test | 332 +- .../mysql-test/connect/t/part_table.test | 184 +- .../connect/mysql-test/connect/t/pivot.test | 326 +- storage/connect/mysql-test/connect/t/tbl.test | 106 +- .../mysql-test/connect/t/unsigned.test | 70 +- storage/connect/mysql-test/connect/t/upd.test | 306 +- .../connect/mysql-test/connect/t/updelx.test | 192 +- .../connect/mysql-test/connect/t/updelx2.test | 44 +- .../connect/mysql-test/connect/t/xcol.test | 82 +- .../mysql-test/connect/t/xml_html.test | 39 + .../mysql-test/connect/t/xml_mdev5261.test | 54 +- storage/connect/rcmsg.c | 136 +- storage/connect/reldef.cpp | 65 +- storage/connect/tabfix.cpp | 112 +- storage/connect/tabfix.h | 25 +- storage/connect/tabjson.cpp | 69 +- storage/connect/tabjson.h | 6 +- storage/connect/tabsys.h | 364 +- 62 files changed, 9734 insertions(+), 9029 deletions(-) create mode 100644 storage/connect/.gitattributes create mode 100644 storage/connect/.gitignore create mode 100644 storage/connect/mysql-test/connect/r/xml_html.result create mode 100644 storage/connect/mysql-test/connect/std_data/beers.xml create mode 100644 storage/connect/mysql-test/connect/std_data/coffee.htm create mode 100644 storage/connect/mysql-test/connect/t/json_udf.inc create mode 100644 storage/connect/mysql-test/connect/t/json_udf.test create mode 100644 storage/connect/mysql-test/connect/t/xml_html.test diff --git a/.gitignore b/.gitignore index ee5216caf7b..85d68f2853d 100644 --- a/.gitignore +++ b/.gitignore @@ -245,6 +245,11 @@ storage/mroonga/vendor/groonga/src/suggest/groonga-suggest-create-dataset *.ko *.obj *.elf +*.exp +*.manifest +*.dep +*.idb +*.res # Precompiled Headers *.gch @@ -293,7 +298,6 @@ storage/mroonga/vendor/groonga/src/suggest/groonga-suggest-create-dataset [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ -[Rr]eleaseWithDebInfo/ x64/ x86/ build/ diff --git a/storage/connect/.gitattributes b/storage/connect/.gitattributes new file mode 100644 index 00000000000..d21fdf8f212 --- /dev/null +++ b/storage/connect/.gitattributes @@ -0,0 +1,25 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.c text +*.cc text +*.cpp text +*.h text +*.test text + +# Declare files that will always have LF line endings on checkout. +*.result text eol=lf +mysql-test/connect/std_data/*.txt text eol=lf +mysql-test/connect/std_data/*.dat text eol=lf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary + +*.c diff=cpp +*.h diff=cpp +*.cc diff=cpp +*.ic diff=cpp +*.cpp diff=cpp diff --git a/storage/connect/.gitignore b/storage/connect/.gitignore new file mode 100644 index 00000000000..e0b8bb27a24 --- /dev/null +++ b/storage/connect/.gitignore @@ -0,0 +1,260 @@ +# Edited by Olivier Bertrand +*-t +*.a +*.ctest +*.o +*.reject +*.so +*.so.* +*.spec +*~ +*.bak +*.log +*.cmake +*.tgz +*.msg +.*.swp +*.ninja +.ninja_* +.gdb_history + +CMakeFiles/ +connect.dir/ +connect.dir-Copie/ +Debug/ +MinSizeRel/ +Release/ +RelWithDebInfo/ + +# C and C++ + +# Compiled Object files +*.slo +*.lo +*.o +*.ko +*.obj +*.elf +*.exp +*.manifest +*.dep +*.idb +*.res + +# Precompiled Headers +*.gch +*.pch + +# Compiled Static libraries +*.lib +*.a +*.la +*.lai +*.lo + +# Compiled Dynamic libraries +*.so +*.so.* +*.dylib +*.dll + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates +*.ncb +*.sln + +*.vcproj +*.vcproj.* +*.vcproj.*.* +*.vcproj.*.*.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Roslyn cache directories +*.ide/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +#NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding addin-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# If using the old MSBuild-Integrated Package Restore, uncomment this: +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +# sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 8a88b743a15..4d66c2ab2ff 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -74,16 +74,28 @@ typedef struct _dbfheader { //uchar Dbfox :4; /* FoxPro if equal to 3 */ uchar Version; /* Version information flags */ char Filedate[3]; /* date, YYMMDD, binary. YY=year-1900 */ - uint Records; /* records in the file */ - ushort Headlen; /* bytes in the header */ - ushort Reclen; /* bytes in a record */ - ushort Fields; /* Reserved but used to store fields */ + private: + /* The following four members are stored in little-endian format on disk */ + char m_RecordsBuf[4]; /* records in the file */ + char m_HeadlenBuf[2]; /* bytes in the header */ + char m_ReclenBuf[2]; /* bytes in a record */ + char m_FieldsBuf[2]; /* Reserved but used to store fields */ + public: char Incompleteflag; /* 01 if incomplete, else 00 */ char Encryptflag; /* 01 if encrypted, else 00 */ char Reserved2[12]; /* for LAN use */ char Mdxflag; /* 01 if production .mdx, else 00 */ char Language; /* Codepage */ char Reserved3[2]; + + uint Records(void) const {return uint4korr(m_RecordsBuf);} + ushort Headlen(void) const {return uint2korr(m_HeadlenBuf);} + ushort Reclen(void) const {return uint2korr(m_ReclenBuf);} + ushort Fields(void) const {return uint2korr(m_FieldsBuf);} + + void SetHeadlen(ushort num) {int2store(m_HeadlenBuf, num);} + void SetReclen(ushort num) {int2store(m_ReclenBuf, num);} + void SetFields(ushort num) {int2store(m_FieldsBuf, num);} } DBFHEADER; /****************************************************************************/ @@ -115,7 +127,6 @@ typedef struct _descriptor { /* Side effects: */ /* Moves file pointer to byte 32; fills buffer at buf with */ /* first 32 bytes of file. */ -/* Converts numeric values to platform byte ordering (LE in file) */ /****************************************************************************/ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) { @@ -143,13 +154,8 @@ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) } else strcpy(g->Message, MSG(DBASE_FILE)); - // Convert numeric fields to have them in platform byte ordering - buf->Records = uint4korr(&buf->Records); - buf->Headlen = uint2korr(&buf->Headlen); - buf->Reclen = uint2korr(&buf->Reclen); - // Check last byte(s) of header - if (fseek(file, buf->Headlen - dbc, SEEK_SET) != 0) { + if (fseek(file, buf->Headlen() - dbc, SEEK_SET) != 0) { sprintf(g->Message, MSG(BAD_HEADER), fn); return RC_FX; } // endif fseek @@ -169,7 +175,7 @@ static int dbfhead(PGLOBAL g, FILE *file, PSZ fn, DBFHEADER *buf) } // endif endmark // Calculate here the number of fields while we have the dbc info - buf->Fields = (buf->Headlen - dbc - 1) / 32; + buf->SetFields((buf->Headlen() - dbc - 1) / 32); fseek(file, HEADLEN, SEEK_SET); return rc; } // end of dbfhead @@ -225,7 +231,7 @@ PQRYRES DBFColumns(PGLOBAL g, char *dp, const char *fn, bool info) /************************************************************************/ /* Allocate the structures used to refer to the result set. */ /************************************************************************/ - fields = mainhead.Fields; + fields = mainhead.Fields(); } else fields = 0; @@ -242,11 +248,11 @@ PQRYRES DBFColumns(PGLOBAL g, char *dp, const char *fn, bool info) if (trace) { htrc("Structure of %s\n", filename); htrc("headlen=%hd reclen=%hd degree=%d\n", - mainhead.Headlen, mainhead.Reclen, fields); + mainhead.Headlen(), mainhead.Reclen(), fields); htrc("flags(iem)=%d,%d,%d cp=%d\n", mainhead.Incompleteflag, mainhead.Encryptflag, mainhead.Mdxflag, mainhead.Language); htrc("%hd records, last changed %02d/%02d/%d\n", - mainhead.Records, mainhead.Filedate[1], mainhead.Filedate[2], + mainhead.Records(), mainhead.Filedate[1], mainhead.Filedate[2], mainhead.Filedate[0] + (mainhead.Filedate[0] <= 30) ? 2000 : 1900); htrc("Field Type Offset Len Dec Set Mdx\n"); } // endif trace @@ -404,13 +410,13 @@ int DBFBASE::ScanHeader(PGLOBAL g, PSZ fname, int lrecl, char *defpath) } else if (rc == RC_FX) return -1; - if ((int)header.Reclen != lrecl) { - sprintf(g->Message, MSG(BAD_LRECL), lrecl, header.Reclen); + if ((int)header.Reclen() != lrecl) { + sprintf(g->Message, MSG(BAD_LRECL), lrecl, header.Reclen()); return -1; } // endif Lrecl - Records = (int)header.Records; - return (int)header.Headlen; + Records = (int)header.Records(); + return (int)header.Headlen(); } // end of ScanHeader /* ---------------------------- Class DBFFAM ------------------------------ */ @@ -571,8 +577,8 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) header->Filedate[0] = datm->tm_year - 100; header->Filedate[1] = datm->tm_mon + 1; header->Filedate[2] = datm->tm_mday; - int2store(&header->Headlen, hlen); - int2store(&header->Reclen, reclen); + header->SetHeadlen((ushort)hlen); + header->SetReclen((ushort)reclen); descp = (DESCRIPTOR*)header; // Currently only standard Xbase types are supported @@ -633,13 +639,13 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) DBFHEADER header; if ((rc = dbfhead(g, Stream, Tdbp->GetFile(g), &header)) == RC_OK) { - if (Lrecl != (int)header.Reclen) { - sprintf(g->Message, MSG(BAD_LRECL), Lrecl, header.Reclen); + if (Lrecl != (int)header.Reclen()) { + sprintf(g->Message, MSG(BAD_LRECL), Lrecl, header.Reclen()); return true; } // endif Lrecl - Records = (int)header.Records; - Headlen = (int)header.Headlen; + Records = (int)header.Records(); + Headlen = (int)header.Headlen(); } else if (rc == RC_NF) { Records = 0; Headlen = 0; @@ -735,7 +741,7 @@ bool DBFFAM::CopyHeader(PGLOBAL g) if (Headlen) { void *hdr = PlugSubAlloc(g, NULL, Headlen); size_t n, hlen = (size_t)Headlen; - int pos = ftell(Stream); + int pos = ftell(Stream); if (fseek(Stream, 0, SEEK_SET)) strcpy(g->Message, "Seek error in CopyHeader"); @@ -869,12 +875,14 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) if (n > Records) { // Update the number of rows in the file header - char filename[_MAX_PATH], nRecords[4]; + char filename[_MAX_PATH]; - int4store(&nRecords, n); PlugSetPath(filename, To_File, Tdbp->GetPath()); if ((Stream= global_fopen(g, MSGID_OPEN_MODE_STRERROR, filename, "r+b"))) { + char nRecords[4]; + int4store(nRecords, n); + fseek(Stream, 4, SEEK_SET); // Get header.Records position fwrite(nRecords, sizeof(nRecords), 1, Stream); fclose(Stream); @@ -951,13 +959,13 @@ bool DBMFAM::AllocateBuffer(PGLOBAL g) /************************************************************************/ DBFHEADER *hp = (DBFHEADER*)Memory; - if (Lrecl != (int)uint2korr(&hp->Reclen)) { - sprintf(g->Message, MSG(BAD_LRECL), Lrecl, uint2korr(&hp->Reclen)); + if (Lrecl != (int)hp->Reclen()) { + sprintf(g->Message, MSG(BAD_LRECL), Lrecl, hp->Reclen()); return true; } // endif Lrecl - Records = (int)uint4korr(&hp->Records); - Headlen = (int)uint2korr(&hp->Headlen); + Records = (int)hp->Records(); + Headlen = (int)hp->Headlen(); } // endif Headlen /**************************************************************************/ @@ -1011,7 +1019,7 @@ int DBMFAM::ReadBuffer(PGLOBAL g) /* Data Base delete line routine for DBF access methods. */ /* Deleted lines are just flagged in the first buffer character. */ /****************************************************************************/ -int DBMFAM::DeleteRecords(PGLOBAL, int irc) +int DBMFAM::DeleteRecords(PGLOBAL g, int irc) { if (irc == RC_OK) *Fpos = '*'; diff --git a/storage/connect/filamfix.cpp b/storage/connect/filamfix.cpp index 4dedd3375b0..c352db47044 100644 --- a/storage/connect/filamfix.cpp +++ b/storage/connect/filamfix.cpp @@ -46,6 +46,7 @@ #include "plgdbsem.h" #include "filamfix.h" #include "tabdos.h" +#include "tabfix.h" #include "osutil.h" #ifndef INVALID_SET_FILE_POINTER @@ -133,18 +134,35 @@ bool FIXFAM::AllocateBuffer(PGLOBAL g) if (Tdbp->GetFtype() == RECFM_BIN) { // The buffer must be prepared depending on column types int n = 0; + bool b = false; PDOSDEF defp = (PDOSDEF)Tdbp->GetDef(); - PCOLDEF cdp; +// PCOLDEF cdp; + PBINCOL colp; // Prepare the first line of the buffer memset(To_Buf, 0, Buflen); +#if 0 for (cdp = defp->GetCols(); cdp; cdp = cdp->GetNext()) { - if (IsTypeNum(cdp->GetType())) - memset(To_Buf + cdp->GetOffset(), ' ', cdp->GetClen()); + if (!IsTypeNum(cdp->GetType())) { + memset(To_Buf + cdp->GetOffset(), ' ', cdp->GetClen()); + b = true; + } // endif not num - n = MY_MAX(n, cdp->GetPoff() + cdp->GetClen()); + n = MY_MAX(n, cdp->GetOffset() + cdp->GetClen()); } // endfor cdp +#endif // 0 + + for (colp = (PBINCOL)Tdbp->GetColumns(); colp; + colp = (PBINCOL)colp->GetNext()) + if (!colp->IsSpecial()) { + if (!IsTypeNum(colp->GetResultType())) { + memset(To_Buf + colp->GetDeplac(), ' ', colp->GetLength()); + b = true; + } // endif not num + + n = MY_MAX(n, colp->GetDeplac() + colp->GetFileSize()); + } // endif !special // We do this for binary table because the lrecl can have been // specified with additional space to include line ending. @@ -156,9 +174,10 @@ bool FIXFAM::AllocateBuffer(PGLOBAL g) } // endif n - // Now repeat this for the whole buffer - for (int len = Lrecl; len <= Buflen - Lrecl; len += Lrecl) - memcpy(To_Buf + len, To_Buf, Lrecl); + if (b) + // Now repeat this for the whole buffer + for (int len = Lrecl; len <= Buflen - Lrecl; len += Lrecl) + memcpy(To_Buf + len, To_Buf, Lrecl); } else { memset(To_Buf, ' ', Buflen); diff --git a/storage/connect/global.h b/storage/connect/global.h index a67bb605755..10564d09815 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -118,7 +118,7 @@ extern "C" { /* Static variables */ /***********************************************************************/ #if defined(STORAGE) - char sys_stamp[4] = SYS_STAMP; + char sys_stamp[5] = SYS_STAMP; #else extern char sys_stamp[]; #endif diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 72f48d72bb1..964185b1b27 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -153,6 +153,7 @@ #endif // LIBXML2_SUPPORT #include "taboccur.h" #include "tabpivot.h" +#include "tabfix.h" #define my_strupr(p) my_caseup_str(default_charset_info, (p)); #define my_strlwr(p) my_casedn_str(default_charset_info, (p)); @@ -656,6 +657,7 @@ static int connect_init_func(void *p) sql_print_information("connect_init: hton=%p", p); DTVAL::SetTimeShift(); // Initialize time zone shift once for all + BINCOL::SetEndian(); // Initialize host endian setting DBUG_RETURN(0); } // end of connect_init_func diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index c3eb58a2260..1e597f751ca 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -1,1162 +1,1162 @@ -/*************** json CPP Declares Source Code File (.H) ***************/ -/* Name: json.cpp Version 1.1 */ -/* */ -/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ -/* */ -/* This file contains the JSON classes functions. */ -/***********************************************************************/ - -/***********************************************************************/ -/* Include relevant sections of the MariaDB header file. */ -/***********************************************************************/ -#include - -/***********************************************************************/ -/* Include application header files: */ -/* global.h is header containing all global declarations. */ -/* plgdbsem.h is header containing the DB application declarations. */ -/* xjson.h is header containing the JSON classes declarations. */ -/***********************************************************************/ -#include "global.h" -#include "plgdbsem.h" -#include "json.h" - -#define ARGS MY_MIN(24,len-i),s+MY_MAX(i-3,0) - -#if defined(WIN32) -#define EL "\r\n" -#else -#define EL "\n" -#endif - -/***********************************************************************/ -/* Parse a json string. */ -/***********************************************************************/ -PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) -{ - int i, rc; - bool b = false; - PJSON jsp = NULL; - STRG src; - - if (!s || !len) { - strcpy(g->Message, "Void JSON object"); - return NULL; - } else if (comma) - *comma = false; - - src.str = s; - src.len = len; - - // Save stack and allocation environment and prepare error return - if (g->jump_level == MAX_JUMP) { - strcpy(g->Message, MSG(TOO_MANY_JUMPS)); - return NULL; - } // endif jump_level - - if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { - goto err; - } // endif rc - - for (i = 0; i < len; i++) - switch (s[i]) { - case '[': - if (jsp) { - strcpy(g->Message, "More than one item in file"); - goto err; - } else if (!(jsp = ParseArray(g, ++i, src))) - goto err; - - break; - case '{': - if (jsp) { - strcpy(g->Message, "More than one item in file"); - goto err; - } else if (!(jsp = ParseObject(g, ++i, src))) - goto err; - - break; - case ' ': - case '\t': - case '\n': - case '\r': - break; - case ',': - if (jsp && pretty == 1) { - if (comma) - *comma = true; - - break; - } // endif pretty - - sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty); - goto err; - case '"': - if (!(jsp = ParseValue(g, i, src))) - goto err; - - break; - case '(': - b = true; - break; - case ')': - if (b) { - b = false; - break; - } // endif b - - default: - sprintf(g->Message, "Bad '%c' character near %.*s", - s[i], ARGS); - goto err; - }; // endswitch s[i] - - if (!jsp) - sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); - - g->jump_level--; - return jsp; - - err: - g->jump_level--; - return NULL; -} // end of ParseJson - -/***********************************************************************/ -/* Parse a JSON Array. */ -/***********************************************************************/ -PJAR ParseArray(PGLOBAL g, int& i, STRG& src) -{ - char *s = src.str; - int len = src.len; - int level = 0; - PJAR jarp = new(g) JARRAY; - PJVAL jvp = NULL; - - for (; i < len; i++) - switch (s[i]) { - case ',': - if (level < 2) { - sprintf(g->Message, "Unexpected ',' near %.*s",ARGS); - return NULL; - } else - level = 1; - - break; - case ']': - if (level == 1) { - sprintf(g->Message, "Unexpected ',]' near %.*s", ARGS); - return NULL; - } // endif level - - jarp->InitArray(g); - return jarp; - case ' ': - case '\t': - case '\n': - case '\r': - break; - default: - if (level == 2) { - sprintf(g->Message, "Unexpected value near %.*s", ARGS); - return NULL; - } else if ((jvp = ParseValue(g, i, src))) { - jarp->AddValue(g, jvp); - level = 2; - } else - return NULL; - - level = 2; - break; - }; // endswitch s[i] - - strcpy(g->Message, "Unexpected EOF in array"); - return NULL; -} // end of ParseArray - -/***********************************************************************/ -/* Parse a JSON Object. */ -/***********************************************************************/ -PJOB ParseObject(PGLOBAL g, int& i, STRG& src) -{ - PSZ key; - char *s = src.str; - int len = src.len; - int level = 0; - PJOB jobp = new(g) JOBJECT; - PJPR jpp = NULL; - - for (; i < len; i++) - switch (s[i]) { - case '"': - if (level < 2) { - if ((key = ParseString(g, ++i, src))) { - jpp = jobp->AddPair(g, key); - level = 1; - } else - return NULL; - - } else { - sprintf(g->Message, "misplaced string near %.*s", ARGS); - return NULL; - } // endif level - - break; - case ':': - if (level == 1) { - if (!(jpp->Val = ParseValue(g, ++i, src))) - return NULL; - - level = 2; - } else { - sprintf(g->Message, "Unexpected ':' near %.*s", ARGS); - return NULL; - } // endif level - - break; - case ',': - if (level < 2) { - sprintf(g->Message, "Unexpected ',' near %.*s", ARGS); - return NULL; - } else - level = 1; - - break; - case '}': - if (level == 1) { - sprintf(g->Message, "Unexpected '}' near %.*s", ARGS); - return NULL; - } // endif level - - return jobp; - case ' ': - case '\t': - case '\n': - case '\r': - break; - default: - sprintf(g->Message, "Unexpected character '%c' near %.*s", - s[i], ARGS); - return NULL; - }; // endswitch s[i] - - strcpy(g->Message, "Unexpected EOF in Object"); - return NULL; -} // end of ParseObject - -/***********************************************************************/ -/* Parse a JSON Value. */ -/***********************************************************************/ -PJVAL ParseValue(PGLOBAL g, int& i, STRG& src) -{ - char *strval, *s = src.str; - int n, len = src.len; - PJVAL jvp = new(g) JVALUE; - - for (; i < len; i++) - switch (s[i]) { - case ' ': - case '\t': - case '\n': - case '\r': - break; - default: - goto suite; - } // endswitch - - suite: - switch (s[i]) { - case '[': - if (!(jvp->Jsp = ParseArray(g, ++i, src))) - return NULL; - - break; - case '{': - if (!(jvp->Jsp = ParseObject(g, ++i, src))) - return NULL; - - break; - case '"': - if ((strval = ParseString(g, ++i, src))) - jvp->Value = AllocateValue(g, strval, TYPE_STRING); - else - return NULL; - - break; - case 't': - if (!strncmp(s + i, "true", 4)) { - n = 1; - jvp->Value = AllocateValue(g, &n, TYPE_TINY); - i += 3; - } else - goto err; - - break; - case 'f': - if (!strncmp(s + i, "false", 5)) { - n = 0; - jvp->Value = AllocateValue(g, &n, TYPE_TINY); - i += 4; - } else - goto err; - - break; - case 'n': - if (!strncmp(s + i, "null", 4)) - i += 3; - else - goto err; - - break; - case '-': - default: - if (s[i] == '-' || isdigit(s[i])) { - if (!(jvp->Value = ParseNumeric(g, i, src))) - goto err; - - } else - goto err; - - }; // endswitch s[i] - - jvp->Size = 1; - return jvp; - -err: - sprintf(g->Message, "Unexpected character '%c' near %.*s", - s[i], ARGS); - return NULL; -} // end of ParseValue - -/***********************************************************************/ -/* Unescape and parse a JSON string. */ -/***********************************************************************/ -char *ParseString(PGLOBAL g, int& i, STRG& src) -{ - char *s = src.str; - uchar *p; - int n = 0, len = src.len; - - // Be sure of memory availability - if (len + 1 - i > (signed)((PPOOLHEADER)g->Sarea)->FreeBlk) { - strcpy(g->Message, "ParseString: Out of memory"); - return NULL; - } // endif len - - // The size to allocate is not known yet - p = (uchar*)PlugSubAlloc(g, NULL, 0); - - for (; i < len; i++) - switch (s[i]) { - case '"': - p[n++] = 0; - PlugSubAlloc(g, NULL, n); - return (char*)p; - case '\\': - if (++i < len) { - if (s[i] == 'u') { - if (len - i > 5) { -// if (charset == utf8) { - char xs[5]; - uint hex; - - xs[0] = s[++i]; - xs[1] = s[++i]; - xs[2] = s[++i]; - xs[3] = s[++i]; - xs[4] = 0; - hex = strtoul(xs, NULL, 16); - - if (hex < 0x80) { - p[n] = (uchar)hex; - } else if (hex < 0x800) { - p[n++] = (uchar)(0xC0 | (hex >> 6)); - p[n] = (uchar)(0x80 | (hex & 0x3F)); - } else if (hex < 0x10000) { - p[n++] = (uchar)(0xE0 | (hex >> 12)); - p[n++] = (uchar)(0x80 | ((hex >> 6) & 0x3f)); - p[n] = (uchar)(0x80 | (hex & 0x3f)); - } else - p[n] = '?'; - -#if 0 - } else { - char xs[3]; - UINT hex; - - i += 2; - xs[0] = s[++i]; - xs[1] = s[++i]; - xs[2] = 0; - hex = strtoul(xs, NULL, 16); - p[n] = (char)hex; - } // endif charset -#endif // 0 - } else - goto err; - - } else switch(s[i]) { - case 't': p[n] = '\t'; break; - case 'n': p[n] = '\n'; break; - case 'r': p[n] = '\r'; break; - case 'b': p[n] = '\b'; break; - case 'f': p[n] = '\f'; break; - default: p[n] = s[i]; break; - } // endswitch - - n++; - } else - goto err; - - break; - default: - p[n++] = s[i]; - break; - }; // endswitch s[i] - - err: - strcpy(g->Message, "Unexpected EOF in String"); - return NULL; -} // end of ParseString - -/***********************************************************************/ -/* Parse a JSON numeric value. */ -/***********************************************************************/ -PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src) -{ - char *s = src.str, buf[50]; - int n = 0, len = src.len; - short nd = 0; - bool has_dot = false; - bool has_e = false; - bool found_digit = false; - PVAL valp = NULL; - - for (; i < len; i++) { - switch (s[i]) { - case '.': - if (!found_digit || has_dot || has_e) - goto err; - - has_dot = true; - break; - case 'e': - case 'E': - if (!found_digit || has_e) - goto err; - - has_e = true; - found_digit = false; - break; - case '+': - if (!has_e) - goto err; - - // passthru - case '-': - if (found_digit) - goto err; - - break; - default: - if (isdigit(s[i])) { - if (has_dot && !has_e) - nd++; // Number of decimals - - found_digit = true; - } else - goto fin; - - }; // endswitch s[i] - - buf[n++] = s[i]; - } // endfor i - - fin: - if (found_digit) { - buf[n] = 0; - - if (has_dot || has_e) { - double dv = strtod(buf, NULL); - - valp = AllocateValue(g, &dv, TYPE_DOUBLE, nd); - } else { - int iv = strtol(buf, NULL, 10); - - valp = AllocateValue(g, &iv, TYPE_INT); - } // endif has - - i--; // Unstack following character - return valp; - } else { - strcpy(g->Message, "No digit found"); - return NULL; - } // endif found_digit - - err: - strcpy(g->Message, "Unexpected EOF in number"); - return NULL; -} // end of ParseNumeric - -/***********************************************************************/ -/* Serialize a JSON tree: */ -/***********************************************************************/ -PSZ Serialize(PGLOBAL g, PJSON jsp, FILE *fs, int pretty) -{ - bool b = false, err = true; - JOUT *jp; - - g->Message[0] = 0; - - if (!jsp) { - strcpy(g->Message, "Null json tree"); - return NULL; - } else if (!fs) { - // Serialize to a string - jp = new(g) JOUTSTR(g); - b = pretty == 1; - } else if (pretty == 2) { - // Serialize to a pretty file - jp = new(g) JOUTPRT(g, fs); - } else { - // Serialize to a flat file - jp = new(g) JOUTFILE(g, fs); - b = pretty == 1; - } // endif's - - switch (jsp->GetType()) { - case TYPE_JAR: - err = SerializeArray(jp, (PJAR)jsp, b); - break; - case TYPE_JOB: - err = (b && jp->WriteChr('\t')); - err |= SerializeObject(jp, (PJOB)jsp); - break; - case TYPE_JVAL: - err = SerializeValue(jp, (PJVAL)jsp); - break; - default: - strcpy(g->Message, "Invalid json tree"); - } // endswitch Type - - if (fs) { - fputc('\n', fs); - fclose(fs); - return (err) ? g->Message : NULL; - } else if (!err) { - PSZ str = ((JOUTSTR*)jp)->Strp; - - jp->WriteChr('\0'); - PlugSubAlloc(g, NULL, ((JOUTSTR*)jp)->N); - return str; - } else { - if (!g->Message[0]) - strcpy(g->Message, "Error in Serialize"); - - return NULL; - } // endif's - -} // end of Serialize - -/***********************************************************************/ -/* Serialize a JSON Array. */ -/***********************************************************************/ -bool SerializeArray(JOUT *js, PJAR jarp, bool b) -{ - bool first = true; - - - if (js->WriteChr('[')) - return true; - else if (b && (js->WriteStr(EL) || js->WriteChr('\t'))) - return true; - - for (int i = 0; i < jarp->size(); i++) { - if (first) - first = false; - else if (js->WriteChr(',')) - return true; - else if (b && (js->WriteStr(EL) || js->WriteChr('\t'))) - return true; - - if (SerializeValue(js, jarp->GetValue(i))) - return true; - - } // endfor i - - if (b && js->WriteStr(EL)) - return true; - - return js->WriteChr(']'); -} // end of SerializeArray - -/***********************************************************************/ -/* Serialize a JSON Object. */ -/***********************************************************************/ -bool SerializeObject(JOUT *js, PJOB jobp) -{ - bool first = true; - - if (js->WriteChr('{')) - return true; - - for (PJPR pair = jobp->First; pair; pair = pair->Next) { - if (first) - first = false; - else if (js->WriteChr(',')) - return true; - - if (js->WriteChr('"') || - js->WriteStr(pair->Key) || - js->WriteChr('"') || - js->WriteChr(':') || - SerializeValue(js, pair->Val)) - return true; - - } // endfor i - - return js->WriteChr('}'); -} // end of SerializeObject - -/***********************************************************************/ -/* Serialize a JSON Value. */ -/***********************************************************************/ -bool SerializeValue(JOUT *js, PJVAL jvp) -{ - PJAR jap; - PJOB jop; - PVAL valp; - - if ((jap = jvp->GetArray())) - return SerializeArray(js, jap, false); - else if ((jop = jvp->GetObject())) - return SerializeObject(js, jop); - else if (!(valp = jvp->Value) || valp->IsNull()) - return js->WriteStr("null"); - else switch (valp->GetType()) { - case TYPE_TINY: - return js->WriteStr(valp->GetTinyValue() ? "true" : "false"); - case TYPE_STRING: - return js->Escape(valp->GetCharValue()); - default: - if (valp->IsTypeNum()) { - char buf[32]; - - return js->WriteStr(valp->GetCharString(buf)); - } // endif valp - - } // endswitch Type - -strcpy(js->g->Message, "Unrecognized value"); -return true; -} // end of SerializeValue - -/* -------------------------- Class JOUTSTR -------------------------- */ - -/***********************************************************************/ -/* JOUTSTR constructor. */ -/***********************************************************************/ -JOUTSTR::JOUTSTR(PGLOBAL g) : JOUT(g) -{ - PPOOLHEADER pph = (PPOOLHEADER)g->Sarea; - - N = 0; - Max = pph->FreeBlk; - Max = (Max > 32) ? Max - 32 : Max; - Strp = (char*)PlugSubAlloc(g, NULL, 0); // Size not know yet -} // end of JOUTSTR constructor - -/***********************************************************************/ -/* Concatenate a string to the Serialize string. */ -/***********************************************************************/ -bool JOUTSTR::WriteStr(const char *s) -{ - if (s) { - size_t len = strlen(s); - - if (N + len > Max) - return true; - - memcpy(Strp + N, s, len); - N += len; - return false; - } else - return true; - -} // end of WriteStr - -/***********************************************************************/ -/* Concatenate a character to the Serialize string. */ -/***********************************************************************/ -bool JOUTSTR::WriteChr(const char c) -{ - if (N + 1 > Max) - return true; - - Strp[N++] = c; - return false; -} // end of WriteChr - -/***********************************************************************/ -/* Escape and Concatenate a string to the Serialize string. */ -/***********************************************************************/ -bool JOUTSTR::Escape(const char *s) -{ - WriteChr('"'); - - for (unsigned int i = 0; i < strlen(s); i++) - switch (s[i]) { - case '"': - case '\\': - case '\t': - case '\n': - case '\r': - case '\b': - case '\f': WriteChr('\\'); - // passthru - default: - WriteChr(s[i]); - break; - } // endswitch s[i] - - WriteChr('"'); - return false; -} // end of Escape - -/* ------------------------- Class JOUTFILE -------------------------- */ - -/***********************************************************************/ -/* Write a string to the Serialize file. */ -/***********************************************************************/ -bool JOUTFILE::WriteStr(const char *s) -{ - // This is temporary - fputs(s, Stream); - return false; -} // end of WriteStr - -/***********************************************************************/ -/* Write a character to the Serialize file. */ -/***********************************************************************/ -bool JOUTFILE::WriteChr(const char c) -{ - // This is temporary - fputc(c, Stream); - return false; -} // end of WriteChr - -/***********************************************************************/ -/* Escape and Concatenate a string to the Serialize string. */ -/***********************************************************************/ -bool JOUTFILE::Escape(const char *s) -{ - // This is temporary - fputc('"', Stream); - - for (unsigned int i = 0; i < strlen(s); i++) - switch (s[i]) { - case '"': fputs("\\\"", Stream); break; - case '\\': fputs("\\\\", Stream); break; - case '\t': fputs("\\t", Stream); break; - case '\n': fputs("\\n", Stream); break; - case '\r': fputs("\\r", Stream); break; - case '\b': fputs("\\b", Stream); break; - case '\f': fputs("\\f", Stream); break; - default: - fputc(s[i], Stream); - break; - } // endswitch s[i] - - fputc('"', Stream); - return false; -} // end of Escape - -/* ------------------------- Class JOUTPRT --------------------------- */ - -/***********************************************************************/ -/* Write a string to the Serialize pretty file. */ -/***********************************************************************/ -bool JOUTPRT::WriteStr(const char *s) -{ - // This is temporary - if (B) { - fputs(EL, Stream); - M--; - - for (int i = 0; i < M; i++) - fputc('\t', Stream); - - B = false; - } // endif B - - fputs(s, Stream); - return false; -} // end of WriteStr - -/***********************************************************************/ -/* Write a character to the Serialize pretty file. */ -/***********************************************************************/ -bool JOUTPRT::WriteChr(const char c) -{ - switch (c) { - case ':': - fputs(": ", Stream); - break; - case '{': - case '[': -#if 0 - if (M) - fputs(EL, Stream); - - for (int i = 0; i < M; i++) - fputc('\t', Stream); -#endif // 0 - - fputc(c, Stream); - fputs(EL, Stream); - M++; - - for (int i = 0; i < M; i++) - fputc('\t', Stream); - - break; - case '}': - case ']': - M--; - fputs(EL, Stream); - - for (int i = 0; i < M; i++) - fputc('\t', Stream); - - fputc(c, Stream); - B = true; - break; - case ',': - fputc(c, Stream); - fputs(EL, Stream); - - for (int i = 0; i < M; i++) - fputc('\t', Stream); - - B = false; - break; - default: - fputc(c, Stream); - } // endswitch c - -return false; -} // end of WriteChr - -/* -------------------------- Class JOBJECT -------------------------- */ - -/***********************************************************************/ -/* Add a new pair to an Object. */ -/***********************************************************************/ -PJPR JOBJECT::AddPair(PGLOBAL g, PSZ key) -{ - PJPR jpp = new(g) JPAIR(key); - - if (Last) - Last->Next = jpp; - else - First = jpp; - - Last = jpp; - Size++; - return jpp; -} // end of AddPair - -/***********************************************************************/ -/* Get the value corresponding to the given key. */ -/***********************************************************************/ -PJVAL JOBJECT::GetValue(const char* key) -{ - for (PJPR jp = First; jp; jp = jp->Next) - if (!strcmp(jp->Key, key)) - return jp->Val; - - return NULL; -} // end of GetValue; - -/***********************************************************************/ -/* Return the text corresponding to all keys (XML like). */ -/***********************************************************************/ -PSZ JOBJECT::GetText(PGLOBAL g, PSZ text) -{ - int n; - - if (!text) { - text = (char*)PlugSubAlloc(g, NULL, 0); - text[0] = 0; - n = 1; - } else - n = 0; - - if (!First && n) - return NULL; - else for (PJPR jp = First; jp; jp = jp->Next) - jp->Val->GetText(g, text); - - if (n) - PlugSubAlloc(g, NULL, strlen(text) + 1); - - return text + n; -} // end of GetValue; - -/***********************************************************************/ -/* Set or add a value corresponding to the given key. */ -/***********************************************************************/ -void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key) -{ - PJPR jp; - - for (jp = First; jp; jp = jp->Next) - if (!strcmp(jp->Key, key)) { - jp->Val = jvp; - break; - } // endif key - - if (!jp) { - jp = AddPair(g, key); - jp->Val = jvp; - } // endif jp - -} // end of SetValue - -/***********************************************************************/ -/* True if void or if all members are nulls. */ -/***********************************************************************/ -bool JOBJECT::IsNull(void) -{ - for (PJPR jp = First; jp; jp = jp->Next) - if (!jp->Val->IsNull()) - return false; - - return true; -} // end of IsNull - -/* -------------------------- Class JARRAY --------------------------- */ - -/***********************************************************************/ -/* Make the array of values from the values list. */ -/***********************************************************************/ -void JARRAY::InitArray(PGLOBAL g) -{ - int i; - PJVAL jvp; - - for (Size = 0, jvp = First; jvp; jvp = jvp->Next) - if (!jvp->Del) - Size++; - - if (!Size) { - return; - } else if (Size > Alloc) { - // No need to realloc after deleting values - Mvals = (PJVAL*)PlugSubAlloc(g, NULL, Size * sizeof(PJVAL)); - Alloc = Size; - } // endif Size - - for (i = 0, jvp = First; jvp; jvp = jvp->Next) - if (!jvp->Del) - Mvals[i++] = jvp; - -} // end of InitArray - -/***********************************************************************/ -/* Get the Nth value of an Array. */ -/***********************************************************************/ -PJVAL JARRAY::GetValue(int i) -{ - if (Mvals && i >= 0 && i < Size) - return Mvals[i]; - else - return NULL; -} // end of GetValue - -/***********************************************************************/ -/* Add a Value to the Arrays Value list. */ -/***********************************************************************/ -PJVAL JARRAY::AddValue(PGLOBAL g, PJVAL jvp) -{ - if (!jvp) - jvp = new(g) JVALUE; - - if (Last) - Last->Next = jvp; - else - First = jvp; - - Last = jvp; - return jvp; -} // end of AddValue - -/***********************************************************************/ -/* Add a Value to the Arrays Value list. */ -/***********************************************************************/ -bool JARRAY::SetValue(PGLOBAL g, PJVAL jvp, int n) -{ - int i = 0; - PJVAL jp, *jpp = &First; - - for (i = 0, jp = First; i < n; i++, jp = *(jpp = &jp->Next)) - if (!jp) - *jpp = jp = new(g) JVALUE; - - *jpp = jvp; - jvp->Next = (jp ? jp->Next : NULL); - return false; -} // end of SetValue - -/***********************************************************************/ -/* Delete a Value from the Arrays Value list. */ -/***********************************************************************/ -bool JARRAY::DeleteValue(int n) -{ - PJVAL jvp = GetValue(n); - - if (jvp) { - jvp->Del = true; - return false; - } else - return true; - -} // end of DeleteValue - -/***********************************************************************/ -/* True if void or if all members are nulls. */ -/***********************************************************************/ -bool JARRAY::IsNull(void) -{ - for (int i = 0; i < Size; i++) - if (!Mvals[i]->IsNull()) - return false; - - return true; -} // end of IsNull - -/* -------------------------- Class JVALUE- -------------------------- */ - -/***********************************************************************/ -/* Constructor for a Value with a given string or numeric value. */ -/***********************************************************************/ -JVALUE::JVALUE(PGLOBAL g, PVAL valp) : JSON() -{ - Jsp = NULL; - Value = AllocateValue(g, valp); - Next = NULL; - Del = false; -} // end of JVALUE constructor - -/***********************************************************************/ -/* Returns the type of the Value's value. */ -/***********************************************************************/ -JTYP JVALUE::GetValType(void) -{ - if (Jsp) - return Jsp->GetType(); - else if (Value) - return (JTYP)Value->GetType(); - else - return (JTYP)TYPE_VOID; - -} // end of GetValType - -/***********************************************************************/ -/* Return the Value's Object value. */ -/***********************************************************************/ -PJOB JVALUE::GetObject(void) -{ - if (Jsp && Jsp->GetType() == TYPE_JOB) - return (PJOB)Jsp; - - return NULL; -} // end of GetObject - -/***********************************************************************/ -/* Return the Value's Array value. */ -/***********************************************************************/ -PJAR JVALUE::GetArray(void) -{ - if (Jsp && Jsp->GetType() == TYPE_JAR) - return (PJAR)Jsp; - - return NULL; -} // end of GetArray - -/***********************************************************************/ -/* Return the Value's Integer value. */ -/***********************************************************************/ -int JVALUE::GetInteger(void) -{ - return (Value) ? Value->GetIntValue() : 0; -} // end of GetInteger - -/***********************************************************************/ -/* Return the Value's Double value. */ -/***********************************************************************/ -double JVALUE::GetFloat(void) -{ - return (Value) ? Value->GetFloatValue() : 0.0; -} // end of GetFloat - -/***********************************************************************/ -/* Return the Value's String value. */ -/***********************************************************************/ -PSZ JVALUE::GetString(void) -{ - char buf[32]; - return (Value) ? Value->GetCharString(buf) : NULL; -} // end of GetString - -/***********************************************************************/ -/* Return the Value's String value. */ -/***********************************************************************/ -PSZ JVALUE::GetText(PGLOBAL g, PSZ text) -{ - if (Jsp && Jsp->GetType() == TYPE_JOB) - return Jsp->GetText(g, text); - - char buf[32]; - PSZ s = (Value) ? Value->GetCharString(buf) : NULL; - - if (s) - strcat(strcat(text, " "), s); - else - strcat(text, " ???"); - - return text; -} // end of GetText - -/***********************************************************************/ -/* Set the Value's value as the given integer. */ -/***********************************************************************/ -void JVALUE::SetInteger(PGLOBAL g, int n) -{ - Value = AllocateValue(g, &n, TYPE_INT); -} // end of AddInteger - -/***********************************************************************/ -/* Set the Value's value as the given DOUBLE. */ -/***********************************************************************/ -void JVALUE::SetFloat(PGLOBAL g, double f) -{ - Value = AllocateValue(g, &f, TYPE_DOUBLE, 6); -} // end of AddFloat - -/***********************************************************************/ -/* Set the Value's value as the given string. */ -/***********************************************************************/ -void JVALUE::SetString(PGLOBAL g, PSZ s) -{ - Value = AllocateValue(g, s, TYPE_STRING); -} // end of AddFloat - -/***********************************************************************/ -/* True when its JSON or normal value is null. */ -/***********************************************************************/ -bool JVALUE::IsNull(void) -{ - return (Jsp) ? Jsp->IsNull() : (Value) ? Value->IsZero() : true; -} // end of IsNull - +/*************** json CPP Declares Source Code File (.H) ***************/ +/* Name: json.cpp Version 1.1 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ +/* */ +/* This file contains the JSON classes functions. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Include relevant sections of the MariaDB header file. */ +/***********************************************************************/ +#include + +/***********************************************************************/ +/* Include application header files: */ +/* global.h is header containing all global declarations. */ +/* plgdbsem.h is header containing the DB application declarations. */ +/* xjson.h is header containing the JSON classes declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "json.h" + +#define ARGS MY_MIN(24,len-i),s+MY_MAX(i-3,0) + +#if defined(WIN32) +#define EL "\r\n" +#else +#define EL "\n" +#endif + +/***********************************************************************/ +/* Parse a json string. */ +/***********************************************************************/ +PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) +{ + int i, rc; + bool b = false; + PJSON jsp = NULL; + STRG src; + + if (!s || !len) { + strcpy(g->Message, "Void JSON object"); + return NULL; + } else if (comma) + *comma = false; + + src.str = s; + src.len = len; + + // Save stack and allocation environment and prepare error return + if (g->jump_level == MAX_JUMP) { + strcpy(g->Message, MSG(TOO_MANY_JUMPS)); + return NULL; + } // endif jump_level + + if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { + goto err; + } // endif rc + + for (i = 0; i < len; i++) + switch (s[i]) { + case '[': + if (jsp) { + strcpy(g->Message, "More than one item in file"); + goto err; + } else if (!(jsp = ParseArray(g, ++i, src))) + goto err; + + break; + case '{': + if (jsp) { + strcpy(g->Message, "More than one item in file"); + goto err; + } else if (!(jsp = ParseObject(g, ++i, src))) + goto err; + + break; + case ' ': + case '\t': + case '\n': + case '\r': + break; + case ',': + if (jsp && pretty == 1) { + if (comma) + *comma = true; + + break; + } // endif pretty + + sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty); + goto err; + case '"': + if (!(jsp = ParseValue(g, i, src))) + goto err; + + break; + case '(': + b = true; + break; + case ')': + if (b) { + b = false; + break; + } // endif b + + default: + sprintf(g->Message, "Bad '%c' character near %.*s", + s[i], ARGS); + goto err; + }; // endswitch s[i] + + if (!jsp) + sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); + + g->jump_level--; + return jsp; + + err: + g->jump_level--; + return NULL; +} // end of ParseJson + +/***********************************************************************/ +/* Parse a JSON Array. */ +/***********************************************************************/ +PJAR ParseArray(PGLOBAL g, int& i, STRG& src) +{ + char *s = src.str; + int len = src.len; + int level = 0; + PJAR jarp = new(g) JARRAY; + PJVAL jvp = NULL; + + for (; i < len; i++) + switch (s[i]) { + case ',': + if (level < 2) { + sprintf(g->Message, "Unexpected ',' near %.*s",ARGS); + return NULL; + } else + level = 1; + + break; + case ']': + if (level == 1) { + sprintf(g->Message, "Unexpected ',]' near %.*s", ARGS); + return NULL; + } // endif level + + jarp->InitArray(g); + return jarp; + case ' ': + case '\t': + case '\n': + case '\r': + break; + default: + if (level == 2) { + sprintf(g->Message, "Unexpected value near %.*s", ARGS); + return NULL; + } else if ((jvp = ParseValue(g, i, src))) { + jarp->AddValue(g, jvp); + level = 2; + } else + return NULL; + + level = 2; + break; + }; // endswitch s[i] + + strcpy(g->Message, "Unexpected EOF in array"); + return NULL; +} // end of ParseArray + +/***********************************************************************/ +/* Parse a JSON Object. */ +/***********************************************************************/ +PJOB ParseObject(PGLOBAL g, int& i, STRG& src) +{ + PSZ key; + char *s = src.str; + int len = src.len; + int level = 0; + PJOB jobp = new(g) JOBJECT; + PJPR jpp = NULL; + + for (; i < len; i++) + switch (s[i]) { + case '"': + if (level < 2) { + if ((key = ParseString(g, ++i, src))) { + jpp = jobp->AddPair(g, key); + level = 1; + } else + return NULL; + + } else { + sprintf(g->Message, "misplaced string near %.*s", ARGS); + return NULL; + } // endif level + + break; + case ':': + if (level == 1) { + if (!(jpp->Val = ParseValue(g, ++i, src))) + return NULL; + + level = 2; + } else { + sprintf(g->Message, "Unexpected ':' near %.*s", ARGS); + return NULL; + } // endif level + + break; + case ',': + if (level < 2) { + sprintf(g->Message, "Unexpected ',' near %.*s", ARGS); + return NULL; + } else + level = 1; + + break; + case '}': + if (level == 1) { + sprintf(g->Message, "Unexpected '}' near %.*s", ARGS); + return NULL; + } // endif level + + return jobp; + case ' ': + case '\t': + case '\n': + case '\r': + break; + default: + sprintf(g->Message, "Unexpected character '%c' near %.*s", + s[i], ARGS); + return NULL; + }; // endswitch s[i] + + strcpy(g->Message, "Unexpected EOF in Object"); + return NULL; +} // end of ParseObject + +/***********************************************************************/ +/* Parse a JSON Value. */ +/***********************************************************************/ +PJVAL ParseValue(PGLOBAL g, int& i, STRG& src) +{ + char *strval, *s = src.str; + int n, len = src.len; + PJVAL jvp = new(g) JVALUE; + + for (; i < len; i++) + switch (s[i]) { + case ' ': + case '\t': + case '\n': + case '\r': + break; + default: + goto suite; + } // endswitch + + suite: + switch (s[i]) { + case '[': + if (!(jvp->Jsp = ParseArray(g, ++i, src))) + return NULL; + + break; + case '{': + if (!(jvp->Jsp = ParseObject(g, ++i, src))) + return NULL; + + break; + case '"': + if ((strval = ParseString(g, ++i, src))) + jvp->Value = AllocateValue(g, strval, TYPE_STRING); + else + return NULL; + + break; + case 't': + if (!strncmp(s + i, "true", 4)) { + n = 1; + jvp->Value = AllocateValue(g, &n, TYPE_TINY); + i += 3; + } else + goto err; + + break; + case 'f': + if (!strncmp(s + i, "false", 5)) { + n = 0; + jvp->Value = AllocateValue(g, &n, TYPE_TINY); + i += 4; + } else + goto err; + + break; + case 'n': + if (!strncmp(s + i, "null", 4)) + i += 3; + else + goto err; + + break; + case '-': + default: + if (s[i] == '-' || isdigit(s[i])) { + if (!(jvp->Value = ParseNumeric(g, i, src))) + goto err; + + } else + goto err; + + }; // endswitch s[i] + + jvp->Size = 1; + return jvp; + +err: + sprintf(g->Message, "Unexpected character '%c' near %.*s", + s[i], ARGS); + return NULL; +} // end of ParseValue + +/***********************************************************************/ +/* Unescape and parse a JSON string. */ +/***********************************************************************/ +char *ParseString(PGLOBAL g, int& i, STRG& src) +{ + char *s = src.str; + uchar *p; + int n = 0, len = src.len; + + // Be sure of memory availability + if (len + 1 - i > (signed)((PPOOLHEADER)g->Sarea)->FreeBlk) { + strcpy(g->Message, "ParseString: Out of memory"); + return NULL; + } // endif len + + // The size to allocate is not known yet + p = (uchar*)PlugSubAlloc(g, NULL, 0); + + for (; i < len; i++) + switch (s[i]) { + case '"': + p[n++] = 0; + PlugSubAlloc(g, NULL, n); + return (char*)p; + case '\\': + if (++i < len) { + if (s[i] == 'u') { + if (len - i > 5) { +// if (charset == utf8) { + char xs[5]; + uint hex; + + xs[0] = s[++i]; + xs[1] = s[++i]; + xs[2] = s[++i]; + xs[3] = s[++i]; + xs[4] = 0; + hex = strtoul(xs, NULL, 16); + + if (hex < 0x80) { + p[n] = (uchar)hex; + } else if (hex < 0x800) { + p[n++] = (uchar)(0xC0 | (hex >> 6)); + p[n] = (uchar)(0x80 | (hex & 0x3F)); + } else if (hex < 0x10000) { + p[n++] = (uchar)(0xE0 | (hex >> 12)); + p[n++] = (uchar)(0x80 | ((hex >> 6) & 0x3f)); + p[n] = (uchar)(0x80 | (hex & 0x3f)); + } else + p[n] = '?'; + +#if 0 + } else { + char xs[3]; + UINT hex; + + i += 2; + xs[0] = s[++i]; + xs[1] = s[++i]; + xs[2] = 0; + hex = strtoul(xs, NULL, 16); + p[n] = (char)hex; + } // endif charset +#endif // 0 + } else + goto err; + + } else switch(s[i]) { + case 't': p[n] = '\t'; break; + case 'n': p[n] = '\n'; break; + case 'r': p[n] = '\r'; break; + case 'b': p[n] = '\b'; break; + case 'f': p[n] = '\f'; break; + default: p[n] = s[i]; break; + } // endswitch + + n++; + } else + goto err; + + break; + default: + p[n++] = s[i]; + break; + }; // endswitch s[i] + + err: + strcpy(g->Message, "Unexpected EOF in String"); + return NULL; +} // end of ParseString + +/***********************************************************************/ +/* Parse a JSON numeric value. */ +/***********************************************************************/ +PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src) +{ + char *s = src.str, buf[50]; + int n = 0, len = src.len; + short nd = 0; + bool has_dot = false; + bool has_e = false; + bool found_digit = false; + PVAL valp = NULL; + + for (; i < len; i++) { + switch (s[i]) { + case '.': + if (!found_digit || has_dot || has_e) + goto err; + + has_dot = true; + break; + case 'e': + case 'E': + if (!found_digit || has_e) + goto err; + + has_e = true; + found_digit = false; + break; + case '+': + if (!has_e) + goto err; + + // passthru + case '-': + if (found_digit) + goto err; + + break; + default: + if (isdigit(s[i])) { + if (has_dot && !has_e) + nd++; // Number of decimals + + found_digit = true; + } else + goto fin; + + }; // endswitch s[i] + + buf[n++] = s[i]; + } // endfor i + + fin: + if (found_digit) { + buf[n] = 0; + + if (has_dot || has_e) { + double dv = strtod(buf, NULL); + + valp = AllocateValue(g, &dv, TYPE_DOUBLE, nd); + } else { + int iv = strtol(buf, NULL, 10); + + valp = AllocateValue(g, &iv, TYPE_INT); + } // endif has + + i--; // Unstack following character + return valp; + } else { + strcpy(g->Message, "No digit found"); + return NULL; + } // endif found_digit + + err: + strcpy(g->Message, "Unexpected EOF in number"); + return NULL; +} // end of ParseNumeric + +/***********************************************************************/ +/* Serialize a JSON tree: */ +/***********************************************************************/ +PSZ Serialize(PGLOBAL g, PJSON jsp, FILE *fs, int pretty) +{ + bool b = false, err = true; + JOUT *jp; + + g->Message[0] = 0; + + if (!jsp) { + strcpy(g->Message, "Null json tree"); + return NULL; + } else if (!fs) { + // Serialize to a string + jp = new(g) JOUTSTR(g); + b = pretty == 1; + } else if (pretty == 2) { + // Serialize to a pretty file + jp = new(g) JOUTPRT(g, fs); + } else { + // Serialize to a flat file + jp = new(g) JOUTFILE(g, fs); + b = pretty == 1; + } // endif's + + switch (jsp->GetType()) { + case TYPE_JAR: + err = SerializeArray(jp, (PJAR)jsp, b); + break; + case TYPE_JOB: + err = (b && jp->WriteChr('\t')); + err |= SerializeObject(jp, (PJOB)jsp); + break; + case TYPE_JVAL: + err = SerializeValue(jp, (PJVAL)jsp); + break; + default: + strcpy(g->Message, "Invalid json tree"); + } // endswitch Type + + if (fs) { + fputc('\n', fs); + fclose(fs); + return (err) ? g->Message : NULL; + } else if (!err) { + PSZ str = ((JOUTSTR*)jp)->Strp; + + jp->WriteChr('\0'); + PlugSubAlloc(g, NULL, ((JOUTSTR*)jp)->N); + return str; + } else { + if (!g->Message[0]) + strcpy(g->Message, "Error in Serialize"); + + return NULL; + } // endif's + +} // end of Serialize + +/***********************************************************************/ +/* Serialize a JSON Array. */ +/***********************************************************************/ +bool SerializeArray(JOUT *js, PJAR jarp, bool b) +{ + bool first = true; + + + if (js->WriteChr('[')) + return true; + else if (b && (js->WriteStr(EL) || js->WriteChr('\t'))) + return true; + + for (int i = 0; i < jarp->size(); i++) { + if (first) + first = false; + else if (js->WriteChr(',')) + return true; + else if (b && (js->WriteStr(EL) || js->WriteChr('\t'))) + return true; + + if (SerializeValue(js, jarp->GetValue(i))) + return true; + + } // endfor i + + if (b && js->WriteStr(EL)) + return true; + + return js->WriteChr(']'); +} // end of SerializeArray + +/***********************************************************************/ +/* Serialize a JSON Object. */ +/***********************************************************************/ +bool SerializeObject(JOUT *js, PJOB jobp) +{ + bool first = true; + + if (js->WriteChr('{')) + return true; + + for (PJPR pair = jobp->First; pair; pair = pair->Next) { + if (first) + first = false; + else if (js->WriteChr(',')) + return true; + + if (js->WriteChr('"') || + js->WriteStr(pair->Key) || + js->WriteChr('"') || + js->WriteChr(':') || + SerializeValue(js, pair->Val)) + return true; + + } // endfor i + + return js->WriteChr('}'); +} // end of SerializeObject + +/***********************************************************************/ +/* Serialize a JSON Value. */ +/***********************************************************************/ +bool SerializeValue(JOUT *js, PJVAL jvp) +{ + PJAR jap; + PJOB jop; + PVAL valp; + + if ((jap = jvp->GetArray())) + return SerializeArray(js, jap, false); + else if ((jop = jvp->GetObject())) + return SerializeObject(js, jop); + else if (!(valp = jvp->Value) || valp->IsNull()) + return js->WriteStr("null"); + else switch (valp->GetType()) { + case TYPE_TINY: + return js->WriteStr(valp->GetTinyValue() ? "true" : "false"); + case TYPE_STRING: + return js->Escape(valp->GetCharValue()); + default: + if (valp->IsTypeNum()) { + char buf[32]; + + return js->WriteStr(valp->GetCharString(buf)); + } // endif valp + + } // endswitch Type + +strcpy(js->g->Message, "Unrecognized value"); +return true; +} // end of SerializeValue + +/* -------------------------- Class JOUTSTR -------------------------- */ + +/***********************************************************************/ +/* JOUTSTR constructor. */ +/***********************************************************************/ +JOUTSTR::JOUTSTR(PGLOBAL g) : JOUT(g) +{ + PPOOLHEADER pph = (PPOOLHEADER)g->Sarea; + + N = 0; + Max = pph->FreeBlk; + Max = (Max > 32) ? Max - 32 : Max; + Strp = (char*)PlugSubAlloc(g, NULL, 0); // Size not know yet +} // end of JOUTSTR constructor + +/***********************************************************************/ +/* Concatenate a string to the Serialize string. */ +/***********************************************************************/ +bool JOUTSTR::WriteStr(const char *s) +{ + if (s) { + size_t len = strlen(s); + + if (N + len > Max) + return true; + + memcpy(Strp + N, s, len); + N += len; + return false; + } else + return true; + +} // end of WriteStr + +/***********************************************************************/ +/* Concatenate a character to the Serialize string. */ +/***********************************************************************/ +bool JOUTSTR::WriteChr(const char c) +{ + if (N + 1 > Max) + return true; + + Strp[N++] = c; + return false; +} // end of WriteChr + +/***********************************************************************/ +/* Escape and Concatenate a string to the Serialize string. */ +/***********************************************************************/ +bool JOUTSTR::Escape(const char *s) +{ + WriteChr('"'); + + for (unsigned int i = 0; i < strlen(s); i++) + switch (s[i]) { + case '"': + case '\\': + case '\t': + case '\n': + case '\r': + case '\b': + case '\f': WriteChr('\\'); + // passthru + default: + WriteChr(s[i]); + break; + } // endswitch s[i] + + WriteChr('"'); + return false; +} // end of Escape + +/* ------------------------- Class JOUTFILE -------------------------- */ + +/***********************************************************************/ +/* Write a string to the Serialize file. */ +/***********************************************************************/ +bool JOUTFILE::WriteStr(const char *s) +{ + // This is temporary + fputs(s, Stream); + return false; +} // end of WriteStr + +/***********************************************************************/ +/* Write a character to the Serialize file. */ +/***********************************************************************/ +bool JOUTFILE::WriteChr(const char c) +{ + // This is temporary + fputc(c, Stream); + return false; +} // end of WriteChr + +/***********************************************************************/ +/* Escape and Concatenate a string to the Serialize string. */ +/***********************************************************************/ +bool JOUTFILE::Escape(const char *s) +{ + // This is temporary + fputc('"', Stream); + + for (unsigned int i = 0; i < strlen(s); i++) + switch (s[i]) { + case '"': fputs("\\\"", Stream); break; + case '\\': fputs("\\\\", Stream); break; + case '\t': fputs("\\t", Stream); break; + case '\n': fputs("\\n", Stream); break; + case '\r': fputs("\\r", Stream); break; + case '\b': fputs("\\b", Stream); break; + case '\f': fputs("\\f", Stream); break; + default: + fputc(s[i], Stream); + break; + } // endswitch s[i] + + fputc('"', Stream); + return false; +} // end of Escape + +/* ------------------------- Class JOUTPRT --------------------------- */ + +/***********************************************************************/ +/* Write a string to the Serialize pretty file. */ +/***********************************************************************/ +bool JOUTPRT::WriteStr(const char *s) +{ + // This is temporary + if (B) { + fputs(EL, Stream); + M--; + + for (int i = 0; i < M; i++) + fputc('\t', Stream); + + B = false; + } // endif B + + fputs(s, Stream); + return false; +} // end of WriteStr + +/***********************************************************************/ +/* Write a character to the Serialize pretty file. */ +/***********************************************************************/ +bool JOUTPRT::WriteChr(const char c) +{ + switch (c) { + case ':': + fputs(": ", Stream); + break; + case '{': + case '[': +#if 0 + if (M) + fputs(EL, Stream); + + for (int i = 0; i < M; i++) + fputc('\t', Stream); +#endif // 0 + + fputc(c, Stream); + fputs(EL, Stream); + M++; + + for (int i = 0; i < M; i++) + fputc('\t', Stream); + + break; + case '}': + case ']': + M--; + fputs(EL, Stream); + + for (int i = 0; i < M; i++) + fputc('\t', Stream); + + fputc(c, Stream); + B = true; + break; + case ',': + fputc(c, Stream); + fputs(EL, Stream); + + for (int i = 0; i < M; i++) + fputc('\t', Stream); + + B = false; + break; + default: + fputc(c, Stream); + } // endswitch c + +return false; +} // end of WriteChr + +/* -------------------------- Class JOBJECT -------------------------- */ + +/***********************************************************************/ +/* Add a new pair to an Object. */ +/***********************************************************************/ +PJPR JOBJECT::AddPair(PGLOBAL g, PSZ key) +{ + PJPR jpp = new(g) JPAIR(key); + + if (Last) + Last->Next = jpp; + else + First = jpp; + + Last = jpp; + Size++; + return jpp; +} // end of AddPair + +/***********************************************************************/ +/* Get the value corresponding to the given key. */ +/***********************************************************************/ +PJVAL JOBJECT::GetValue(const char* key) +{ + for (PJPR jp = First; jp; jp = jp->Next) + if (!strcmp(jp->Key, key)) + return jp->Val; + + return NULL; +} // end of GetValue; + +/***********************************************************************/ +/* Return the text corresponding to all keys (XML like). */ +/***********************************************************************/ +PSZ JOBJECT::GetText(PGLOBAL g, PSZ text) +{ + int n; + + if (!text) { + text = (char*)PlugSubAlloc(g, NULL, 0); + text[0] = 0; + n = 1; + } else + n = 0; + + if (!First && n) + return NULL; + else for (PJPR jp = First; jp; jp = jp->Next) + jp->Val->GetText(g, text); + + if (n) + PlugSubAlloc(g, NULL, strlen(text) + 1); + + return text + n; +} // end of GetValue; + +/***********************************************************************/ +/* Set or add a value corresponding to the given key. */ +/***********************************************************************/ +void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key) +{ + PJPR jp; + + for (jp = First; jp; jp = jp->Next) + if (!strcmp(jp->Key, key)) { + jp->Val = jvp; + break; + } // endif key + + if (!jp) { + jp = AddPair(g, key); + jp->Val = jvp; + } // endif jp + +} // end of SetValue + +/***********************************************************************/ +/* True if void or if all members are nulls. */ +/***********************************************************************/ +bool JOBJECT::IsNull(void) +{ + for (PJPR jp = First; jp; jp = jp->Next) + if (!jp->Val->IsNull()) + return false; + + return true; +} // end of IsNull + +/* -------------------------- Class JARRAY --------------------------- */ + +/***********************************************************************/ +/* Make the array of values from the values list. */ +/***********************************************************************/ +void JARRAY::InitArray(PGLOBAL g) +{ + int i; + PJVAL jvp; + + for (Size = 0, jvp = First; jvp; jvp = jvp->Next) + if (!jvp->Del) + Size++; + + if (!Size) { + return; + } else if (Size > Alloc) { + // No need to realloc after deleting values + Mvals = (PJVAL*)PlugSubAlloc(g, NULL, Size * sizeof(PJVAL)); + Alloc = Size; + } // endif Size + + for (i = 0, jvp = First; jvp; jvp = jvp->Next) + if (!jvp->Del) + Mvals[i++] = jvp; + +} // end of InitArray + +/***********************************************************************/ +/* Get the Nth value of an Array. */ +/***********************************************************************/ +PJVAL JARRAY::GetValue(int i) +{ + if (Mvals && i >= 0 && i < Size) + return Mvals[i]; + else + return NULL; +} // end of GetValue + +/***********************************************************************/ +/* Add a Value to the Arrays Value list. */ +/***********************************************************************/ +PJVAL JARRAY::AddValue(PGLOBAL g, PJVAL jvp) +{ + if (!jvp) + jvp = new(g) JVALUE; + + if (Last) + Last->Next = jvp; + else + First = jvp; + + Last = jvp; + return jvp; +} // end of AddValue + +/***********************************************************************/ +/* Add a Value to the Arrays Value list. */ +/***********************************************************************/ +bool JARRAY::SetValue(PGLOBAL g, PJVAL jvp, int n) +{ + int i = 0; + PJVAL jp, *jpp = &First; + + for (i = 0, jp = First; i < n; i++, jp = *(jpp = &jp->Next)) + if (!jp) + *jpp = jp = new(g) JVALUE; + + *jpp = jvp; + jvp->Next = (jp ? jp->Next : NULL); + return false; +} // end of SetValue + +/***********************************************************************/ +/* Delete a Value from the Arrays Value list. */ +/***********************************************************************/ +bool JARRAY::DeleteValue(int n) +{ + PJVAL jvp = GetValue(n); + + if (jvp) { + jvp->Del = true; + return false; + } else + return true; + +} // end of DeleteValue + +/***********************************************************************/ +/* True if void or if all members are nulls. */ +/***********************************************************************/ +bool JARRAY::IsNull(void) +{ + for (int i = 0; i < Size; i++) + if (!Mvals[i]->IsNull()) + return false; + + return true; +} // end of IsNull + +/* -------------------------- Class JVALUE- -------------------------- */ + +/***********************************************************************/ +/* Constructor for a Value with a given string or numeric value. */ +/***********************************************************************/ +JVALUE::JVALUE(PGLOBAL g, PVAL valp) : JSON() +{ + Jsp = NULL; + Value = AllocateValue(g, valp); + Next = NULL; + Del = false; +} // end of JVALUE constructor + +/***********************************************************************/ +/* Returns the type of the Value's value. */ +/***********************************************************************/ +JTYP JVALUE::GetValType(void) +{ + if (Jsp) + return Jsp->GetType(); + else if (Value) + return (JTYP)Value->GetType(); + else + return (JTYP)TYPE_VOID; + +} // end of GetValType + +/***********************************************************************/ +/* Return the Value's Object value. */ +/***********************************************************************/ +PJOB JVALUE::GetObject(void) +{ + if (Jsp && Jsp->GetType() == TYPE_JOB) + return (PJOB)Jsp; + + return NULL; +} // end of GetObject + +/***********************************************************************/ +/* Return the Value's Array value. */ +/***********************************************************************/ +PJAR JVALUE::GetArray(void) +{ + if (Jsp && Jsp->GetType() == TYPE_JAR) + return (PJAR)Jsp; + + return NULL; +} // end of GetArray + +/***********************************************************************/ +/* Return the Value's Integer value. */ +/***********************************************************************/ +int JVALUE::GetInteger(void) +{ + return (Value) ? Value->GetIntValue() : 0; +} // end of GetInteger + +/***********************************************************************/ +/* Return the Value's Double value. */ +/***********************************************************************/ +double JVALUE::GetFloat(void) +{ + return (Value) ? Value->GetFloatValue() : 0.0; +} // end of GetFloat + +/***********************************************************************/ +/* Return the Value's String value. */ +/***********************************************************************/ +PSZ JVALUE::GetString(void) +{ + char buf[32]; + return (Value) ? Value->GetCharString(buf) : NULL; +} // end of GetString + +/***********************************************************************/ +/* Return the Value's String value. */ +/***********************************************************************/ +PSZ JVALUE::GetText(PGLOBAL g, PSZ text) +{ + if (Jsp && Jsp->GetType() == TYPE_JOB) + return Jsp->GetText(g, text); + + char buf[32]; + PSZ s = (Value) ? Value->GetCharString(buf) : NULL; + + if (s) + strcat(strcat(text, " "), s); + else + strcat(text, " ???"); + + return text; +} // end of GetText + +/***********************************************************************/ +/* Set the Value's value as the given integer. */ +/***********************************************************************/ +void JVALUE::SetInteger(PGLOBAL g, int n) +{ + Value = AllocateValue(g, &n, TYPE_INT); +} // end of AddInteger + +/***********************************************************************/ +/* Set the Value's value as the given DOUBLE. */ +/***********************************************************************/ +void JVALUE::SetFloat(PGLOBAL g, double f) +{ + Value = AllocateValue(g, &f, TYPE_DOUBLE, 6); +} // end of AddFloat + +/***********************************************************************/ +/* Set the Value's value as the given string. */ +/***********************************************************************/ +void JVALUE::SetString(PGLOBAL g, PSZ s) +{ + Value = AllocateValue(g, s, TYPE_STRING); +} // end of AddFloat + +/***********************************************************************/ +/* True when its JSON or normal value is null. */ +/***********************************************************************/ +bool JVALUE::IsNull(void) +{ + return (Jsp) ? Jsp->IsNull() : (Value) ? Value->IsZero() : true; +} // end of IsNull + diff --git a/storage/connect/json.h b/storage/connect/json.h index 3684bbddd19..da45157f124 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -1,270 +1,270 @@ -/**************** json H Declares Source Code File (.H) ****************/ -/* Name: json.h Version 1.1 */ -/* */ -/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ -/* */ -/* This file contains the JSON classes declares. */ -/***********************************************************************/ -#include "value.h" - -#if defined(_DEBUG) -#define X assert(false); -#else -#define X -#endif - -enum JTYP {TYPE_STRG = 1, - TYPE_DBL = 2, - TYPE_BOOL = 4, - TYPE_INTG = 7, - TYPE_JSON = 12, - TYPE_JAR, - TYPE_JOB, - TYPE_JVAL}; - -class JOUT; -class JSON; -class JMAP; -class JVALUE; -class JOBJECT; -class JARRAY; - -typedef class JPAIR *PJPR; -typedef class JSON *PJSON; -typedef class JVALUE *PJVAL; -typedef class JOBJECT *PJOB; -typedef class JARRAY *PJAR; - -typedef struct { - char *str; - int len; - } STRG, *PSG; - -PJSON ParseJson(PGLOBAL g, char *s, int n, int prty, bool *b = NULL); -PJAR ParseArray(PGLOBAL g, int& i, STRG& src); -PJOB ParseObject(PGLOBAL g, int& i, STRG& src); -PJVAL ParseValue(PGLOBAL g, int& i, STRG& src); -char *ParseString(PGLOBAL g, int& i, STRG& src); -PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src); -PSZ Serialize(PGLOBAL g, PJSON jsp, FILE *fs, int pretty); -bool SerializeArray(JOUT *js, PJAR jarp, bool b); -bool SerializeObject(JOUT *js, PJOB jobp); -bool SerializeValue(JOUT *js, PJVAL jvp); - -/***********************************************************************/ -/* Class JOUT. Used by Serialize. */ -/***********************************************************************/ -class JOUT : public BLOCK { - public: - JOUT(PGLOBAL gp) : BLOCK() {g = gp;} - - virtual bool WriteStr(const char *s) = 0; - virtual bool WriteChr(const char c) = 0; - virtual bool Escape(const char *s) = 0; - - // Member - PGLOBAL g; -}; // end of class JOUT - -/***********************************************************************/ -/* Class JOUTSTR. Used to Serialize to a string. */ -/***********************************************************************/ -class JOUTSTR : public JOUT { - public: - JOUTSTR(PGLOBAL g); - - virtual bool WriteStr(const char *s); - virtual bool WriteChr(const char c); - virtual bool Escape(const char *s); - - // Member - char *Strp; // The serialized string - size_t N; // Position of next char - size_t Max; // String max size -}; // end of class JOUTSTR - -/***********************************************************************/ -/* Class JOUTFILE. Used to Serialize to a file. */ -/***********************************************************************/ -class JOUTFILE : public JOUT { - public: - JOUTFILE(PGLOBAL g, FILE *str) : JOUT(g) {Stream = str;} - - virtual bool WriteStr(const char *s); - virtual bool WriteChr(const char c); - virtual bool Escape(const char *s); - - // Member - FILE *Stream; -}; // end of class JOUTFILE - -/***********************************************************************/ -/* Class JOUTPRT. Used to Serialize to a pretty file. */ -/***********************************************************************/ -class JOUTPRT : public JOUTFILE { - public: - JOUTPRT(PGLOBAL g, FILE *str) : JOUTFILE(g, str) {M = 0; B = false;} - - virtual bool WriteStr(const char *s); - virtual bool WriteChr(const char c); - - // Member - int M; - bool B; -}; // end of class JOUTPRT - -/***********************************************************************/ -/* Class PAIR. The pairs of a json Object. */ -/***********************************************************************/ -class JPAIR : public BLOCK { - friend class JOBJECT; - friend PJOB ParseObject(PGLOBAL, int&, STRG&); - friend bool SerializeObject(JOUT *, PJOB); - public: - JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} - - inline PSZ GetKey(void) {return Key;} - inline PJVAL GetVal(void) {return Val;} - inline PJPR GetNext(void) {return Next;} - - protected: - PSZ Key; // This pair key name - PJVAL Val; // To the value of the pair - PJPR Next; // To the next pair -}; // end of class JPAIR - -/***********************************************************************/ -/* Class JSON. The base class for all other json classes. */ -/***********************************************************************/ -class JSON : public BLOCK { - public: - JSON(void) {Size = 0;} - - int size(void) {return Size;} - virtual void Clear(void) {Size = 0;} - virtual JTYP GetType(void) {return TYPE_JSON;} - virtual JTYP GetValType(void) {X return TYPE_JSON;} - virtual void InitArray(PGLOBAL g) {X} - virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL) {X return NULL;} - virtual PJPR AddPair(PGLOBAL g, PSZ key) {X return NULL;} - virtual PJVAL GetValue(const char *key) {X return NULL;} - virtual PJOB GetObject(void) {return NULL;} - virtual PJAR GetArray(void) {return NULL;} - virtual PJVAL GetValue(int i) {X return NULL;} - virtual PVAL GetValue(void) {X return NULL;} - virtual PJSON GetJson(void) {X return NULL;} - virtual PJPR GetFirst(void) {X return NULL;} - virtual int GetInteger(void) {X return 0;} - virtual double GetFloat() {X return 0.0;} - virtual PSZ GetString() {X return NULL;} - virtual PSZ GetText(PGLOBAL g, PSZ text) {X return NULL;} - virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) {X return true;} - virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X} - virtual void SetValue(PVAL valp) {X} - virtual void SetValue(PJSON jsp) {X} - virtual void SetString(PGLOBAL g, PSZ s) {X} - virtual void SetInteger(PGLOBAL g, int n) {X} - virtual void SetFloat(PGLOBAL g, double f) {X} - virtual bool DeleteValue(int i) {X return true;} - virtual bool IsNull(void) {X return true;} - - protected: - int Size; -}; // end of class JSON - -/***********************************************************************/ -/* Class JOBJECT: contains a list of value pairs. */ -/***********************************************************************/ -class JOBJECT : public JSON { - friend PJOB ParseObject(PGLOBAL, int&, STRG&); - friend bool SerializeObject(JOUT *, PJOB); - public: - JOBJECT(void) : JSON() {First = Last = NULL;} - - using JSON::GetValue; - using JSON::SetValue; - virtual void Clear(void) {First = Last = NULL; Size = 0;} - virtual JTYP GetType(void) {return TYPE_JOB;} - virtual PJPR GetFirst(void) {return First;} - virtual PJPR AddPair(PGLOBAL g, PSZ key); - virtual PJOB GetObject(void) {return this;} - virtual PJVAL GetValue(const char* key); - virtual PSZ GetText(PGLOBAL g, PSZ text); - virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); - virtual bool IsNull(void); - - protected: - PJPR First; - PJPR Last; -}; // end of class JOBJECT - -/***********************************************************************/ -/* Class JARRAY. */ -/***********************************************************************/ -class JARRAY : public JSON { - friend PJAR ParseArray(PGLOBAL, int&, STRG&); - public: - JARRAY(void) : JSON() {Alloc = 0; First = Last = NULL; Mvals = NULL;} - - using JSON::GetValue; - using JSON::SetValue; - virtual void Clear(void) {First = Last = NULL; Size = 0;} - virtual JTYP GetType(void) {return TYPE_JAR;} - virtual PJAR GetArray(void) {return this;} - virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL); - virtual void InitArray(PGLOBAL g); - virtual PJVAL GetValue(int i); - virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); - virtual bool DeleteValue(int n); - virtual bool IsNull(void); - - protected: - // Members - int Alloc; // The Mvals allocated size - PJVAL First; // Used when constructing - PJVAL Last; // Last constructed value - PJVAL *Mvals; // Allocated when finished -}; // end of class JARRAY - -/***********************************************************************/ -/* Class JVALUE. */ -/***********************************************************************/ -class JVALUE : public JSON { - friend class JARRAY; - friend PJVAL ParseValue(PGLOBAL, int&, STRG&); - friend bool SerializeValue(JOUT *, PJVAL); - public: - JVALUE(void) : JSON() - {Jsp = NULL; Value = NULL; Next = NULL; Del = false;} - JVALUE(PJSON jsp) : JSON() - {Jsp = jsp; Value = NULL; Next = NULL; Del = false;} - JVALUE(PGLOBAL g, PVAL valp); - - using JSON::GetValue; - using JSON::SetValue; - virtual void Clear(void) - {Jsp = NULL; Value = NULL; Next = NULL; Del = false; Size = 0;} - virtual JTYP GetType(void) {return TYPE_JVAL;} - virtual JTYP GetValType(void); - virtual PJOB GetObject(void); - virtual PJAR GetArray(void); - virtual PVAL GetValue(void) {return Value;} - virtual PJSON GetJson(void) {return (Jsp ? Jsp : this);} - virtual int GetInteger(void); - virtual double GetFloat(void); - virtual PSZ GetString(void); - virtual PSZ GetText(PGLOBAL g, PSZ text); - virtual void SetValue(PVAL valp) {Value = valp;} - virtual void SetValue(PJSON jsp) {Jsp = jsp;} - virtual void SetString(PGLOBAL g, PSZ s); - virtual void SetInteger(PGLOBAL g, int n); - virtual void SetFloat(PGLOBAL g, double f); - virtual bool IsNull(void); - - protected: - PJSON Jsp; // To the json value - PVAL Value; // The numeric value - PJVAL Next; // Next value in array - bool Del; // True when deleted -}; // end of class JVALUE - +/**************** json H Declares Source Code File (.H) ****************/ +/* Name: json.h Version 1.1 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ +/* */ +/* This file contains the JSON classes declares. */ +/***********************************************************************/ +#include "value.h" + +#if defined(_DEBUG) +#define X assert(false); +#else +#define X +#endif + +enum JTYP {TYPE_STRG = 1, + TYPE_DBL = 2, + TYPE_BOOL = 4, + TYPE_INTG = 7, + TYPE_JSON = 12, + TYPE_JAR, + TYPE_JOB, + TYPE_JVAL}; + +class JOUT; +class JSON; +class JMAP; +class JVALUE; +class JOBJECT; +class JARRAY; + +typedef class JPAIR *PJPR; +typedef class JSON *PJSON; +typedef class JVALUE *PJVAL; +typedef class JOBJECT *PJOB; +typedef class JARRAY *PJAR; + +typedef struct { + char *str; + int len; + } STRG, *PSG; + +PJSON ParseJson(PGLOBAL g, char *s, int n, int prty, bool *b = NULL); +PJAR ParseArray(PGLOBAL g, int& i, STRG& src); +PJOB ParseObject(PGLOBAL g, int& i, STRG& src); +PJVAL ParseValue(PGLOBAL g, int& i, STRG& src); +char *ParseString(PGLOBAL g, int& i, STRG& src); +PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src); +PSZ Serialize(PGLOBAL g, PJSON jsp, FILE *fs, int pretty); +bool SerializeArray(JOUT *js, PJAR jarp, bool b); +bool SerializeObject(JOUT *js, PJOB jobp); +bool SerializeValue(JOUT *js, PJVAL jvp); + +/***********************************************************************/ +/* Class JOUT. Used by Serialize. */ +/***********************************************************************/ +class JOUT : public BLOCK { + public: + JOUT(PGLOBAL gp) : BLOCK() {g = gp;} + + virtual bool WriteStr(const char *s) = 0; + virtual bool WriteChr(const char c) = 0; + virtual bool Escape(const char *s) = 0; + + // Member + PGLOBAL g; +}; // end of class JOUT + +/***********************************************************************/ +/* Class JOUTSTR. Used to Serialize to a string. */ +/***********************************************************************/ +class JOUTSTR : public JOUT { + public: + JOUTSTR(PGLOBAL g); + + virtual bool WriteStr(const char *s); + virtual bool WriteChr(const char c); + virtual bool Escape(const char *s); + + // Member + char *Strp; // The serialized string + size_t N; // Position of next char + size_t Max; // String max size +}; // end of class JOUTSTR + +/***********************************************************************/ +/* Class JOUTFILE. Used to Serialize to a file. */ +/***********************************************************************/ +class JOUTFILE : public JOUT { + public: + JOUTFILE(PGLOBAL g, FILE *str) : JOUT(g) {Stream = str;} + + virtual bool WriteStr(const char *s); + virtual bool WriteChr(const char c); + virtual bool Escape(const char *s); + + // Member + FILE *Stream; +}; // end of class JOUTFILE + +/***********************************************************************/ +/* Class JOUTPRT. Used to Serialize to a pretty file. */ +/***********************************************************************/ +class JOUTPRT : public JOUTFILE { + public: + JOUTPRT(PGLOBAL g, FILE *str) : JOUTFILE(g, str) {M = 0; B = false;} + + virtual bool WriteStr(const char *s); + virtual bool WriteChr(const char c); + + // Member + int M; + bool B; +}; // end of class JOUTPRT + +/***********************************************************************/ +/* Class PAIR. The pairs of a json Object. */ +/***********************************************************************/ +class JPAIR : public BLOCK { + friend class JOBJECT; + friend PJOB ParseObject(PGLOBAL, int&, STRG&); + friend bool SerializeObject(JOUT *, PJOB); + public: + JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} + + inline PSZ GetKey(void) {return Key;} + inline PJVAL GetVal(void) {return Val;} + inline PJPR GetNext(void) {return Next;} + + protected: + PSZ Key; // This pair key name + PJVAL Val; // To the value of the pair + PJPR Next; // To the next pair +}; // end of class JPAIR + +/***********************************************************************/ +/* Class JSON. The base class for all other json classes. */ +/***********************************************************************/ +class JSON : public BLOCK { + public: + JSON(void) {Size = 0;} + + int size(void) {return Size;} + virtual void Clear(void) {Size = 0;} + virtual JTYP GetType(void) {return TYPE_JSON;} + virtual JTYP GetValType(void) {X return TYPE_JSON;} + virtual void InitArray(PGLOBAL g) {X} + virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL) {X return NULL;} + virtual PJPR AddPair(PGLOBAL g, PSZ key) {X return NULL;} + virtual PJVAL GetValue(const char *key) {X return NULL;} + virtual PJOB GetObject(void) {return NULL;} + virtual PJAR GetArray(void) {return NULL;} + virtual PJVAL GetValue(int i) {X return NULL;} + virtual PVAL GetValue(void) {X return NULL;} + virtual PJSON GetJson(void) {X return NULL;} + virtual PJPR GetFirst(void) {X return NULL;} + virtual int GetInteger(void) {X return 0;} + virtual double GetFloat() {X return 0.0;} + virtual PSZ GetString() {X return NULL;} + virtual PSZ GetText(PGLOBAL g, PSZ text) {X return NULL;} + virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) {X return true;} + virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X} + virtual void SetValue(PVAL valp) {X} + virtual void SetValue(PJSON jsp) {X} + virtual void SetString(PGLOBAL g, PSZ s) {X} + virtual void SetInteger(PGLOBAL g, int n) {X} + virtual void SetFloat(PGLOBAL g, double f) {X} + virtual bool DeleteValue(int i) {X return true;} + virtual bool IsNull(void) {X return true;} + + protected: + int Size; +}; // end of class JSON + +/***********************************************************************/ +/* Class JOBJECT: contains a list of value pairs. */ +/***********************************************************************/ +class JOBJECT : public JSON { + friend PJOB ParseObject(PGLOBAL, int&, STRG&); + friend bool SerializeObject(JOUT *, PJOB); + public: + JOBJECT(void) : JSON() {First = Last = NULL;} + + using JSON::GetValue; + using JSON::SetValue; + virtual void Clear(void) {First = Last = NULL; Size = 0;} + virtual JTYP GetType(void) {return TYPE_JOB;} + virtual PJPR GetFirst(void) {return First;} + virtual PJPR AddPair(PGLOBAL g, PSZ key); + virtual PJOB GetObject(void) {return this;} + virtual PJVAL GetValue(const char* key); + virtual PSZ GetText(PGLOBAL g, PSZ text); + virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); + virtual bool IsNull(void); + + protected: + PJPR First; + PJPR Last; +}; // end of class JOBJECT + +/***********************************************************************/ +/* Class JARRAY. */ +/***********************************************************************/ +class JARRAY : public JSON { + friend PJAR ParseArray(PGLOBAL, int&, STRG&); + public: + JARRAY(void) : JSON() {Alloc = 0; First = Last = NULL; Mvals = NULL;} + + using JSON::GetValue; + using JSON::SetValue; + virtual void Clear(void) {First = Last = NULL; Size = 0;} + virtual JTYP GetType(void) {return TYPE_JAR;} + virtual PJAR GetArray(void) {return this;} + virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL); + virtual void InitArray(PGLOBAL g); + virtual PJVAL GetValue(int i); + virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); + virtual bool DeleteValue(int n); + virtual bool IsNull(void); + + protected: + // Members + int Alloc; // The Mvals allocated size + PJVAL First; // Used when constructing + PJVAL Last; // Last constructed value + PJVAL *Mvals; // Allocated when finished +}; // end of class JARRAY + +/***********************************************************************/ +/* Class JVALUE. */ +/***********************************************************************/ +class JVALUE : public JSON { + friend class JARRAY; + friend PJVAL ParseValue(PGLOBAL, int&, STRG&); + friend bool SerializeValue(JOUT *, PJVAL); + public: + JVALUE(void) : JSON() + {Jsp = NULL; Value = NULL; Next = NULL; Del = false;} + JVALUE(PJSON jsp) : JSON() + {Jsp = jsp; Value = NULL; Next = NULL; Del = false;} + JVALUE(PGLOBAL g, PVAL valp); + + using JSON::GetValue; + using JSON::SetValue; + virtual void Clear(void) + {Jsp = NULL; Value = NULL; Next = NULL; Del = false; Size = 0;} + virtual JTYP GetType(void) {return TYPE_JVAL;} + virtual JTYP GetValType(void); + virtual PJOB GetObject(void); + virtual PJAR GetArray(void); + virtual PVAL GetValue(void) {return Value;} + virtual PJSON GetJson(void) {return (Jsp ? Jsp : this);} + virtual int GetInteger(void); + virtual double GetFloat(void); + virtual PSZ GetString(void); + virtual PSZ GetText(PGLOBAL g, PSZ text); + virtual void SetValue(PVAL valp) {Value = valp;} + virtual void SetValue(PJSON jsp) {Jsp = jsp;} + virtual void SetString(PGLOBAL g, PSZ s); + virtual void SetInteger(PGLOBAL g, int n); + virtual void SetFloat(PGLOBAL g, double f); + virtual bool IsNull(void); + + protected: + PJSON Jsp; // To the json value + PVAL Value; // The numeric value + PJVAL Next; // Next value in array + bool Del; // True when deleted +}; // end of class JVALUE + diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 1ad33d83068..ff4025ee0fb 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -410,7 +410,7 @@ void Json_Array_Add_deinit(UDF_INIT* initid) } // end of Json_Array_Add_deinit /***********************************************************************/ -/* Add values to a Json array. */ +/* Delete a value from a Json array. */ /***********************************************************************/ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { @@ -451,7 +451,7 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } else { n = *(int*)args->args[1]; arp = jvp->GetArray(); - arp->DeleteValue(n - 1); + arp->DeleteValue(n); arp->InitArray(g); if (!(str = Serialize(g, arp, NULL, 0))) { diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index 0bc82cd80ce..0ef43a245fa 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -99,6 +99,26 @@ extern "C" HINSTANCE s_hModule; // Saved module handle PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); +/***********************************************************************/ +/* Get the plugin directory. */ +/***********************************************************************/ +char *GetPluginDir(void) +{ + char *plugin_dir; + +#if defined(_WIN64) + plugin_dir = (char *)GetProcAddress(GetModuleHandle(NULL), + "?opt_plugin_dir@@3PADEA"); +#elif defined(_WIN32) + plugin_dir = (char*)GetProcAddress(GetModuleHandle(NULL), + "?opt_plugin_dir@@3PADA"); +#else + plugin_dir = opt_plugin_dir; +#endif + + return plugin_dir; +} // end of GetPluginDir + /***********************************************************************/ /* Get a unique enum table type ID. */ /***********************************************************************/ @@ -328,7 +348,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) { typedef PQRYRES (__stdcall *XCOLDEF) (PGLOBAL, void*, char*, char*, bool); const char *module, *subtype; - char c, getname[40] = "Col"; + char c, soname[_MAX_PATH], getname[40] = "Col"; #if defined(WIN32) HANDLE hdll; /* Handle to the external DLL */ #else // !WIN32 @@ -343,6 +363,17 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) if (!module || !subtype) return NULL; + /*********************************************************************/ + /* Ensure that the .dll doesn't have a path. */ + /* This is done to ensure that only approved dll from the system */ + /* directories are used (to make this even remotely secure). */ + /*********************************************************************/ + if (check_valid_path(module, strlen(module))) { + strcpy(g->Message, "Module cannot contain a path"); + return NULL; + } else + PlugSetPath(soname, module, GetPluginDir()); + // The exported name is always in uppercase for (int i = 0; ; i++) { c = subtype[i]; @@ -352,11 +383,11 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) #if defined(WIN32) // Load the Dll implementing the table - if (!(hdll = LoadLibrary(module))) { + if (!(hdll = LoadLibrary(soname))) { char buf[256]; DWORD rc = GetLastError(); - sprintf(g->Message, MSG(DLL_LOAD_ERROR), rc, module); + sprintf(g->Message, MSG(DLL_LOAD_ERROR), rc, soname); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, 0, (LPTSTR)buf, sizeof(buf), NULL); @@ -374,9 +405,9 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) const char *error = NULL; // Load the desired shared library - if (!(hdll = dlopen(module, RTLD_LAZY))) { + if (!(hdll = dlopen(soname, RTLD_LAZY))) { error = dlerror(); - sprintf(g->Message, MSG(SHARED_LIB_ERR), module, SVP(error)); + sprintf(g->Message, MSG(SHARED_LIB_ERR), soname, SVP(error)); return NULL; } // endif Hdll diff --git a/storage/connect/mysql-test/connect/my.cnf b/storage/connect/mysql-test/connect/my.cnf index 317e20012ba..6310772d01f 100644 --- a/storage/connect/mysql-test/connect/my.cnf +++ b/storage/connect/mysql-test/connect/my.cnf @@ -1,17 +1,17 @@ -# Use default setting for mysqld processes -!include include/default_mysqld.cnf -!include include/default_client.cnf - -[mysqld.1] -#log-bin= master-bin - -[mysqld.2] - -[ENV] -MASTER_MYPORT= @mysqld.1.port -MASTER_MYSOCK= @mysqld.1.socket - -SLAVE_MYPORT= @mysqld.2.port -SLAVE_MYSOCK= @mysqld.2.socket - -PGCLIENTENCODING= UTF8 +# Use default setting for mysqld processes +!include include/default_mysqld.cnf +!include include/default_client.cnf + +[mysqld.1] +#log-bin= master-bin + +[mysqld.2] + +[ENV] +MASTER_MYPORT= @mysqld.1.port +MASTER_MYSOCK= @mysqld.1.socket + +SLAVE_MYPORT= @mysqld.2.port +SLAVE_MYSOCK= @mysqld.2.socket + +PGCLIENTENCODING= UTF8 diff --git a/storage/connect/mysql-test/connect/r/bin.result b/storage/connect/mysql-test/connect/r/bin.result index bbf5614b555..69453d97534 100644 --- a/storage/connect/mysql-test/connect/r/bin.result +++ b/storage/connect/mysql-test/connect/r/bin.result @@ -14,11 +14,11 @@ SET time_zone='+00:00'; CREATE TABLE t1 ( fig INT(4) NOT NULL FIELD_FORMAT='C', -name CHAR(10) not null, -birth DATE NOT NULL, -id CHAR(5) NOT NULL FIELD_FORMAT='S', +name CHAR(10) NOT NULL, +birth DATE NOT NULL FIELD_FORMAT='L', +id CHAR(5) NOT NULL FIELD_FORMAT='L2', salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', -dept INT(4) NOT NULL FIELD_FORMAT='S' +dept INT(4) NOT NULL FIELD_FORMAT='L2' ) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat'; SELECT * FROM t1; fig name birth id salary dept @@ -41,11 +41,11 @@ DROP TABLE t1; CREATE TABLE t1 ( fig INT(4) NOT NULL FIELD_FORMAT='C', -name CHAR(10) not null, -birth DATE NOT NULL, -id CHAR(5) NOT NULL FIELD_FORMAT='S', +name CHAR(10) NOT NULL, +birth DATE NOT NULL FIELD_FORMAT='L', +id CHAR(5) NOT NULL FIELD_FORMAT='L2', salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', -dept INT(4) NOT NULL FIELD_FORMAT='S' +dept INT(4) NOT NULL FIELD_FORMAT='L2' ) ENGINE=CONNECT TABLE_TYPE=BIN READONLY=Yes FILE_NAME='Testbal.dat'; INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); ERROR HY000: Table 't1' is read only @@ -55,10 +55,10 @@ Table Create Table t1 CREATE TABLE `t1` ( `fig` int(4) NOT NULL `FIELD_FORMAT`='C', `name` char(10) NOT NULL, - `birth` date NOT NULL, - `id` char(5) NOT NULL `FIELD_FORMAT`='S', + `birth` date NOT NULL `FIELD_FORMAT`='L', + `id` char(5) NOT NULL `FIELD_FORMAT`='L2', `salary` double(9,2) NOT NULL DEFAULT '0.00' `FIELD_FORMAT`='F', - `dept` int(4) NOT NULL `FIELD_FORMAT`='S' + `dept` int(4) NOT NULL `FIELD_FORMAT`='L2' ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=BIN `FILE_NAME`='Testbal.dat' `READONLY`=NO INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); SELECT * FROM t1; @@ -74,10 +74,10 @@ Table Create Table t1 CREATE TABLE `t1` ( `fig` int(4) NOT NULL `FIELD_FORMAT`='C', `name` char(10) NOT NULL, - `birth` date NOT NULL, - `id` char(5) NOT NULL `FIELD_FORMAT`='S', + `birth` date NOT NULL `FIELD_FORMAT`='L', + `id` char(5) NOT NULL `FIELD_FORMAT`='L2', `salary` double(9,2) NOT NULL DEFAULT '0.00' `FIELD_FORMAT`='F', - `dept` int(4) NOT NULL `FIELD_FORMAT`='S' + `dept` int(4) NOT NULL `FIELD_FORMAT`='L2' ) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=BIN `FILE_NAME`='Testbal.dat' `READONLY`=YES INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); ERROR HY000: Table 't1' is read only diff --git a/storage/connect/mysql-test/connect/r/json.result b/storage/connect/mysql-test/connect/r/json.result index fa6497e5bba..acb74c38e26 100644 --- a/storage/connect/mysql-test/connect/r/json.result +++ b/storage/connect/mysql-test/connect/r/json.result @@ -89,23 +89,23 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab'; SELECT * FROM t1 WHERE ISBN = '9782212090819'; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Philippe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications Philippe Knab Construire une application XML NULL NULL Eyrolles Paris 1999 # # To add an author a new table must be created # CREATE TABLE t2 ( FIRSTNAME CHAR(32), LASTNAME CHAR(32)) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[2]:AUTHOR'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[1]:AUTHOR'; SELECT * FROM t2; FIRSTNAME LASTNAME William J. Pardi INSERT INTO t2 VALUES('Charles','Dickens'); SELECT * FROM t1; ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year -9782212090819 fr applications Philippe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 -9782212090819 fr applications François Knab Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications Jean-Christophe Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications Philippe Knab Construire une application XML NULL NULL Eyrolles Paris 1999 9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 9782840825685 fr applications Charles Dickens XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 1999 DROP TABLE t1; @@ -127,11 +127,11 @@ line "SUBJECT": "applications", "AUTHOR": [ { - "FIRSTNAME": "Philippe", + "FIRSTNAME": "Jean-Christophe", "LASTNAME": "Bernadac" }, { - "FIRSTNAME": "François", + "FIRSTNAME": "Philippe", "LASTNAME": "Knab" } ], @@ -252,9 +252,9 @@ DROP TABLE t1; # CREATE TABLE t2 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='WEEK:[0]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t2; WHO WEEK WHAT AMOUNT @@ -268,9 +268,9 @@ Janet 3 Food 18.00 Janet 3 Beer 18.00 CREATE TABLE t3 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t3; WHO WEEK WHAT AMOUNT @@ -284,9 +284,9 @@ Beth 4 Beer 15.00 Janet 4 Car 17.00 CREATE TABLE t4 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[3]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t4; WHO WEEK WHAT AMOUNT diff --git a/storage/connect/mysql-test/connect/r/xml_html.result b/storage/connect/mysql-test/connect/r/xml_html.result new file mode 100644 index 00000000000..143f46529f6 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/xml_html.result @@ -0,0 +1,32 @@ +Warnings: +Warning 1105 No file name. Table will use t1.xml +SET NAMES utf8; +# +# Testing HTML like XML file +# +CREATE TABLE beers ( +`Name` CHAR(16) FIELD_FORMAT='brandName', +`Origin` CHAR(16) FIELD_FORMAT='origin', +`Description` CHAR(32) FIELD_FORMAT='details') +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' +TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; +SELECT * FROM beers; +Name Origin Description +Huntsman Bath, UK Wonderful hop, light alcohol +Tuborg Danmark In small bottles +DROP TABLE beers; +# +# Testing HTML file +# +CREATE TABLE coffee ( +`Name` CHAR(16), +`Cups` INT(8), +`Type` CHAR(16), +`Sugar` CHAR(4)) +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' +TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; +SELECT * FROM coffee; +Name Cups Type Sugar +T. Sexton 10 Espresso No +J. Dinnen 5 Decaf Yes +DROP TABLE coffee; diff --git a/storage/connect/mysql-test/connect/std_data/beers.xml b/storage/connect/mysql-test/connect/std_data/beers.xml new file mode 100644 index 00000000000..1abc77fe0f9 --- /dev/null +++ b/storage/connect/mysql-test/connect/std_data/beers.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + +
NameOriginDescription
HuntsmanBath, UK
Wonderful hop, light alcohol
TuborgDanmark
In small bottles
+
diff --git a/storage/connect/mysql-test/connect/std_data/bookstore.xml b/storage/connect/mysql-test/connect/std_data/bookstore.xml index 0aebbcd243e..540fa5409f4 100644 --- a/storage/connect/mysql-test/connect/std_data/bookstore.xml +++ b/storage/connect/mysql-test/connect/std_data/bookstore.xml @@ -1,31 +1,31 @@ - - - - Everyday Italian - Giada De Laurentiis - 2005 - 30.00 - - - Harry Potter - J K. Rowling - 2005 - 29.99 - - - XQuery Kick Start - James McGovern - Per Bothner - Kurt Cagle - James Linn - Vaidyanathan Nagarajan - 2003 - 49.99 - - - Learning XML - Erik T. Ray - 2003 - 39.95 - - + + + + Everyday Italian + Giada De Laurentiis + 2005 + 30.00 + + + Harry Potter + J K. Rowling + 2005 + 29.99 + + + XQuery Kick Start + James McGovern + Per Bothner + Kurt Cagle + James Linn + Vaidyanathan Nagarajan + 2003 + 49.99 + + + Learning XML + Erik T. Ray + 2003 + 39.95 + + diff --git a/storage/connect/mysql-test/connect/std_data/boyswin.txt b/storage/connect/mysql-test/connect/std_data/boyswin.txt index bf6eee6238c..ada3b2dc45c 100644 --- a/storage/connect/mysql-test/connect/std_data/boyswin.txt +++ b/storage/connect/mysql-test/connect/std_data/boyswin.txt @@ -1,6 +1,6 @@ -John Boston 25/01/1986 02/06/2010 -Henry Boston 07/06/1987 01/04/2008 -George San Jose 10/08/1981 02/06/2010 -Sam Chicago 22/11/1979 10/10/2007 -James Dallas 13/05/1992 14/12/2009 -Bill Boston 11/09/1986 10/02/2008 +John Boston 25/01/1986 02/06/2010 +Henry Boston 07/06/1987 01/04/2008 +George San Jose 10/08/1981 02/06/2010 +Sam Chicago 22/11/1979 10/10/2007 +James Dallas 13/05/1992 14/12/2009 +Bill Boston 11/09/1986 10/02/2008 diff --git a/storage/connect/mysql-test/connect/std_data/coffee.htm b/storage/connect/mysql-test/connect/std_data/coffee.htm new file mode 100644 index 00000000000..95a23d5c0ad --- /dev/null +++ b/storage/connect/mysql-test/connect/std_data/coffee.htm @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + +
Cups of coffee consumed by each senator
NameCupsType of CoffeeSugar?
T. Sexton10EspressoNo
J. Dinnen5DecafYes
+ diff --git a/storage/connect/mysql-test/connect/std_data/emp.txt b/storage/connect/mysql-test/connect/std_data/emp.txt index 08cafdb8cab..aa45d2644c0 100644 --- a/storage/connect/mysql-test/connect/std_data/emp.txt +++ b/storage/connect/mysql-test/connect/std_data/emp.txt @@ -1,4545 +1,4545 @@ -5745ESCOURCHE BENEDICTE 21935 71962121994051834514275.50 0MTECHN -9692VICENTE LAURENCE 21941 81967101989011621213032.80 0MANGL -9146NICOLAS ROGER 11941 61964071995023417325098.65 0MSANS -2985TESSEREAU MARIE HELENE 21941 91967011990011932314933.78 0VSANS -3368MOGADOR ALAIN 11941 11961091993114330331420.55 0CSANS -7394CHAUSSEE ERIC DENIS 11944 91965111983123200223583.86 0MANGL -4655MAILLOT GEORGES 11945 51970091986122470018541.64 0CANGL -2825CAMILLE NADINE 21956 91994011993011949415050.45 0MSANS -1460BRUYERES JEAN MARC 11958 81984081988052090215980.07 0MSANS -4974LONES GERARD 11959101979011994121608112916.70 0MSANS -8811CROISILLES DOMINIQUE 11961101983051991011868714507.13 0MSANS -4682MUY CHRISTINE 21962101986051985051288210745.30 0MANGL -2974SEYSSAUD GERARD 11963 91984101989051949415050.55 0MALLEM -3185QUINET OLIVIER 11966 71985061993111868714507.94 0MSANS -9543KOMITAS YVES 11967 21993011992011330611017.70 0MTECHN -3493COUDET ERIC CHRISTIAN 11935101955041992063417325097.97 1MTECHN -9039CHAMBOURCY JEAN PAUL 11936 21965031995033417325098.51 1MALLEM -3731CLERE BRIGITTE 21936111963091995082666519900.77 1CSANS -2935BONVIN ROBERT 11937 71960121985042273717261.66 1MANGL -4278VALBOSQUET VERONIQUE SIMONE 21939 21972071992021932314933.54 1MSANS -1653LIEGE LAURENCE 2193912198901198605 8656 8145.57 1.SANS -4477LECOURBE DIDIER 11939121965051993011663613342.67 1MSANS -1400AVENE ANDRE 11940111969121993041557012568.44 1MALLEM -9742YZENGREMER MICHEL 11941121968011995042201216756.19 1MVENTE -7255PEYRESTORTES MARIE CHRISTINE 21941 11962041988072470018541.83 1MANGL -1725EPEND MARIE AGNES 21941 41973071989011621213033.65 1VSANS -4647PERADONNERIE JACQUES 11941121974071992071369311287.41 1MSANS -7633SCHEFFER CLAUDE 11944 11969031991011433211714.46 1MSANS -9793SABLONS MARIE FRANCE 21945 5199408199308 9126 8456.87 1VSANS -6057EAU BRUNO 11947 91972041991071433211715.33 1MSANS -6465JADES CATHERINE 21947121970011995042137316331.60 1MINFOR -8298BERGERS BERNARD 11947101975091993011369311287.29 1MSANS -9254LEGROS SUZANNE 21947 41971111995111684813422.57 1MESP -7761KAMAL ALAIN 11948 91977041993111471512024.08 1MCOMPT -5772GAUTHIER SABINE 21948 61977071994041471512025.34 1MTECHN -9643BARTHELEMY DOMINIQUE 11949 519871019901111131 9657.16 1LSANS -3906ROUYRE LAURE 21949 31973071972071326611016.21 1MSANS -8707SICILE JEAN PIERRE 11950 11976071993011369311286.56 1MANGL -0091THIVERNAL DIDIER JEAN 11951101980051991101471512024.71 1MSANS -5757CLOPERIE FABIENNE 21951 71972051995071684813423.26 1MSANS -7795LATOUR CATHERINE 21952 4199406199306 8359 7953.72 1MSANS -4879EGUILLES GILLES 11952 61972121990071621213032.51 1MANGL -8311VINS JEAN PIERRE 11952 119930919920910407 9272.06 1MTECHN -5964JUST STEPHANE BERNARD 11952 51974061993011369311286.48 1MSANS -2822NEMAN ELISABETH 21952 7199304199204 9597 8728.14 1MSANS -1340ABBE MICHELE 21953101973071991041578112722.60 1MSANS -5357ZOLA BERNARD 11954 41980061992011471512024.35 1MSANS -8456DHUYS CORINNE ANNE 21954 71979031993041471512025.50 1MINFOR -4618FERRY BRUNO 11954 41977041995011578112722.24 1MSANS -8212CIRCLE BERNARD 11955111975041991071578112722.42 1MSANS -8015BACHELET DOMINIQUE 11956121977031994072644919744.10 1MTECHN -4320SUPERI MONIQUE 21956 319940519920111389 9852.00 1MSANS -0442CONTOUR ALAIN 11957 91977031995062201216757.70 1MSANS -1034PROLONGEE MICHELINE 21957 61980051994071471512024.15 1MSANS -2106BARDE JEAN CLAUDE 11958 219840719830711131 9659.17 1MANGL -1977FOCH BERNADETTE 21958 3199202199102 8656 8145.03 1.SANS -3620BAGNOLET ANDRE 11958 11978061992051471512024.33 1MSANS -3344PEUPLIERS JOSIANE 21959 8199207199201 8656 8146.16 1DSANS -9038MALVILLE ETHEL LINKA 21959 31993091992011202810240.59 1MTECHN -0475PIERREFONTAINE BERNARD 11959 61984081987112090215979.62 1MSANS -4077MONTMELIAN NOELLE 21960 21984031983031288210743.92 1MSANS -1421FONTCHANDON PATRICE 11961 71984081989052090215980.97 1MALLEM -7043MOULERON MARTINE 21962 5199303199203 8656 8145.83 1.SANS -7239EPARGNE PASCALE 21962 91983011982011608112915.57 1MSANS -0361BRUANT LAURENCE 21962 31983041994091894014661.48 1CSANS -1988MIGNARD ANNE 21962 51993081992011249910473.36 1MSANS -8159GOLFE JEAN CLAUDE 11963 81985101992071288210745.49 1MANGL -7227BLEU MICHELE 21963 21994071992011249910472.61 1MTECHN -2721SATGE SOPHIE JULIE 21963 6199503199403 8656 8146.07 1MESP -1514PANNES JOEL ETIENNE 11964 11984101983101288210743.81 1MSANS -1595SEPTEMBRE PATRICE 11964 11988031987031527112373.40 1MSANS -5702CONCORDE PAUL 11965 71994051994011288210744.94 1MMARKT -3500DRIONNE JEAN XAVIER 119651119860119850110791 9501.81 1MSANS -3597PIERAM DOMINIQUE 11966 31991101990101381911366.72 1MINFOR -3537JEAN ANNE MARIE 2196610199610199510 9894 8921.90 1MSANS -0036CHATEAUBRIAND FRANCOISE 21967 8199307199207 7803 7681.42 1.SANS -2501GASTA PIERRE 11967101987091988071949415051.95 1CESP -5621KERGUILLE PASCAL 11967 71988071994061381911364.83 1MALLEM -5823BRIAC MONIQUE 21968 51994011993011360611210.93 1MSANS -3717FRADINIERE DANIEL 11968 51988041991041249910472.01 1MTECHN -2374PETITS SYLVIE FRANCOISE 21969 91992091991091330611018.24 1MSANS -8139POMPE ERIC 11969 21989041995031249910472.21 1MESP -3293GUSTAVIA MICHEL 11969 11993021992021420611637.74 1CINFOR -6848IMPASSE CLIVE 11969 71988071994011249910471.88 1MSANS -2857ERMITE DOMINIQUE 11969 319910719900710407 9271.86 1MTECHN -9167PARENT JEAN CLAUDE 11969 919930419920411389 9850.61 1CTECHN -6582OR MARYSE 21970 419920719910710024 8998.62 1MSANS -3685ANNEAU CORINNE JEANNE 21970 919920819910811389 9852.27 1MSANS -4890CIMIEZ PHILIPPE 11971121994101993101360611209.89 1MSANS -7740MARCEAU AGNES 21971 119920919910911389 9852.45 1MANGL -5934RANCHO DOMINIQUE 11971 91992071991071420611637.60 1CANGL -6784WEST JEAN LOUIS 11971 71995011994031202810241.57 1CSANS -0502ARRALLES GILLES 11971121993121994011249910473.27 1CSANS -5900LESIGNY OLIVIER 11972 6199606199506 8656 8145.74 1CVENTE -9357EGLISE ROGER 11972 5199207199312 9597 8728.89 1CINFOR -2647MONASTERE PHILIPPE JEAN 11972 919940619930610363 9233.31 1CSANS -7752RANCE GERARD 11973 2199607199507 7803 7680.14 1CINFOR -2565AQUITAINE GENEVIEVE 21973 119940619920111389 9852.22 1CALLEM -6946ORBAY CHRISTIANE 2197311199207199101 8656 8146.88 1MSANS -3358SALONINA ETIENNE 11973 419930919920911389 9852.36 1CANGL -7527BOULEYGUE PATRICK PIERRE 119741219940419930410668 9426.72 1CSANS -4780VALMORE ALBERT 11974 81995011994011206910241.16 1CSANS -6139PALMAROLE BERNADETTE 21975 1199504199404 8359 7952.78 1CSANS -2461CHAFFARD FREDERIC 11975 1199408199308 7803 7680.62 1CANGL -4422KAZ ELISABETH 2197612199607199507 7803 7681.11 1CSANS -3477CABRINE SYLVIE 21978 7199608199508 7803 7679.51 1CTECHN -6323FABIA RENE 11935 31960121990082273717260.44 2MSANS -5986ANNA DANIEL 11935 41970041991011433211714.88 2DSANS -1512FONTAIN HENRY 1193511198901198801 9894 8922.57 2VESP -6902BLANCS BRUNO 11935 61958071993052470018541.64 2MSANS -1158CORNEBARRIEU JEAN FRANCOIS MARCEL11936121964011994011557012566.45 2CTECHN -8277PRIEURE CORINNE 21936 51963011991072273717260.26 2CANGL -3981TERME FREDERIC 11937 71959021989013844228044.89 2MSANS -1713DANVILLE DANIEL 11937 51961101985022470018540.87 2MANGL -9871CAZALIS THIERRY 11938 61966121989062947921840.15 2MANGL -0383CRESSELY JOELLE 21938111962091990012273717260.55 2VANGL -3742PYRENEES CHRISTIAN 11938121971101995011663613342.85 2MESP -6595BAGUIERE FRANCOIS 11938121964081983102022115556.35 2MALLEM -6543PIERRON PATRICK 11939 7198901198801 9894 8921.33 2CSANS -8167CLAUX MARTINE 21939 21967011992021932314934.48 2CSANS -4406LESBACHES COLETTE 21940111973071994041894014662.43 2MSANS -8258HARTMANN MARC 11940 31968061995011663613343.06 2MVENTE -3848BARAUDIERE JEAN CLAUDE 11940 11964101990042739020404.83 2MANGL -1529PICOURENC ANNY 21940 71967011989062470018541.86 2DVENTE -3069PERIER MICHELE 2194010199601199501 7803 7681.25 2MSANS -8473COLONIE PIERRETTE 21941 31968041991041932314933.58 2MINFOR -0084NIEMEN ODILE 21941 51970071991101932314933.73 2CSANS -6401ALLERAY ARLETTE 21941 21972121993071894014662.64 2CSANS -8343LEDION FRANCOIS RENE 11941 71972031991071663613344.41 2MALLEM -9940LAUNES LILIANE 2194210199005198606 8656 8145.83 2.SANS -7584MARSAT SERGE 11942101964081994011557012567.26 2MSANS -1051ROSAN STEPHANE 11942 51962041991072273717261.13 2MANGL -8928POINCARE ANNE MARIE 21942 41965021994051834514275.50 2MANGL -0874FRANCS KATHERIN 21942 61968031992021932314934.00 2MSANS -3411CORDELIERS ELISABETH 219421119931119921110152 9116.90 2MSANS -8736PERTUADE DIDIER 11943 31973071992041403411520.93 2MANGL -5553OLIVIER CHANTAL 21943 71964071992102137316331.97 2MTECHN -8502AUGUSTE JOCELYNE 21943101962121991072273717261.16 2CTECHN -7314DRAIO TOMOKO 21943111969111991072273717260.71 2MSANS -7892HAUTIL MARIE AGNES NICOLE 2194312199201199101 7803 7681.35 2.SANS -1146RUES LAURENT 11943 51970041990032022115556.13 2MSANS -5013POURNAY STEPHANE 11943 71969101991011433211714.01 2MMARKT -1970SARREBOURG CHRISTOPHE 11943 91962121988122470018540.20 2MTECHN -2665SAVOIE HELENE 21944 91968091986062470018540.53 2MSANS -9470KALISTE SUZANNE 21944 31970071991041578112722.12 2DSANS -7109PEREIRA JOSIANE 21944 71965011982102470018541.72 2CSANS -0293COURDIMANCHE JEAN CLAUDE 11944 41967011991012273717260.50 2MSANS -6308BASQUES ERIC WILLEM 11944 71970051988042273717261.30 2MSANS -9758ROSSA ROBERT 11944 21976051991101369311286.71 2MSANS -0368GEROFOSSE JOELLE 21944 5198810198306 8656 8146.34 2.ANGL -3899SALIVE JACQUES 11945 81971051991071433211713.67 2MTECHN -4807RONDINELLE NOELLE 21945 81968091993062470018540.42 2MSANS -1251CAP CLAUDE 1194510198907198903 8656 8146.20 2.ANGL -8624FREVILLE ALAIN 119451119820119810111389 9852.74 2MSANS -2995ROI JEAN 11946 91972011990101433211715.50 2MANGL -2130POMPE JEAN MARIE 11946 11972081991071578112722.03 2MSANS -1524ANTARES CHRISTIAN 11946 41972011990011433211714.43 2MTECHN -2651AUBE YVES 11946 71971071987041932314934.48 2MALLEM -5389YVON CAROLE 21946101969031993031834514275.34 2CSANS -5055BERTHIER CAROLE SIMONE 21947 319931019921010024 8999.31 2MINFOR -9623LAGER NORMA 21947 61982071992121471512024.51 2MSANS -9198CAGEAC MICHEL 11947101971031991011433211715.45 2MTECHN -1117MONS JOELLE 21948 41970081986052334017609.84 2MSANS -3883BELFORT FLORENCE 21948 2199503199403 8359 7952.96 2MINFOR -1886CHERCHE CHRISTIANE 21948 3199412199312 9597 8729.72 2MSANS -9452MORGANE ISABELLE HELENE 21948 61971061989011621213032.70 2MVENTE -1240POSTEL JOHN 11948111974071992011403411520.33 2MTECHN -2793DALHIAS EUGENE 11948 71974041992031518612336.02 2MSANS -1264TRESSERVE EVELYNE 21948 71969081991012990722149.03 2MTECHN -2964PUJADE ROBERT 11949 81974071992041403411521.74 2MANGL -9832COUTURIER PATRICK 11949 11972031988102273717260.76 2MSANS -7619ETIGNY FLORENCE 21949 21970111995042137316332.59 2DVENTE -3262FABRONITA ANNE 21949 11969091993061834514274.66 2MSANS -2312SENONCHES ERIK 11949111977041993041369311287.23 2MALLEM -8743GALLA DANIEL 11949 31970081991012137316331.79 2MALLEM -0857RAYNOUARD JEAN PIERRE 11950 91982061993111369311287.65 2MSANS -2136DEROISIN JEAN MARIE 11950 11979061992011608112916.74 2CSANS -4603LEPURDIE PHILIPPE 11950 91977101990101684813422.12 2MSANS -2694JOSEPH ERIC 11950 31979021992011249910471.62 2SANGL -0601SAOUVES PATRICIA 21950 51971021990101834514275.83 2MTECHN -7409RENE DANIEL 11950 11973051990122470018541.83 2MANGL -0950SENNELY JEAN PIERRE 11950 51977081986091621213033.28 2MANGL -1214LOTHIERS ALAIN 11951 51976101993011608112915.65 2MSANS -6388LAGRANGE ANDRE 11951 81976031984112470018541.20 2MSANS -2773MORGON ALBAN 11951 91974051988122334017610.33 2MANGL -7718PIEDS PASCAL BRUNO 11951 61981061993011471512025.91 2CSANS -8483MEDITERRANEE FREDERIC 11951101970101991112334017610.56 2MSANS -6772TRARIEUX GUY 11952 91976041992121932314933.54 2MTECHN -3860MONTABO GHYSLAIN 21952121972041979101684813421.64 2MMICRO -4868SEVRIER BERNARD 11952 31981041992121369311287.50 2MANGL -5715CHEVREUSE CATHERINE 21953 11974081991092175716600.56 2MSANS -3702CALIFO BEATRICE 21953 21973021993012017815517.91 2MESP -4778LABORDE SHOKO 21953 61973041990101578112723.50 2MSANS -4134GABONNAISE GHISLAINE 21953 61980071979071202810241.30 2DESP -4174GAGNEUR JEAN FRANCIS 11953 81979011991101369311288.22 2CSANS -6892NOLET JEAN LOUIS 11953 81982051992041369311287.41 2MSANS -5817SERPENTINE CLAUDE 11954 11973111989122175716601.28 2MSANS -9960GASSIN PASCAL 11954 81974121991012334017610.60 2MSANS -4935ANNE EVELYNE 21954101975021986101684813423.38 2CANGL -7050LUBECK MARIE CHRISTINE 21954 81975101993091608112915.33 2DESP -4537ANNECY ROBERT 11954 91974061992011578112721.89 2MANGL -1403CHAUVETS CHRISTINE 21954 31977031992011471512025.55 2MINFOR -3733JAUSSERANNE MASAYO 21955 41978011981091834514274.29 2MSANS -3799VAILLANT ANNE MARIE 2195558199606199506 7803 7679.58 2MSANS -1112CHAUMINE RUTH 21956 71985091984091288210745.99 2MSANS -8102AUSSOU MARCELINE 21956 91985061984061288210744.53 2MMICRO -3321GABRIE JEAN LOUIS 11956101976031993041471512024.75 2MSANS -6037SENART JEAN PIERRE 11956 419810319921011389 9852.47 2MSANS -2073CHAUFOURNIERS FRANCOIS 11956 61976111994041471512026.24 2MSANS -3246LAMANON VERONIQUE 21956111980041995101527112374.97 2MTECHN -5182MA PIERRE 11957 41978121994071911114779.14 2MALLEM -1023GIONO PATRICK 11957 91989011995011249910472.21 2MSANS -6811GENERAL ALAIN 11957 219930719940111302 9775.56 2MSANS -9879FOUJU PATRICK 11958 91983051987052090215979.70 2MSANS -9605ATLANTIQUE CATHERINE 21958 4199510199410 7803 7681.20 2MSANS -4610COLMAR YVES 11958111982021981021608112916.50 2MSANS -1905INGRANDES GILLES 11958 11978061993041471512024.03 2MSANS -6585VERON PHILIPPE 11958 41990091989111450311831.69 2MINFOR -1508DOBROPOL ERIC JEAN 11958 71978071995041249910473.33 2MTECHN -9616AIGUELONGUE JEAN PIERRE 11958 71979101994051783213884.92 2MTECHN -5207GANDOUX PATRICK 11958 11980081985112256617145.24 2MSANS -5107FABRON CLAUDE 21959101982021981021326611016.48 2MTECHN -6821ARCADIE RAPHAEL 11959 519810119800111389 9851.34 2MSANS -9011TUTELLE CLAUDINE 21959 3199201199101 7803 7680.57 2.INFOR -9117TOURISTIQUE AGNES 21959 31983111982111326611016.24 2MSANS -2719CRECH DOMINIQUE 11959 81983101991012781920673.39 2MSANS -9688BAUME BRIAC 11960 1198901198801 9894 8921.36 2MVENTE -0734CIPRES DOMINIQUE MAURICE 11960 21984111993041527112374.40 2MSANS -2402VALBOIS DOMINIQUE 11960 419880419870410407 9271.77 2MSANS -4887ARBAUD JACQUES 11961 61985101993011168610047.18 2MSANS -3196ARCADES YVES 11961 619910819900810024 8999.88 2MSANS -0090SENLIS COLETTE 21961 7199610199510 8656 8147.17 2MSANS -1096BOULOGNE AIME 11961111982061981061326611016.53 2MTECHN -2728ABOUT CATHERINE MARIE 21961 219841019831011389 9851.55 2DSANS -9891EXELMANS PATRICK 11961 61992061991061249910472.97 2DSANS -4344SANTA MARYLENE 21962 91993081992011249910472.41 2DSANS -6050PROSPER JOELLE 21962 41982051981051326611018.19 2MESP -1207CAUSSADE MONIQUE ESTELLE 21962 91982111995011450311831.07 2DTECHN -0864MIOLLIS FRANCOISE 21962 6199501199401 8656 8146.41 2MANGL -0149MONVALLON BRIGITTE 21962 41983011982011326611016.29 2CSANS -2375ALIZE CAROLE 21962 91983011982011215710280.24 2MANGL -8618RESID CHRISTIANE 21962101996111995111202810241.90 2MSANS -2736PAPIN GERARD 11962 51982051993091949415052.11 2MSANS -3073JONCS PATRICK FRANCOIS 11962 919890519880510407 9270.62 2MANGL -6231ENFER PHILIPPE 11962 61988031993041288210744.28 2CALLEM -5886CHANAZ RENE CHARLES 11962 41992091991091839014312.94 2MSANS -7276ORGEMONT DANIEL 11962 119830719910711131 9658.28 2MINFOR -8307GUILLAUME BRIGITTE 21963 21986051985051288210744.10 2MALLEM -6242ESCLIMONT MARC 11963121986071993051288210745.94 2MMARKT -2593CARNOT JEROME HENRI 11963 719890619880610407 9271.23 2MSANS -9494TAILLANDERIE JOSETTE 21963 41985101984101249910472.84 2MANGL -6039BOURRIER ODILE 21963121984051992011288210745.88 2DSANS -8408MARINE JEAN PHILIPPE 11963 419850619840610791 9502.46 2MSANS -3121DOMAINES MICHEL 11963121983061983081326611016.74 2CALLEM -3716LANDES DANIEL 11963 919851019841010791 9503.30 2MCOMPT -7915LAMBALLE CHRISTIAN 11963 7199009199510 8656 8145.48 2.SANS -9027RUGBY NICOLAS PHILIPPE 11964111993051992051249910472.12 2MSANS -2392MAXIME FRANCIS 119641219850419840410791 9501.95 2MCOMPT -3798BORNEL PATRICE 11964 51984061993071527112374.31 2MANGL -8092DOURNAZAC MARIE CLAUDE 21964 71988031995091450311831.39 2DTECHN -9707FEUILLANTS STEPHANE 11964 91985041984041288210744.95 2MSANS -1926ESCLAPON JEAN PIERRE 11964101987071990011288210744.14 2MSANS -9268DOCKS CATHERINE 21965 81985101984101288210745.97 2MALLEM -6133MOULYN JEAN NOEL 11965 519950119940110024 8999.58 2MANGL -2064GABRIELLE CLAUDE 119651119940419940110363 9232.71 2MANGL -3515ARZENS JEAN MICHEL 11966121987061994101249910473.45 2CSANS -1327LEVALLOIS CHRISTIAN HENRI 11966 419870119860110407 9270.96 2MALLEM -4538VALLEE PATRICK 11966111987091986091527112373.35 2MSANS -3705TOLLARE GUY 11966 319900219890210407 9271.28 2MANGL -2150SUD FREDERIC 11966 819891119881110407 9271.41 2MANGL -0295WEBER PATRICK 11966121989041994071249910471.94 2MANGL -8904ARMAGNAC BRIGITTE 21966 21993011992011839014312.78 2MSANS -0895ABORD CHANTAL 21966 31992021991011202810241.94 2MINFOR -3361MONTMORENCY LUC 11967 119891219890411302 9775.47 2MANGL -5793CHANEZ OLIVIER 11967 61989021988021539912452.16 2MTECHN -9149AUBEPINES JEAN CLAUDE 11967 919950619920110024 8999.72 2MSANS -6376MYANS DIDIER 11967 419900919890910024 8998.71 2CINFOR -7437KERILIS CHRISTINE LUCIENNE 21967 219950519940510668 9426.77 2MMARKT -5688TALLOIRES DOMINIQUE LOUISETTE 21968 81992121991121949415052.16 2MINFOR -3037GRANADOS BRIGITTE 219681119921119911111389 9851.33 2MSANS -0075CROUESTY PIERRE G 119681119900619890610407 9271.65 2MTECHN -7531UCHA GERARD 11968 319880619870610407 9270.24 2MALLEM -7464MORLET CHARLES 11968 319890419880410024 8999.79 2CVENTE -0214BLAZY CECILE MARIE NOELLE 2196812199405199305 9894 8922.34 2MMARKT -4596BONHEUR PHILIPPE 11969 81990011992061202810240.46 2MTECHN -3345ERESTE ERIC 119691219900919890910024 8999.72 2CSANS -2283MONTS PIERRE 11969 3199606199506 7803 7681.34 2CALLEM -5377ROGER FRANCK ANTOINE 1196912199306199206 8656 8147.19 2.SANS -2310PANORAMA JEAN PIERRE 11969 1199407199307 8656 8146.86 2MSANS -5201LINCON ALAIN 11969 11990101989101202810240.66 2MSANS -0199ROLAND ERIC JOSE 11969 119890719880710407 9270.29 2MSANS -9200FABREGAS LIONEL 11970 419940219940310024 8999.90 2MTECHN -7648PEPINIERES JEAN PAUL 11970 119920419910410024 8999.90 2MANGL -0531FALAISE PATRICK 11970111993101994051450311831.87 2MTECHN -0234TERTRE GILLES 11970 419940419930510363 9233.63 2CALLEM -4680FREIGNEAUX TORBEN 119711119910519931110024 8999.31 2MANGL -6897BRIGAND MAGGUY 21972 719910719900710024 8998.62 2MSANS -3962VIMANEY DOMINIQUE 219721119940719930411389 9852.18 2MSANS -3186VALLAURIS STEPHANE DENIS 119721119931219921211389 9851.57 2CSANS -8810GRENELLE BERTRAND 11972 219931219921211389 9851.21 2CSANS -4405ROBIAC FLORENT 11972 41992121993021420611638.14 2CTECHN -1562PORTO DENIS 11972 31992021994011249910471.76 2CSANS -9401VIEILLE DOMINIQUE PIERRE 11972 119940619930610363 9232.37 2CSANS -6240ROMARINS MAURICE 11973 61993031994011202810241.12 2CTECHN -7717INDRE GEORGES 11973 7199306199201 9597 8728.41 2CTECHN -4476AUGUSTIN CHRISTIAN 11974 419941119931110668 9425.55 2CSANS -1784LOIN MARTINE 21975 3199607199507 7803 7680.09 2CSANS -3218FLORENCE PIERRE 11977 1199606199506 7803 7681.25 2CESP -2085HEOL GUY PAUL 11977 5199410199502 8359 7951.66 2CSANS -0871BOUCHE MICHELE 21934 9199201199409 7803 7680.72 3.SANS -6519INGRES CLOTILDE 2193511199202199102 8656 8146.47 3.ALLEM -4038ADAM JANICK 21936111960061980062470018542.10 3MSANS -5872MURES MARYSE 2193610199210199110 9085 8417.54 3VSANS -1672LECOIN MIREILLE 21938 7199505199405 7590 7562.85 3MANGL -7357DETRIE MARIE PIERRE 21939 61962071983032470018540.96 3MSANS -6152LAVA MICHEL 11939 71962111991013844228045.78 3MSANS -3943SOUPANE MARIE HELENE 21940 31967011990011932314934.18 3MANGL -3325REVIREE ALAIN 11941 21973071992011403411521.25 3MANGL -2673HENNER LILIANE 21942 6199501199401 8656 8145.91 3CSANS -1755THEBAIDE MICHELE 21942 71966061995011834514275.86 3CSANS -7360DUCHEMIN VALERIE 21942 61970051991091932314933.73 3MANGL -1599CHALETS ALAIN 11943121988031993011215710279.23 3MSANS -9946AULNAY LAURENT 11945111972061995072470018540.87 3MVENTE -2412GILLES ANNE 21946101969081990012137316330.83 3MSANS -0843EPICEAS COLETTE 21947111971011994051834514274.26 3MANGL -6293TERRAS ERIC 11949 41976021992012470018542.13 3MSANS -0336AMOUR MARC 11949 31978081993121471512024.17 3MSANS -5125BASTIDES GUY 11949 91975091990011684813422.12 3DESP -7428LEGENDRE ELISABETH 21950 91979121978121249910472.15 3MSANS -5015GERARD VALERIE 2195112199307199207 8656 8146.11 3.ALLEM -4029SUISSE HERVE 11951 41970101990101932314935.08 3MTECHN -3802BARTHELEMY JEAN 11951 11976051994041471512025.77 3MESP -1871FELIX JEAN CLAUDE 11951 419811119870411131 9657.08 3SSANS -0467MALMAISON HENRI 11952 81976041992011578112722.66 3MANGL -4342PEYRE ANDRE 11953 519820419810411389 9851.64 3MESP -4047DORDOGNE GERARD 11954 11984081993011471512025.01 3MANGL -0870CHARBONNIERE HERVE MICHEL 119541219860119850111131 9658.11 3MANGL -5403CLEMENT RICHARD 1195511198103198910 2079 1.27 3MANGL -2799LOUBET HENRI 11955111980051995041249910473.33 3MANGL -8532LEDRU GERARD 11956 41975061992081868714506.76 3MCOMPT -6909NICOLAS SYLVIE MARIE FRANCOI21956 91977041992021471512026.04 3MALLEM -4518CLAUDE BRIGITTE 21956 21978041992021471512025.74 3CSANS -9477MERE MARIE LAURE 2195612199201199101 7803 7679.73 3.SANS -5508BATHIE PAUL 11957 31979051995041249910473.65 3MSANS -8413MARRONIERS ROBERT 11957111979121992011471512025.46 3MANGL -4314MAUGARNY VERONIQUE 21958 11978071992121471512026.22 3MTECHN -4329MAREUIL JEAN PAUL 11958 21981051994011471512025.56 3MVENTE -8123CANADA FRANCOIS 119581219940719930711389 9852.20 3MCOMPT -8870NEUVE JEAN FRANCOIS 11959 81978071992091471512025.02 3MTECHN -8119RAMPART PIERRE 11961121981061993051527112374.76 3MALLEM -7639ASSAS ERIC 119611019850119840111131 9657.96 3MANGL -7720SIFFRET PATRICK 11961 719870319870410791 9502.58 3MVENTE -5003PUYBERNARD DANIEL 119611119930419920410024 8999.03 3MSANS -8713VAGNE FREDERIQUE JOSEE 21961111982021981091608112916.97 3MANGL -1064CASSANYES JACQUES 11962121988061995011373711327.43 3MSANS -6331CORMIER MIREILLE 21962 51985091984091249910472.33 3MSANS -8037FARRERE JEAN LOUIS 11962 91987071992052529918967.97 3MVENTE -2186JOZON CLAUDINE 21963111984091992011949415051.54 3MSANS -6036VERQUIERES YVON 119641119880719911010407 9271.97 3MSANS -7970FOIRAIL MARC 119641119850319840310791 9502.86 3MALLEM -1484VICTORET NICOLE 21965 5199610199510 8359 7952.10 3MANGL -7412FLERS GUY 11965 219880219870210407 9270.06 3MSANS -3857DENIS BRIGITTE 21965 91993091992011202810240.55 3MESP -5856ILIZ THIERRY 119651119860519850510791 9503.61 3CALLEM -0008CESAR ERIC 11966 91987081986081249910472.87 3CANGL -8742MONTANT CATHERINE 21966 91993101992011202810240.28 3MALLEM -9552LACOMBE FRANCK 11966 51989021991121450311832.47 3MSANS -4423ROC CLAUDE 119671019931119930110024 8998.17 3MSANS -2631MORIZET SERGE 11967 51988041992051450311830.88 3CSANS -2963BEAUMONT PASCAL 11968 2199306199301 9597 8728.13 3MINFOR -1467OTTO JEAN 11968111991111990111467711987.67 3MANGL -9461BARREAU PHILIPPE 11968 11990011989011202810240.08 3MSANS -8108ARCANG PATRICK 11969 51990021989021381911365.41 3MSANS -7093HERAULTS DANIEL 1196911199408199308 9597 8728.82 3CSANS -3952LEDOUX VERONIQUE 21969 919910919900911389 9851.84 3MSANS -7563SUPER THI VIET 11971 21990081994011249910473.67 3MSANS -4441MIRAPOL DOMINIQUE 21971 819930619920611389 9851.34 3MSANS -2892LOTS THIERRY 11971 2199303199510 9597 8728.23 3MSANS -5535HOULGATES PASCAL 11971 6199607199507 7803 7681.13 3CSANS -2838PLAGE JEAN LUC ANDRE 11972 11992071991071420611638.68 3MTECHN -9036MERCEDES YVES 11972 51993101992101420611639.01 3CSANS -2537MONTSOURIS PATRICK EMILE 1197211199505199505 9597 8727.87 3MALLEM -0228AUBERTS JACQUES YVES 11972 6199404199201 9597 8729.43 3CVENTE -5626VERNEDE ROGER CL 11973 41994101993091450311831.06 3CSANS -6525AVES SYLVIANE 21973 2199204199104 8656 8145.93 3.TECHN -9781OLLIER ANNE MARIE 21973 619931119921111389 9850.97 3CSANS -1379ROSTAND PIERRE 11974 4199507199504 9126 8457.54 3MSANS -5204CRAVANT DOMINIQUE 11974 1199601199501 7803 7681.40 3CSANS -6619HORIZON JEAN MICHEL 1197410199606199506 7803 7681.44 3CANGL -5826VALBONNE ANTOINE 11974 71993091994081202810240.77 3CMICRO -0256GRANG DOMINIQUE 21974 5199508199408 7590 7563.95 3MTECHN -4230FAISANDERIE ANNE MARIE 21974 819930819920811389 9852.69 3MALLEM -4212ORME HERVE 11976 8199606199506 7803 7681.44 3CSANS -6753PINTADES HERVE 11977 9199608199508 7803 7679.99 3CANGL -7715VAILLANT CHANTAL 2193111198801199302 7677 7603.76 4.ALLEM -8632CLAIRETTES JACQUES 11935 51964081994011557012566.54 4MSANS -3535CASANOVA THIERRY 11936 91963081995112022115555.22 4MESP -1574AVENUE PIERRE ALAIN 11936 719890119920811131 9657.20 4MINFOR -4591VINCIN NICOLE 21939121966071993012137316332.68 4CSANS -3788POTERIE MICHEL 11939 81972061990011403411520.75 4MALLEM -0118BRETHON GUY 11939 419871119950310407 9270.03 4MSANS -2869LIMERGUE BRIGITTE 21939 91963041991072273717260.91 4CANGL -8403BOSQUET FABRICE 11939 81966071990011433211714.79 4MSANS -3617VATA JEAN 119401019930819910110407 9270.62 4MSANS -4772SAENS BERNARD 11940 719900519890510024 8999.04 4MSANS -3869MARIUS MIREILLE 21941 81961101995072137316330.70 4VESP -3900PERDONNET PHILIPPE 11941 119921219911210407 9270.44 4MSANS -7958CARDINALE ROSELYNE 21942 21963101992072137316331.25 4MSANS -9381LOTOS CAROLINE FREDERIQUE 21942 11968011990011932314934.90 4MESP -1020FLORIDE KATIA 21942 71972071993111834514276.10 4DSANS -9843MEON GERARD 11943 41973101991011621213032.20 4MSANS -0204GAILLARD CHRISTIANE 21944 71964071993012137316331.82 4MSANS -1733VUE CATHERINE 21944 61963111992072137316331.78 4MVENTE -6248AYGUESVIVES MICHELE 21944 41970071991071684813421.33 4MANGL -4598FEUILLERAIE JEAN MARIE 11945 219890119910610791 9502.23 4CSANS -3077SAPIAC ALAIN 11945 71971111991012470018542.09 4MANGL -2431RENAUDES NADINE 21946 61968111990012137316330.56 4CSANS -1120SATUR JOSIANE 21946 51969031990012137316331.03 4CSANS -0145ITALIENS EDITH 21946 81968111984062470018540.30 4CSANS -4624COURDIMANCHE JEAN LOUIS 11947 81968121989102273717259.95 4MTECHN -8599LONGCHAMP JOSETTE 21948 7199201199101 7803 7679.49 4.ANGL -3219SERNAGLIA FREDERIQUE 21948 51969031968031326611016.35 4MMICRO -7793ANATOLE ERIC 11948 519910119941010024 8998.50 4MSANS -4753VENT JEAN MARC 11948 61970011988012273717261.76 4MSANS -5892CHARLEROI MARTINE 21949101968111992091834514275.70 4DSANS -8687GOELETTES JEAN LOUIS 11950 91975041995011578112721.71 4MSANS -5669ADRIENNE CATHERINE 21950 61972101991072017815517.59 4CESP -2743CLAIR MARC 11950 11978031994011369311286.26 4MANGL -1234DAMPIERRE MICHELLE 21950111969081995042334017608.88 4MSANS -9403LECLERC CLAIRE 21951 71971071991042137316331.51 4MSANS -0934ENCLAVE JEAN CLAUDE 11951 21981051990041621213033.38 4MALLEM -9416BLEU JEAN CLAUDE 11951 21976051991011369311286.78 4MSANS -9196PYANDIERE MARIE NOELLE 21951 41982021981021326611016.03 4MSANS -3568MOISSAN JEAN PAUL 11952111976071991071578112723.29 4MALLEM -7750TONNELIERS MARIE 21952111973011993071471512024.35 4MINFOR -2095MARS BRIGITTE 21952 81984011992011288210744.49 4DMARKT -4777GORBIO MARIE DENISE 21953 61973061991011578112723.74 4MALLEM -8945VASSY MICHELLE 21953 11973051993041471512025.88 4MSANS -3712MAURUCHES PHILIPPE 11953 819860119850111131 9658.99 4MALLEM -6740EUZKADI JOEL 11953 11973031990071578112722.87 4MANGL -7024BRUSC EVELYNE 21953 71976041991121578112723.36 4MMICRO -8219INFIRMERIE JEAN PAUL 11954 91980051990101608112916.59 4MANGL -5540BRUAND DANIEL 11954 51974031993031684813422.75 4MANGL -7460MATISSE MARGIE 21954 61975041991101578112723.42 4MANGL -2655THEZAN MONIQUE 21954 91975081991091578112722.28 4MSANS -9672BORON ERIC 11955 51975081992102017815516.74 4MSANS -8145BOULETS DOMINIQUE 21956 1199105199005 9894 8921.63 4MSANS -3110CERF VALERIE 21956111993081992011249910472.37 4MTECHN -7652BAY PATRICK 11956 71976071992011578112722.47 4MCOMPT -4074FRANK DANIELLE 21957101992111991011202810241.17 4MSANS -4741ESCOUTADOU FRANCOISE MARIE 21957 2198901198505 8656 8145.06 4.ANGL -0933SOUCARRADE BEATRICE 21957 5199312199212 9894 8922.21 4MALLEM -7852CAILLOTS CLAUDINE 21958 71978091992091471512025.14 4MSANS -5344THEODORE CHRISTINE 2195811199310199210 7803 7680.44 4.SANS -8813MILLIERE BEATRICE FRANCOISE 21959 51981071980071202810241.36 4MSANS -5426NATIONS ISABELLE 21959101981111980111463211946.14 4MSANS -4656TILLET FRANCOISE 21960 71983041982041608112916.59 4CANGL -8524ALLIER ANNE MARIE 21960 1199209199109 8656 8146.28 4.SANS -0380MARAINVILLERS NATHALIE 21961 2199410199310 8656 8147.15 4CSANS -1404FAISANS ERIC 119611219830319830811131 9658.86 4CSANS -6501MERICOURT FRANCOISE 21961 519951119941110668 9426.09 4MANGL -4607CHAPPEL CHANTAL 21961 41982091981091330611017.46 4MANGL -1959PEY JOSIANE 21961111982111981111608112916.95 4MALLEM -8843TIMSIT HUBERT 11961 61982041988011326611017.25 4MSANS -1688BENOITE JEAN CLAUDE 11961 91987071992121249910472.51 4MTECHN -5712FOUENT VINCENT EMILE 11961101983071982071326611016.03 4MSANS -7184FRANCE RAYMOND 11961 419880319870310024 8998.35 4MINFOR -5235HAUTS YANNICK CLAUDE 11961 819871019861010791 9503.90 4MVENTE -6310PEYRIGOUE PATRICK 11962 81982031989071326611016.78 4MALLEM -5397COURCELLES MIREILLE 21962 9198810198505 8656 8145.89 4.SANS -4469PASSELEU CHRISTIANE 21962 41984011983011381911366.72 4MANGL -8234MAIAUX BRIGITTE 21963111991071991011249910473.22 4DANGL -9770JARD MINELLE ODILE 21963 91988111987111249910471.84 4MSANS -5324CERF CLAUDE 11964 419870719920510791 9503.34 4MSANS -9061ROMAGUE MARTINE 21964 71983111982111326611016.12 4CANGL -8920PORQUIER DANIELLE 21964 41987021986021527112374.66 4CALLEM -7098CHATENAY ANDRE 119641119841019831010791 9503.94 4CVENTE -8128PRECONIL YVES 11965 71988021987031527112373.94 4MSANS -6719KEFYSSIA CHANTAL 21965 319940619920111389 9851.03 4MSANS -6244MANGEON MICHELINE 21965 8199402199304 7803 7680.34 4MINFOR -3461LUCIA CHRISTIANE 2196610199308199208 8656 8145.56 4.ANGL -9241ROTOURS PIERRE 119661119900819890810024 8999.13 4CSANS -6268TOURING GENEVIEVE 21966 1199403199303 8359 7952.46 4MSANS -4829COLLES EMILE 11966 419910719900710024 8998.31 4MESP -0750CADET YVES 11966 919860419850410791 9503.79 4MTECHN -0057ESCALE THIERRY 11967 71989021988021450311831.93 4MSANS -9924CHINON BRIGITTE 21968 8199207199107 8656 8146.65 4.SANS -7821AILES CECILE 21968 41991051992111202810239.81 4CSANS -7114LANCIER WILMA 21968111994031992011202810241.07 4CESP -4765TILLEULS JEAN 11969 51992041994011249910472.59 4MINFOR -4429EDOUARD FRANCOIS 11969 319890419921010407 9272.09 4MINFOR -1431GIORDAN SONIA 21970 5199201199101 8656 8145.51 4MANGL -9920BOUIN CATHERINE 21970 919900419890410876 9502.28 4MSANS -5522AURELIA MARIE CHRISTINE 21971 31993031993051267210590.24 4MSANS -7479TRINITE NOEL 11971 3199604199504 7803 7680.36 4MSANS -3516GASPARDES KUMIKO 21971 41993061992061267210590.05 4MSANS -5784BOITE REMY 11972 819910619900610024 8998.26 4CANGL -1143MACORNAY ROGER 11972 6199212199112 9597 8728.58 4MSANS -0244FEUQUIERES CLAUDINE 21972 719921019911011389 9851.57 4MSANS -0161LONGAGES FREDERIC 11973 119920819910811389 9852.02 4MSANS -5206TISSOUS ELIANE 2197311199405199305 8359 7951.97 4CESP -6992FOUGERAIE JEAN YVES 119731119931219921211389 9852.45 4CSANS -3522REST ANNICK 21974 9199306199206 7803 7680.08 4.TECHN -9573FONTAINE CATHERINE JEANNE 21975 2199407199307 7803 7679.87 4CSANS -5048HAUTES JEAN RENE 11975 619961219951211389 9850.74 4CSANS -1152QUARTIER MARTINE 21975 6199408199308 9894 8921.41 4CSANS -0049LAUNAY NOUARA 21976 6199607199507 7803 7679.85 4CSANS -4557ROBARESSES HELENE 2197611199507199407 7803 7680.53 4CANGL -4244GEMEAUX DANIELE 21977 9199608199508 7803 7679.33 4CALLEM -0257PUNAAVIA GUY 11935 219930119920110407 9271.82 5MSANS -4173ALPINS FRANCOIS 1193510198811198505 8827 8263.65 5.SANS -5358CHEVRY JEAN DENIS 11936 9199503199201 9085 8418.03 5MCOMPT -4903WILSON SERGE 119361119890119930210791 9503.49 5CMANAG -2411BINEAU RENE 11937 41970081991011433211713.71 5MSANS -5097OURS MADELEINE 2193910198810198506 8656 8145.20 5.SANS -1099VILLAINE YAN CLAUDE 11939101968061990011433211713.58 5MINFOR -0060ATTAMRK CORINNE 21939 41962061983102470018542.06 5MSANS -7199LECONTE EDMOND 11940 51972061995012201216757.94 5MSANS -7870PIA PHILIPPE 11940 71967071991101433211715.00 5MSANS -4990ROSSAYS SERGE 11940 21963091988012273717260.31 5MSANS -3381BUSSEROLLES ISABELLE 21940 8199505199201 9085 8418.09 5DSANS -0099RAHAL PHILIPPE 11940 11961051984062470018541.16 5MSANS -5909TOURRETTES LILIANE 21940 91961101983102470018540.93 5MTECHN -8941BEZIERS CLAUDE 21941 11961051992102137316332.72 5MSANS -7223CHARMETTES MARCO 11941 41972091991011433211714.06 5MSANS -8980LARMINAT FRANCOISE 21941 4198910198512 8656 8146.16 5.INFOR -1164PROVENCAL NICOLE ALIX 21942 91968101991072273717260.89 5CSANS -7010DELOISON SYLVIA 21942 51968121991101932314934.72 5MSANS -3304ROSES MARIE THERESE 21942 81968091993111834514275.11 5MSANS -7469BUTTE MARIE FRANCE 21943 21962121991072273717261.13 5MSANS -8184VANNES MARC 11943 11971051994011621213032.96 5MSANS -1647CLAIRES CEDRIC 11944121969011991011433211713.67 5MTECHN -0926BEACH CLAUDE 21944 41970041991101932314934.45 5MANGL -3781COULANGES CHRISTINE 21944 61965021992091932314934.21 5VSANS -7004GUILBAUD MARTINE 21944 41966061995042137316330.61 5MSANS -5511CAPUCINS JACQUELINE 21944 41965121990082470018540.74 5MSANS -0535OLLIERES MARIE JOSE 21944111964071993072137316331.95 5DALLEM -6700DOLET FREDERIC 11944 91973041992011403411521.64 5MSANS -9005SUCE LYDIE 21945111977061992011471512025.50 5MTECHN -2933PEGOMAS MONIQUE 21945 81982061981061326611016.62 5VALLEM -1543GATTIERES MICHEL 11945 81970091991041433211715.59 5MSANS -0725AUBIERS PHILIPPE 11945 91976051993011369311286.75 5MANGL -2098ENTREES ANNY 21945101968061994102666519899.56 5MSANS -8761WAGRAM JEAN FRANCOIS 11946 21971101988061932314935.35 5MTECHN -2003PAULINE AGNES 21947 2199303199203 8656 8146.59 5.SANS -1732RELAIS GILLES 11948 31970031993111834514274.96 5MSANS -6970THIERS MICHEL 11948 71970101994071834514274.42 5MALLEM -4216HUGO FRANK 11948 21971031991012990722149.47 5DALLEM -6627ABBAYE GERALD 11948 619810319800311389 9850.65 5MANGL -5230DUNANT PHILIPPE 11948121983101993041326611016.87 5MANGL -2460POINTE DENIS 11949 51975081992011578112722.47 5MANGL -7858ARBONNE FRANCIS 11949 71974081992012470018541.70 5MSANS -3903CHAMPAUBERT PIERRE J 11949 41976101992011369311286.24 5MANGL -8857DIVE MYRIAM 2195012199311199211 8656 8146.88 5.SANS -0497KARINE JEANNINE 21950 5199311199211 7677 7604.39 5.SANS -3876SANGUINAIRES FLORENCE 21950111970021991091834514275.86 5MTECHN -3265PAVILLON PHILIPPE OLIVIER 11950111970041987102470018542.13 5MSANS -2421VERDIER MARTINE 21950 41970071994031834514274.80 5MANGL -8685PROVENCALES JEAN MICHEL 11950 11978061992121471512026.06 5CANGL -6880CHARONNE GISELLE 21950 21971031994071834514275.47 5MCOMPT -3995BELLEVUE CHANTAL 21950101977011992011471512024.48 5MSANS -1936MANHASSET JULES 11951 31970101991021834514276.22 5MVENTE -8771MAURIN JEAN MICHEL 119511119930819910110791 9503.74 5CSANS -8918MORON DANIEL 11951101971031986072470018541.02 5MCOMPT -7486HAUTACAM JEAN PIERRE 11951 11979061992011249910472.78 5MSANS -8979PARE LUCIEN 11952 41973071991041578112723.72 5MSANS -8316MOUSLIM PASCAL 11952 31972051990071621213032.39 5CSANS -0252AUNES CLAUDINE 21952 71972051992111684813421.69 5MALLEM -4525CHAVONNES FRANCOIS 11952 31976111992071578112721.79 5CANGL -2153CROULEBARBE JEAN JACQUES 11952111972121994011684813423.34 5MSANS -4523PITARD JACQUES 11952 91973081990123417325097.24 5MSANS -0877MILLION CLAUDE 11952 31974121992012017815516.65 5MALLEM -0553CRABERE HERVE 11953 91979051992121471512025.97 5DANGL -4593COLLINES FRANCOISE 21953 81973051994031911114779.59 5CSANS -5525MILLY JEAN HUGUES 11953 11976091991012022115555.39 5MSANS -8419CREMIEUX CHRISTIAN 11953 71972071991072137316332.68 5MSANS -5466CHENEY JOSE 11953101977031994011578112723.31 5MALLEM -8647MOTHE DOMINIQUE 11953 21984071992051326611017.10 5MVENTE -7550BORDEAUX GILBERT 11953 8199006198709 8656 8146.61 5.VENTE -5317SIMAREGRE MARION 21954 21975081993071608112916.88 5MSANS -7895BEAULIEU ALAIN 11954 41982031994011471512025.55 5MSANS -7110BRUNES MICHELINE 21954 91977011994011471512024.69 5MSANS -9833MOULINS FLORENCE 21954 3197505197405 8530 8066.58 5MSANS -9346RIVIERE BRIAN 11955 31980081992011249910473.42 5MESP -3155ALAUDA CATHERINE 21955 51977051993071471512025.55 5MSANS -4303MARJORIS PATRICK 11955121980041992121369311286.96 5MSANS -8955LACRETELLE ANNE 21955 419960719950710668 9426.57 5DSANS -0292ENCLOS CHANTAL 21956101977071977041834514275.97 5MVENTE -7044ENGHIEN GERARD 11956 11978061992041369311286.93 5DESP -3352LOZERE SERGE 11957 81983021991092529918968.46 5MANGL -7626HENIN PHILIPPE 11957101986081993011168610046.99 5MALLEM -1198MARTYRS WILLIAM RENE 11957121977031991052043315671.24 5CSANS -4601CEYZERIEU PHILIPPE 11958101979121987111684813421.72 5MSANS -6850BEAUSOLEIL BRIGITTE 21958 81981031986021527112374.79 5MANGL -0505CLAPIERS MARIE CLAUDE 2195810199403199303 9126 8456.57 5MSANS -6127MONTEE CHRISTINE 21958 31980091994071471512024.15 5MSANS -4080FOCH SERGE 11959 319810319810511131 9658.24 5MSANS -8151ECUREUIL OLIVIER 11959 21989071996012815620945.31 5.TECHN -2121BOURDAILLERIE SIMONE 21959 11979071993041471512024.56 5MSANS -5078FERNAND ANNE MARIE 2195912199110198510 8656 8146.61 5.SANS -2667BERGERE PIERRE 11959 51978061985041684813422.48 5MANGL -2407SOLEIL NADIA INGRID 21959 61989061988061249910472.73 5MTECHN -2235VILLEMARECHAL GERARD 11959 61983061989121326611017.72 5CINFOR -0110ANDRE NADIA 21959 319930519920510363 9233.61 5MANGL -4644AVIGNON CHARLES 11959 519830319920611131 9657.56 5MANGL -7070MONGE HONORINE 21960111980051985061608112916.23 5MSANS -8043EGAL LIVIA 21960 11985101984101288210744.85 5CTECHN -5249THEODULE REMY 11960 41987051991041949415052.11 5MALLEM -7737CLUB ISABELLE ANDREE 21960111980061994011471512025.77 5MANGL -3853DZOANH CHRISTOPHE 11960 61988101994041288210744.58 5MANGL -2653MARSACQ CLAUDE 11960 31985111984112256617146.01 5MTECHN -6452POSTFACH ALAIN 11961 31985081984081288210744.98 5MTECHN -0681LOGE PASCAL 11961 11985031991021527112372.86 5MSANS -9537JEAN MICHEL 11961 31988061991121249910471.84 5MVENTE -6327NOUES ANTOINE 11961121982101981101608112916.14 5MSANS -6682VATONNE BRIGITTE 21961 71982011981011608112916.65 5MSANS -9847GAMBADES JOCELYNE 21961101982011981011288210744.17 5MANGL -6375GAUTIER CLAUDUNE 21961101984071994011450311832.63 5CINFOR -6651RIVA PIERRE 11961 919830619820611131 9657.62 5MSANS -1485REUILLY JOSETTE 2196212198901198603 8656 8146.41 5.ALLEM -9501BETHUME MICHEL 11962 81985031993041326611016.65 5MSANS -9435PROVENCE JEAN MARC ROBERT 11962 919940919920110024 8999.30 5CSANS -6492VENDELAIS DANIEL 11963 119830419820411131 9657.66 5CINFOR -9242REVELLATA BRUNO 11963111987071993041288210744.41 5MSANS -4454ETANG BEATRICE 21963 31983081982081326611017.61 5MESP -7265AMPHYTRION JOEL 11963 31990091993041249910472.78 5CSANS -2299ADRIAN ALAIN 11963121988101987101288210745.70 5MESP -8642ALE MYRIAM 219631219940719930411389 9851.34 5MALLEM -9850BOULOURIS CHARLY BERTRAND 11963121987091986092090215980.25 5MINFOR -3445COLOMBE SYLVIE 21964 319870619860611389 9850.74 5MSANS -1844GUY PAUL 11964121985121994011433211715.27 5MANGL -7102QUINQUENAIS MICHEL 11964101984091994041574112685.17 5MSANS -1584KERVENEL JEAN CLAUDE 11964 71984061987121288210745.76 5MANGL -2604LIBERATION FRANCOIS DANIEL 11964 819841019840810791 9503.36 5MSANS -0403HERMITTE PHILIPPE 11964 61983051993051527112374.04 5MSANS -5722CHATAIGNERAIE LIONEL 11964 91983121992061527112373.67 5MSANS -3237HUYMANS MICHEL 11964 21984021990011527112372.81 5MALLEM -5398TASSIGNY CHANTAL 21964 51988111987112090215981.24 5MSANS -1027VRAUX PHILIPPE CLAUDE 11965 91993091993031202810240.76 5MSANS -3198BERIN DENIS 11965 81987011994091693613499.07 5MANGL -1036MADAME EDOUARD 11965 81986091985091288210744.77 5CSANS -6124ABELIAS DELIA 21965 519940919930411389 9850.65 5MSANS -1462BLANCHE MARIE FRANCE 219651219940319930311389 9852.60 5MTECHN -0587ORMEAU GENEVIEVE 21965 51990011989011249910471.76 5CSANS -8260BROSSAY JEAN PIERRE 11965 319931119911010407 9270.24 5MESP -8146BROC ANDRE PAUL 11966 319940219920110024 8998.37 5MANGL -8310HOTTINGUER ISABELLE MADELEINE 21966 1198906198512 8656 8145.98 5.INFOR -6654TAHITI MARIE LOUISE 21966 6199501199401 9597 8729.13 5MSANS -5470LAGARDELLE XAVIER 119661119900719890710407 9271.97 5MSANS -8823ROUCHERETS EVELYNE 21966 61985101984101249910472.06 5MTECHN -8327BARRELLET PASCAL 11966 41987021993121288210743.92 5MTECHN -8879GROULT ANNE MARIE 21966 41993011991011202810241.70 5CANGL -5928DREZERY ALAIN 11966 91989081988081539912453.11 5MSANS -3229THOMAS SABINE DOMINIQUE 219671019940519920111389 9852.59 5MTECHN -1136BRECHE MARIE AGNE 21967 3199601199501 9126 8456.70 5MANGL -5446POMMERAIE GUY 11967 8199606199506 8656 8145.80 5MSANS -0654CARAVELLES ROBERT AH 11967 81989071989021450311831.55 5MANGL -0015TAVANNES LOAN 21967 419930619920610024 8999.72 5MINFOR -8197NETTER GILBERT 11967 61987051994041249910472.06 5MSANS -5236PASSERO MARC 11967 8199309199209 9085 8418.26 5CSANS -3054WILSON GERARD 11967 119870919860910407 9272.09 5MSANS -9725GUILHEM DANIEL 11967111990021989021539912451.67 5MSANS -6092CLEME MARIE CHANTAL 21968 3199201199101 8656 8146.46 5.SANS -2456HOLBERN FREDERIC 11968 2198902198802 7207 7448.96 5.ANGL -6716VILLERSEXEL TANGI FRANCOIS 11968 2199306199206 9597 8727.78 5MSANS -6119RAVAS ANNE MARIE 21968 6199502199402 8656 8146.19 5MSANS -2294VILLAGE SYLVAINE 21968 91992041991041202810240.68 5MINFOR -8140CAMIN JEAN MARCEL 11968 51988121993121249910473.45 5CANGL -7302MERIDIEN MAURICE 11968 219880519910210407 9271.32 5MANGL -7914JOLI MAURICE 11969 31989041992121249910472.06 5MANGL -2148ESPAGNE BRUNO 11969 819920319910310024 8999.36 5MSANS -1823BOUCICAULT NICOLE 21969 519941019930411389 9851.82 5MSANS -9657MAGESCQ EMMANUEL 119691119920519941010024 8999.97 5CSANS -9896MIO JEAN 11969 11991101990101330611017.19 5MTECHN -8478SOURCE SIDNEY 11969 61989041988101249910473.49 5LSANS -6336HASARD ERIC 11969 4199305199205 9597 8729.63 5CANGL -5471LEVAINVILLE LAURENT 1197011199301199201 9597 8729.97 5MVENTE -5314HALLES JACQUES 11970121991101990101467711985.86 5MSANS -1685NORMANDIE MICHEL 11970 319900719890710024 8999.40 5CANGL -6830LAOUADIE GWENAELLE 21970 2199608199508 8359 7953.65 5MTECHN -1727CAUVETS MARTIAL 11970 7199311199409 9597 8728.99 5CSANS -5830BRIOLLAY JEAN PAUL 11970 21991011994011249910473.24 5MINFOR -8526CAMPION FRANCOISE 21970101991111990111202810240.91 5MANGL -6622TANANARIVE GILBERT 11971 51992071992091330611016.75 5CSANS -7788JOCELYN CHRISTIAN 11971 6199302199202 9597 8728.05 5CESP -2781SAFRENIER PIERRE 11971 8199301199201 9597 8729.63 5CSANS -6277PAULEL HERVE 1197112199403199201 9597 8729.54 5MANGL -6618NOTRE PIERRE 11972 519930919920910363 9232.44 5MSANS -6648SAKAKINI BERNARD 11972 319920419910911389 9851.24 5MANGL -8593JULLIEN JEAN PIERRE 11972 8199604199504 9894 8922.45 5CVENTE -8229CHANTELOUP CHANTAL 21972 11992101991101420611637.21 5MSANS -8361OUCHES FRANOISE 21972 4199508199408 7803 7680.80 5CSANS -3075LUMIO JEAN LUC 11972 41991111994011249910472.52 5LSANS -5865FERROLLES MARIE CECILE 2197210199403199303 7803 7680.27 5MCOMPT -0134SEVRES DOMINIQUE 11973 5199507199407 7803 7679.72 5CTECHN -4254HENIN SERGE 11973 3199409199510 9597 8728.17 5CSANS -8695AMBASSADE MARIE BEATRICE 21973 8199605199505 7803 7680.62 5CALLEM -4411DAVOUST FRANCIS ALAIN 11973 719930419940711389 9851.73 5CCOMPT -3332COUST JEAN PIERRE FLORENT 11973 2199507199407 7803 7679.46 5CSANS -4946SAUVAGE PATRICIA 21974 5199604199504 7803 7680.77 5MSANS -1918BABY DOMINIQUE 21974 519941019950810668 9425.45 5MINFOR -6316CORENTIN MARTINE RENEE 21974 119930919920911389 9851.84 5CANGL -3700PROSPER MARTINE 21974 4199508199408 7464 7524.42 5CANGL -2405COUDUN WALID 1197411199605199505 7803 7679.55 5CALLEM -7545DELEY MARTINE 21975 2199606199506 7803 7679.91 5MSANS -3372HARRETCHEVERRIA FRANCISCO 11975 3199506199406 9894 8921.49 5CALLEM -4733SIMON CATHERINE 21975 9199608199508 7464 7525.73 5CESP -3419LAVIROTTE MICHELE 2197510199507199407 7803 7679.76 5CALLEM -3469VASNIER CORINNE 21976 6199607199507 7803 7679.73 5CSANS -7472VERLAI JEAN MARIE 11977 3199606199506 7803 7680.84 5CSANS -5601PEYNIBLOU ROBERT 11977 1199606199506 7803 7680.44 5CANGL -3668NARCISSES MARIE FRANCE 21977 9199606199506 7803 7681.07 5CSANS -9202GARE BRIGITTE MARIE MADEL21977 3199507199407 7803 7679.58 5CTECHN -4110KEROUAL FABRICE 1197711199607199507 7803 7679.54 5CSANS -3531OUCHE ALAIN 11935 31965081995011557012568.13 6MSANS -3428DAUPHINS NOUNA 21935 81967011990071578112723.50 6MSANS -8594BAIE JACQUES 11936 51962021994033844228045.97 6MALLEM -1267ORGE GERARD 11938 41964041994011557012567.81 6MSANS -7513PINSONS PATRICK 11938 41963071995082947921839.78 6MSANS -4234DORMANT CHANTAL 21939 71970011991011932314934.66 6CINFOR -4904PANORAMIC LAURENCE 21940 9198901198610 8656 8146.50 6.SANS -3727GUYNEMER VERONIQUE 21940 51972051989101621213032.21 6CSANS -8364COUDERC ANNICK 21941111973101990071621213033.61 6CANGL -1743VALLEES GERARD 11941 71970041995062470018540.61 6MANGL -5058LIBERATION THIERRY 11941111973101991011403411521.37 6MSANS -8875BRAILLE CLAUDE 11941 71974041989101834514274.74 6MSANS -5325HESPERIDES JACQUES 11942 81963041991072273717260.64 6MANGL -9083PONS JEANNE 21942111972101994041894014662.64 6MSANS -3082SIROIS JEAN 11942 11965111989071663613342.67 6MANGL -0164ENCRABE DOMINIQUE MARIE 21942 8198810198410 8656 8145.03 6.ANGL -5264PARLY MARIE HELENE 21943 61963031993032922321685.16 6MANGL -3102GRDE GERARD 11943 11966061991012470018540.24 6MANGL -6225GRAVAS GILBERT 119431219750819881211389 9852.47 6MINFOR -0486TOCQUEVILLE MICHEL 11943 71965061990012470018541.72 6MSANS -6103DAUDIN MICHEL 11943 31971081991071433211713.97 6MANGL -9562JULES MARYSE 21943 71962091984062470018540.75 6VANGL -1659EVANS MARIE NOELLE 21944 21963121994072137316331.91 6MSANS -5753SAXE BERNARD 11944 51964111985063200223582.85 6MSANS -5551AMBROISE GILES 11944 21972081991012470018541.97 6MSANS -2734FELICE PHILIPPE 11945 91970051991011433211715.24 6MSANS -2627SAVIGNY ANDRE AUGUSTE 11945 71964121990052470018542.04 6MSANS -2707VAUGIRARD HELENE 21945 8199407199307 7590 7562.63 6MSANS -0420DARDOUNELLES DANIEL 11945 21971021990011433211714.52 6MINFOR -0574JAURES MARC 11946101972081994011663613343.70 6MANGL -4658BORA JEAN PIERRE 11946 31973091992011403411520.69 6MMARKT -2852BERLIOZ PASCAL ALAIN 11946121969111991012273717260.45 6MSANS -9183STATION BERNARD 11947 61976101991011283810705.62 6MSANS -7225BONSECOURS ANNE 21947 51976071993111471512024.74 6DSANS -5915ANTILLES ISABELLE 21948 61969081995101433211714.47 6MSANS -7173GIOTERAIE ROBERT 11948 61967111986042470018541.91 6MANGL -7940NICOT ERIC 11949121974041992011403411520.15 6MSANS -6066CLEMENCEAU YVES 11949 31971041995012201216756.31 6MSANS -8113VITRY DOMINIQUE 21949 7199311199211 9597 8728.28 6DVENTE -6047TASSIGNY THIERRY 11950 41973081994122470018541.72 6MTECHN -9002BERRAT BRUNO 11950 51977051993041369311286.29 6CANGL -8038AUDIBERT PATRICK 11950 719770119931211389 9850.58 6MINFOR -4759BLANCHE MAYAKO 21950 51970101991071578112723.11 6MSANS -6982CYRANO DANIELLE 21950 51974111991071578112723.74 6CANGL -9782BARRAGE CLAUDINE 21950 3199109198902 8656 8146.01 6.ANGL -4552ABBADIE MONIQUE 21950 61976011991101578112722.87 6MANGL -3112AGENT DANIELLE 21950 11993121992011202810240.31 6MESP -4893GRANDE ISABELLE 2195012199507199301 7677 7604.70 6MINFOR -6863FERTE MARIE JOSE 21950 71970101991012137316330.65 6MINFOR -3487TALARIC MICHELINE 21950 21973101991071578112722.51 6MANGL -7125FERRAYONN JEAN MICHEL SERGE 11951101977101994041249910473.47 6MVENTE -5445RON DOMINIQUE 11951121971101991013200223582.31 6MSANS -0070PLASCASSIER DANIEL 11951121975051991011369311286.30 6MSANS -0688PARGAMINIERE JEAN 11951101976061993011369311286.15 6MSANS -0032FOUR CLAUDE 11951 61975111991011684813421.95 6MCOMPT -2442BOULOC MARIE FRANCOISE 21951 31974051986052334017609.66 6MALLEM -3898KENNEDY YVES 11951121977101991011369311287.25 6MANGL -8228LEFRANC JEAN LOUIS 119521219931119910110791 9502.26 6MSANS -7142LEGER VINCENT 11952 81976051991011684813421.99 6MANGL -0571DOMINICAINES JERZY 11952 31971101991013200223582.94 6MSANS -0382KERHAM CATHERINE 21952 21974041991071578112722.07 6MSANS -8150BEARN FRANCK 11952 21982091993011527112372.87 6MSANS -7995BAUDIN DANIEL 11953 91975051994011369311287.19 6MSANS -4159CHASSENARD JEAN BERNARD 11953 519870619860610791 9503.21 6MSANS -3964FAREMOUTIERS LAURENCE 21953 6199311199211 8656 8145.08 6MSANS -0454CHERBOURG ISABELLE 21953 6199610199510 7803 7679.81 6MVENTE -5111CROIZAT CHRISTOPHE 11953111973031990071578112722.69 6MALLEM -2014LISIERE XAVIER 11953 8198911199501 9894 8923.22 6MSANS -9741PARIS PASCAL ELIE 11954101978081991012022115555.53 6MTECHN -0737YERRES GERARD 11954 61976091995042529918968.84 6MTECHN -3053TORRE PAULE 21955 91976061995101881314585.97 6MVENTE -2120CORMEILLE JEAN LUC 11955 5199610199510 8656 8146.74 6MSANS -1540PIJOUNIE ANGELE 21956 51977021981091834514274.87 6MANGL -6259VICQ CATHERINE COLETTE 21956 219780719770710668 9425.82 6MSANS -8345DAGOBERT DJARN 11956 719820919871111131 9658.24 6MINFOR -3734GARNIER PASCAL FRANCOIS 11956101977081994042201216756.71 6MSANS -4365ESSO ANTOINE 11956121976061994011369311288.10 6MSANS -0262ROLLAT HERVE 11956111979081991012175716601.93 6MSANS -7989RHONE YVES 11956 71977051994041249910472.06 6MANGL -4035ISLIP ANNIE CLAUDE 21957 41993101992011249910472.06 6MINFOR -8638DUNOIS JACQUES 11957 51981031995062273717260.50 6MINFOR -6417ALBI RENE 11957111980091993121369311288.04 6MANGL -7559MARIENTHAL MONIQUE 21958 319940919930411389 9852.59 6MSANS -1621CAMBRIDGE ALAIN 11958 8199312199212 9597 8729.04 6MINFOR -3476CREPY ALICE 2195811198711198611 9511 8688.22 6MSANS -2482CHORON EVELYNE 21958 7199110199409 8656 8145.42 6.SANS -4165BALZAC MICHEL 11958 71985121995011433211713.76 6MSANS -9040FERDINAND CHARLES 119581219781019771011389 9852.24 6MANGL -6858CUVRAY MARTINE 21959 71980041994011471512025.82 6MMARKT -2723PAPARA FRANCOISE 21959 61980051994011471512025.70 6MTECHN -1222FOSSES MONIQUE 21959 21980041993121804514081.78 6MTECHN -8741BOULEVARD MICHEL JACQUES 11959 91979021993041471512024.62 6MTECHN -5441ZOLA BRIGITTE 21959111979081993071471512025.82 6MINFOR -9947ERMITA CATHERINE 21959 81982081981081326611017.38 6MSANS -2563FLORISSANT PHILIPPE 11959 51981071989052256617145.21 6MMANAG -3583MOLLAY JEROME 11959 81981031993051608112916.41 6MALLEM -6466ORMES ANNIE 21961 21981081995071433211713.85 6MALLEM -1432AGRIANT ROBERT 11961 31984031991091527112372.83 6MCOMPT -3657NOVEMBRE SERGE 11961 51986071992101527112374.36 6MSANS -5054FRANCK HUGUES 11961111984031983031608112915.87 6MALLEM -7313CRESTET JEAN PIERRE 11961 41984091994091326611017.55 6MSANS -1383ORIOL ANNE 21961 61983021982021288210744.01 6DSANS -9235DANTE JEAN MARIE 11962 71984031993081527112374.13 6MANGL -1924MALVEZIN MARTINE 21962111984071983071608112915.47 6MSANS -0722MUSSE JOELLE 21962101982081981081608112916.65 6MMICRO -2536BEAUSOLEIL DOMINIQUE 11962 219830419851210791 9502.17 6MSANS -3286DEEPFIELD GERALD 11962 319930819921210876 9502.09 6CSANS -9760CHAMPET MARTINE 21962121988101987101202810241.67 6DTECHN -0459FERRAILLONS NICOLAS 11962 819850919840910791 9501.95 6MSANS -9070ROUGUETS JEAN RENAUD 11962 919920519910510024 8999.54 6MSANS -5609MONNEGER GEORGES 11962 61984101993051527112374.00 6MALLEM -8699COLMAR CATHERINE 21962 21988061987061202810241.09 6MINFOR -0121PARAY JEAN FRANCOIS 11963 219830419920311131 9658.07 6MVENTE -9033TIMBAL FRANCOIS 11963 91991021991022529918969.60 6MSANS -0477HORTENSE ALAIN 11963 51984021992101527112374.84 6CSANS -9565CARRETIER JOSE 11963 81986121992121450311830.53 6MINFOR -5210BARTHOU PASCAL 11963 319850419850511131 9657.21 6MANGL -7365GALLAIS PATRICE 11963101984031983081288210745.79 6MSANS -3436TADJOURAH PATRICK 11964 51984061991011288210744.35 6MTECHN -0043HILLS JEAN MARC 11964 719840619830610791 9503.67 6SSANS -6646ROOSEVELT FLORENCE ANNICK 21964 51989111988111249910472.39 6MESP -5680PORSMORIC MARIE MADELEINE 21964 31983041982041326611017.97 6MANGL -6503MONCEY JEAN PAUL 11964 319940219930110024 8998.77 6MALLEM -9162BROSSOLETTE MARYVONNE 21964 91984111983111288210744.28 6MSANS -5895QUATRE DANIEL 11964 31984101993011616712994.89 6MSANS -3689ETOILE ALAIN 11965 31985051992011527112374.54 6MSANS -6754MAXIMIN JEROME 119651119930819920811389 9851.10 6MANGL -1818BOYARDVILLE KINEO 11965 919850519840510791 9501.83 6MALLEM -6998HONORE PATRICIA 21965 31989051994011381911366.18 6DSANS -0086COLLETTE SERGE 11965 41985091991121288210744.14 6MALLEM -2914ESPAGNET ERWAN 11965 21984051983051288210744.17 6MSANS -9284COLIBRIS JEAN JACQUES 11965 41993101992101330611018.00 6MTECHN -5732LEUTHREAU ALAIN CHRISTIAN 11965 11987081992011450311831.39 6MSANS -7234MARDELLE ROGER 11965 81986041993051450311832.14 6MALLEM -2688TILLEUL FREDERIC 11965 619930719940110876 9503.04 6MSANS -6325MIGNEAUX FRANCOIS 11965 419940119920110407 9270.44 6MANGL -0520PIBRAC STEPHANE 11965 219850819840810791 9503.76 6MSANS -5142HUBIES BRIGITTE NOELLE 21966 41991071990071202810241.79 6MCOMPT -2662PEYLONG GHISLAINE 21966 9199201199101 7803 7680.36 6.SANS -5787PRADIER PHILIPPE 11966 11987051994091693613499.34 6MALLEM -0594PARK GILLES 11967 11989101988101249910472.52 6MSANS -9155VIADIEU DIDIER 119671219940419920110024 8998.50 6MSANS -9944STRASBOURG ROBERT 11967121993061992061267210590.24 6MALLEM -0751MONTDAUPHIN CLAUDE 11967 819910319950610024 8998.80 6CANGL -6596INFROIT STEPHEN 11967 41990011994011249910473.45 6MSANS -2539CARTHY ANNICK 21967 41994071992011202810241.09 6MSANS -9966ENFERT BRIGITTE 21967 919930719920711389 9851.37 6MALLEM -8934REGNIER ANNICK 219671019950319930411389 9851.96 6MALLEM -1654LEADER MICHEL 11967101995101994101839014312.60 6CANGL -7794ANEMONES EVELYNE FRANCOISE 21968 11993031991011202810241.66 6MTECHN -5095BLAIRE MARIE JOSE 21968111989101988101539912453.06 6CSANS -3446RICHOIN JEAN PIERRE 11968121990091994121450311832.51 6MINFOR -0591FERON CHRISTINE 21968101994031992011202810240.76 6CSANS -6142SORBIERS ROSWITHA 21968 81993061992061267210589.60 6CSANS -4698JEAN GERARD 11969 51989101991091249910472.96 6MTECHN -9192SAVIGNE ALAIN 11969 31991011990011202810240.26 6MESP -0014NANTAUX ETIENNE 11969121994061992011202810240.46 6MANGL -6632JULLIAN FREDERIC 11969 9199102199002 8656 8145.20 6.SANS -1053MORTIER GUY 11969111992121991121330611016.35 6CALLEM -3261SUCHET MARIE THERESE 21969111994031992011202810239.91 6MSANS -4711BLANCHE ALAIN 11969121992121993031267210589.55 6MCOMPT -5942FLOREAL JEAN PAUL 11969 11990111989111381911366.49 6CVENTE -1744ESPAGNE JEAN PAUL 11969 119900219890210024 8998.41 6MESP -7503TOUCHARD ANNE MARIE 21970 21990111989111202810241.57 6MSANS -2585ESTIENNES JEAN 11970111993111992111330611018.18 6MANGL -8805CHENIER ROBERT 11970 71992071991071420611638.05 6MSANS -7438ROSELINES SYLVIE 21970101994031992011202810240.72 6CSANS -6724POTHONNIER MARIE JEANNE 2197011199206199106 8656 8146.42 6.SANS -5056POINCARRE KARINE 21970111994031992011202810241.45 6MINFOR -2915REILLE MICHEL 11970 7199602199502 9256 8533.59 6CANGL -3988ATALANTE BRUNO YVES 1197012199402199302 9597 8728.68 6CANGL -3548JOURDAN GUY 11970101994061992011202810240.35 6CALLEM -1071CHAROLLES JACQUES 11970 1199306199206 9597 8728.82 6CINFOR -7830BOCH BERNARD 11970 3199304199308 9597 8729.09 6CINFOR -7543REIN PIERRE 11970 9199501199401 8656 8146.05 6MSANS -0754ELANS EVELYNE 21970 5199010198910 8656 8146.07 6.SANS -0414CHARDON HERVE 119711019931019921011389 9852.65 6MESP -3628VILLACOUBLAY PHILIPPE 11971 919930319920311389 9851.12 6MALLEM -0150ADDAX MICHEL 119711219940719920110024 8999.70 6CVENTE -9176CAHEN HUGUES JEAN LUC 11971 219921019911011389 9852.24 6CSANS -2846COOLE SERGE 11971 1199403199201 9597 8729.70 6CSANS -2967LANCIERS KLAUS 11972 819930319920311389 9851.59 6CANGL -5218EXELMANS JEAN JACQUES 11972 1199210199101 9597 8727.83 6MMICRO -5276ALLEE JEAN JACQUES 11972 519931219921210363 9233.79 6MALLEM -7650FARLED DANIEL 119721119941219931210363 9232.28 6MTECHN -1760COURTILLE FLORENCE CLAUDE 21972 419940819920111389 9851.61 6MSANS -0061FLORIDA CLAUDE 21972 719930519920511389 9851.24 6CANGL -4799DUBAN REMY 11973121993011994011202810240.82 6CSANS -5516LUZAC BERNARD 11973 5199606199506 7803 7680.27 6CMICRO -2886KERINEL PATRICK 1197311199309199209 9126 8456.47 6CALLEM -2318BURNOL MICHEL 11973 6199310199210 9597 8729.58 6CALLEM -2243BASCH GEORGETTE 21973 319930919920911389 9852.41 6MSANS -9674JAUNE SANDRINE 219731219951219941210668 9426.66 6MVENTE -3507CAMPANULES GERALDINE 21973111994031993031267210590.14 6CTECHN -8457ROAD MARTINE 21974 719940619930610668 9426.03 6MSANS -5644PERROQUETS PHILIPPE ANDRE 11974 3199407199307 9126 8455.98 6MANGL -5222PASTEUR CLAUDE 11974 3199606199304 9126 8456.34 6CTECHN -2362GORBELLA ANNIE 21974 21994091994071450311830.61 6CANGL -3214NELSON JEAN YVES 11974 2199412199312 8359 7953.60 6CINFOR -2883CHEIRON MICHEL 1197511199611199511 9256 8532.96 6CSANS -3892LENNON NICOLE 21975 3199207199307 7803 7681.02 6.INFOR -2980ROASSAL JEAN MARC 11975 7199507199407 7803 7680.67 6CTECHN -3954BARONNETTE FRANCOISE 2197612199610199510 7803 7680.59 6CANGL -8734MARGUERITE ANNIE 21977 6199606199506 7803 7679.49 6CSANS -2986ROURE CLAUDE 11977 8199608199508 7803 7679.40 6CSANS -2812FABIEN CATHERINE SYLVIE 21930 1198905199501 8827 8264.04 7.SANS -4059LECOURBE FREDERIQUE 21935 41961101982052470018540.38 7VSANS -3810LACS ELIANE 21935 51961111987012273717261.07 7MANGL -1179VIES FRANCOISE 21935 1199306199501 8656 8146.82 7.TECHN -4536CAPUCINS JEAN PIERRE 11936 61958121993103200223584.44 7MSANS -5665CAMOIN MARIE CLAUDE 21936 8198910198511 8656 8145.15 7.SANS -5858BONODIERE MARIE CECILE 21937 41962071985102273717261.25 7MALLEM -3737MAREY ANDRE 11937101973071992011403411520.80 7MALLEM -3343ECLUSE SERGE 11939 21970081995062201216755.92 7MMARKT -7410MONNETIER MARIE JOSEPH GEORGE 21939 51963051991072273717260.50 7MANGL -9145ULI MARC 11940 31969061991011433211714.60 7MALLEM -4704MANOLA MICHELLE 21941 11961081987032572519241.16 7CALLEM -6915PLERGUER JOSE 11941 81973071992041403411521.34 7MSANS -1437DIGUE GEORGES 11942 11973071992011403411521.70 7DSANS -7658DOYENNES PATRICIA 21942 51964101992072273717261.07 7MSANS -3938DOMINE OLIVIER 11943 51971041991011433211714.10 7MALLEM -4424CORBEIL JEAN PIERRE 11943 81974051993011369311287.59 7MSANS -7614PHILIPPE MICHEL 11943 31963091986012273717260.13 7MSANS -3959RONCIERE MARIE CLAUDE 21943 21973071990041621213033.19 7MSANS -9296THABAS ANITA 21944 51964071990102273717261.39 7CALLEM -9017DELAPORTE ANNE PATRICIA 2194511199201199101 7803 7679.64 7.SANS -3629RAMBUTEAU JEAN PIERRE 11945121972061991071433211715.51 7MANGL -3070ETIOLLES MICHEL 11946 21975031994121471512025.95 7MANGL -3212CYCLADES BEATRICE 21946 31966121995072017815517.38 7MSANS -8064ARCANGUES MARIE CHRISTINE 21946 71969031984062470018542.19 7CSANS -4281GAURBETS CHRISTIAN 11946 319890119941110791 9502.01 7MANGL -0562BLANQUET ANNE 21946 6198810198511 8656 8145.21 7.SANS -2853MESTE MARYSE 21946 1199301199201 9085 8417.91 7MTECHN -4550CHEVRY CLAIRE 21947 71968041993111834514275.06 7MVENTE -2513EUDES SABINE 21948 11970041993121834514276.18 7MTECHN -2928HEYRAULT FRANCOIS 11948 21972041991012137316331.56 7MESP -8846LIGNIERES JEAN CLAUDE 11948 41975061991011369311287.77 7MSANS -0470POTEL PHILIPPE 11949 21974051991112043315669.51 7MCOMPT -7926OUSTAOU CATHERINE 21949 31970111988042334017610.69 7CVENTE -1398NOUVEAU MARIE PIERRE 21949111969101990012137316331.39 7CSANS -7196THIERS PASCAL 119501019800619790611389 9852.33 7MSANS -8076DELANNE COLETTE EMMANUELLE 21951 71971061990011621213033.43 7MSANS -8525VOISIN PIERRE 11951 61976051991071578112723.68 7MTECHN -7965DELESTRAINT MARIE CLAIRE 21952111973021992102017815517.91 7MALLEM -2553CONVENTION MONIQUE 21952 91978061992121471512025.64 7MTECHN -3819SOLEMAR ANNE 21952 81979061979021684813422.18 7CTECHN -3540SAISSY DANIEL 11953 81980081989041684813422.77 7MALLEM -1880GOUFFE JEAN CLAUDE 11953 71983061995011578112722.61 7MSANS -7620MOIRAX REINE 2195310199307199207 9894 8923.11 7MSANS -2953TOMBE PATRICIA GABRIELLE 21953 41975101991091578112723.06 7MTECHN -5507ALEXIS JOCELYNE 21954 41975011974011288210745.40 7MSANS -4941FONVAL MAX 11954 41978051994011369311286.83 7MSANS -4394BRIAND JOSETTE 21954 71975051995011881314584.61 7MALLEM -6207FOINS CLARISSE 21954121976071992011578112723.18 7CSANS -9748CHARVE MARIE CLAUDE 21954 1199103198801 9894 8921.67 7MSANS -9682TIPHAINE JEAN CLAUDE 11955101978091994041471512026.06 7MINFOR -1788NAJY ALAIN 11955 11975031991071578112721.89 7MINFOR -7956NOTAIRE FRANCOISE MADELEINE 21955 31977011981041684813422.41 7MSANS -3415PRAIRIE PASCALE 21956 719911219901210024 8999.63 7MSANS -9208ESCADENIERES JEAN FRANCOIS 11956 61984081993011471512026.22 7MSANS -0945MAISON HEIKE 21956121977021992011471512024.30 7MSANS -2271LANDE MICHEL 11957 41982021994011471512025.56 7MSANS -3201BANGKOKNOI CATHERINE MONIQUE 21957 41978081977081834514275.41 7MANGL -6914BANCHEREAUX JOSETTE 21957 31981051995041433211714.15 7MANGL -8957LAFFON BENOIT 11958111977091994011621213033.05 7MSANS -4169FOUBERT AUGUST 11959 819820519871011131 9658.59 7MANGL -7880DIV JOELLE 21959111982041981041330611017.86 7MMICRO -7448ORSAY SYLVIE 21959 11984111983111608112917.15 7MSANS -6126SAUVEUR ANNICK 21961 21981051980051288210745.75 7MSANS -7782PETRO CHRISTIANE 21961 4199004198706 8656 8145.57 7.SANS -3730PEREIRE FABIENNE 21962 51982091981091608112916.37 7MTECHN -4013TROUIN ETIENNE 11962 21987061993091839014312.81 7MTECHN -1602VINCENT MICHEL 11963 51986111985112090215979.83 7MSANS -1113AVENYE PASCALE 21963 8199407199307 7803 7680.81 7MSANS -5901GIORDAN JACK 119641119840219830210791 9503.99 7MTECHN -5007CASTEBELLE PATRICE 11964 41984061993121288210745.40 7MVENTE -5706QUIOU SUMIYO 21965121986091985091288210745.79 7MSANS -8009COULOMMIERES FRANCIS 11965 119880819870810407 9271.16 7CSANS -4505VERGNE IRENE 21966 61991031990031381911366.63 7MSANS -2764BALAN GABRIEL 11967 21988051992121249910472.84 7MSANS -5527CHAMIER BLAISE 11968 81992011991011381911366.84 7MSANS -9559OUSTALET JACQUES 11970 2199207199402 8656 8146.28 7.ANGL -9156GUILHERMY YUKO 21972 8199208199108 7803 7679.37 7.SANS -2342LAJARRIGE MARIE JOSE 219721219920719910710363 9233.39 7.SANS -0358MERINDOL JEAN PIERRE 11974 81995051994071288210745.57 7CALLEM -7473MERMOZ JACQUELINE 21931 7198810199501 8656 8147.15 8.SANS -7635DERAIN NATHALIE 21933 4198903199501 8656 8145.62 8.COMPT -2535TREVISE PHILIPPE 11935 61963081994122666519901.15 8MSANS -4757GERMINY MARIE LOUISE 21935 81954091982072273717260.53 8MANGL -5975FAVORITE MICHEL SERGE 11935121963041981052470018541.88 8MSANS -3758CALANDRELLES YVES 11935 51968021993011663613344.05 8MVENTE -3094TARN ANNICK 21935 61959081982052470018541.01 8MSANS -7689COURONNE MICHEL 11936 91958091995012666519900.32 8MSANS -0853COLLEDEBOEUF PIERRE 11936 71973031992041403411520.30 8MSANS -5252COSSIGNY PASCAL PAUL 11936 21964121989072947921839.52 8VSANS -2084HARET COLETTE 21937 5199605199505 7803 7680.09 8MSANS -8285MASSENET MARIE FRANCE 21937 81963091991072273717260.26 8CANGL -7176ROBESPIERRE PATRICK 11938111962121985072273717260.68 8MANGL -1151QUERCIOLO ABDELAZIZ 11938 31965111995011834514274.24 8CSANS -1464SANE CLAUDE 11938 9198801198604 8656 8145.80 8.INFOR -6980MARTIN CHRISTIAN 11938 71972101990011433211714.42 8MSANS -7189CUERS JEAN BAPTISTE 11939 81966071993011663613344.45 8MSANS -7123BOISSIER MARIE JOSEE 21939 61962121990102273717260.22 8CINFOR -7519VACHET CATHERINE 21939 11983081992011326611016.12 8MANGL -2640BARBERAZ MARYSE 21939 61967011989091932314933.85 8MSANS -1630GRACAY ISABELLE 21939 71966071991101932314933.67 8MSANS -6303DOUBLE YVELINE 21939 51964071994102666519901.01 8DANGL -8547BEAU SOPHIE 21939 71967071990071578112722.87 8VSANS -7642ROCHEREAU ANNICK 21939 41966061994072137316330.94 8MSANS -4913LAURICESQUE JEAN FRANCOIS 11939 619900719920710407 9271.92 8MSANS -0289CARIBOU ELISABETH 21940 21959051992091932314934.03 8MSANS -5838MAUPERTHUIS CLAUDE 11940111961061994053417325097.60 8MVENTE -1874GRANGES CATHERINE 21940 819940919920110024 8999.72 8MSANS -1504FONTENAY GERARD 11940 51963121988113200223582.58 8MSANS -9111MONTILS DENIS 11940 31973031992071369311287.46 8MSANS -8171VIVES FRANCOIS 11940101966071989071433211715.65 8MSANS -5585COLLEGE REMY 11941111971121991052022115556.35 8MSANS -6338ANSE FRANCIS 11941 11963071992041557012568.02 8MVENTE -9521ARBOUSIERS ANNY 21941 71963031993122334017609.66 8DSANS -5504HONORE MARC 11941101966071990011433211715.68 8MSANS -0434ROUGET ELIANE 21941 41961051994101684813421.91 8MINFOR -8697ROCHEFORT MARIE CLAIRE 21941 81963031991072273717259.86 8CANGL -5183NID BRIGITTE 21941111969011992121834514274.42 8MANGL -4171LAFFITTE ODILE 21941 6199201199101 7803 7679.41 8.ALLEM -9168OISANS DOMINIQUE 11942 61976101992011578112723.00 8MSANS -0577REDERSKAAI ANNE 21942 41971011994071834514275.68 8VSANS -4455LORREZ ERIC 11942 4198810198604 8656 8146.28 8.ESP -1456ALESIA LIONEL 11942 41963041984102470018541.64 8MANGL -6360QUESSINE PATRICK 11942 51962111993123200223584.16 8MSANS -9206RAVAGERS LUC 11942 71967011994121557012567.18 8MSANS -5506ORA MARCK WITOLD 11942 81964071992012470018540.60 8MANGL -0645MALOUET MYRIAM 21942 81962101991072273717261.18 8MSANS -2325LONGUERAIE GUY 11943 61975031990011433211713.61 8MSANS -6153LUNAIN LINETTE 21943 9198810198604 8656 8147.06 8.SANS -8628ANCIENS PATRICK 11943 21963041992032739020403.89 8MVENTE -7345FLORENT FREDERIQUE 21943 41962121987082470018541.61 8CTECHN -9650GODARD GERARD JEAN 11943121975021993011369311286.71 8CANGL -0047BEUNE YANNICK MARIE 11943 71962121984092470018540.80 8MSANS -9696RAFFET CHRISTOPHE 11943121993041992041642313188.35 8.ESP -2868MONTREAL SABINE PASQUA 2194312199401199301 8656 8146.11 8MSANS -9052ORANGE JACQUES 11943 61972071992011433211714.46 8MANGL -0622GEOFFROY MARTINE 21943111970091991101932314934.93 8VVENTE -5329VILETTE GUY 11944 21967121990041433211714.75 8MSANS -7979BORDS MAEVA 21944121964071993061834514275.97 8MSANS -0046GREENS BRIGITTE 21944 4199009198909 8656 8147.19 8.SANS -7861LAGACHE CAROLINE 21944121963111991072273717260.85 8MSANS -6041MAIRIE MICHEL 11944 61969101989056400345693.48 8MSANS -6790VAUX ARIANE ELIANE 21944 31964071993102137316332.47 8MANGL -7706NICOLE CHRISTIAN 11945 31966041995072137316330.79 8CSANS -3032VOIE CLAUDE 2194510199501199401 7803 7680.95 8CSANS -4678GASCOGNE LYDIA 21945 51966121993011471512025.37 8MTECHN -6211LEFEVRE MIREILLE 21945 61966021995042137316330.58 8MSANS -4373CHENAIE FRANCOIS 11945 419940919930910363 9232.55 8MSANS -6516SABLONS ROBERT 11946 91982011992101249910472.66 8CSANS -3672CORVETTE JOELLE 21946101968111992121834514274.53 8DALLEM -6368ALPES ANNE CLAIRE 21946 31965121993031834514276.15 8DTECHN -9883MATRUT NICOLE 21946121973041993041471512025.11 8MSANS -1004DUNOIS GERARD 11946111973071992121518612335.69 8MSANS -5302REMUSAT ALAIN 11946 11975051991011578112723.33 8MSANS -0673VASES DANIEL 11946 41969051995032666519900.02 8MINFOR -5739COUR CLAUDE 21946 3199512199412 8656 8146.09 8MSANS -0992EVENOS GERARD 11947 819941119920110407 9271.52 8MCOMPT -2791BERTHELOT ANNIE 21947 51977071991101578112723.00 8CSANS -7501GOUBET FRANCOIS PIERRE 11947121972121991071621213032.53 8MTECHN -8208PIERRAILLES MICHELINE 21947 91971011995011834514275.91 8MSANS -2702BLAQUE JEAN JACQUES 11947 11970061991102739020405.01 8MTECHN -8704COLLINE JEAN PIERRE 11947 119890119880110152 9116.67 8MSANS -4666HELLEN PIERRE 11947 61979021993041471512024.60 8MSANS -8568AQUILON ISABELLE 21947 11969011991012137316332.22 8MANGL -7824REVA JOSIANE 21948 6199003198608 8656 8146.61 8.SANS -9576MONTET LIONEL 11948 61969121994072470018541.95 8MSANS -3165HAUTS MYRIAM 21948 51970121991022022115555.81 8MANGL -9783THOMAS MARIE PAULE 21948 51971101990072022115555.44 8CMANAG -0892EPARGNE PIERRE 11948121973051990011684813423.29 8MSANS -8463GIMONT MARIE LAURE 21948111970011991071834514274.30 8MSANS -3612GLENAN ALAIN 11948 11973071990011834514276.06 8MSANS -3989AVENIR HERVE 11948 41979071992011249910472.66 8MSANS -1849GRASSE JEAN MARIE 11948 51974111992041403411521.97 8MSANS -5860GRANGES MARLENE 21949121969031989011621213032.26 8MSANS -0021ECOLES MARTIAL 11949 91981091992011249910472.37 8MSANS -5620BLANC MARIE SABINE 21949 1199107198704 8656 8146.01 8.SANS -9485MONT PHILIPPE 1194911198704198604 8656 8146.68 8.SANS -5814TERMES YVES 11949 41978021993121369311286.03 8MSANS -7863YESILKOY DOMINIQUE 11949 71969031990012137316330.92 8MANGL -0579HILARION ETIENNE 11949 31968121989021932314934.09 8MSANS -4379FORGERONS JEAN FRANCOIS 11949 11977041993011369311287.16 8CANGL -3965BOISGELOUP ANNE ANDREE 21949 81971011984082470018542.24 8MINFOR -8322FLAYAT RICHARD 11949 119800919860911389 9851.64 8MSANS -3220PLASCASSIER CATHERINE 21950 91974051991071578112721.53 8CSANS -2062NOIRAY GUY 11950 31993111992111642313189.25 8.SANS -1017COROT MICHEL 11950 11977021993041369311286.53 8CANGL -5913CITEAUX YVES 11950 61978031995082000715437.49 8MTECHN -4766COLOMBE GUY 11950 81972041989101621213033.97 8CANGL -8829CARCE ANNICK 21950 51970111991071578112723.22 8MSANS -5482ENTREPIERRES DOMINIQUE 21950 81974081991081578112723.00 8MMARKT -6118THEOPHILE PHILIPPE 11950 21970041995102666519900.36 8MSANS -6158PUYGARD PHILIPPE 11950121971041993103916628549.82 8MSANS -7664FRANCOIS HUBERT 11950 41974071993011369311287.46 8MANGL -3674HOP VINATIER ANNE ODETTE 2195010199507199407 8359 7952.07 8MINFOR -8401STADE YVES 11951121972051990011621213032.80 8MINFOR -4992SOLEIL MURIEL NICOLE 21951101972021991072137316330.58 8MANGL -4163FRESNAIE PHILIPPE 11951121977051991011684813423.49 8MALLEM -6140VERTE ICHIKO 21951 51972071993042017815516.20 8MANGL -7521SILLAT JOELLE 21951 71973081991021684813421.81 8MSANS -8682HUYSMANS DANIEL 11951 61977051993011471512025.47 8CSANS -4383JAVELOT CLAIRE 21952 21975041995101881314584.67 8MANGL -3010CARLA ANNE 21952 21972081980102470018540.07 8MSANS -5234BELLEGARDE GHISLAINE 21952 51972021991121608112916.45 8MSANS -4958NAPOULE ANDREE 21952 71974011973011288210743.90 8MSANS -8132ALDE PATRICK 11952 61971121989071621213032.29 8MSANS -6296ALEXANDRIE CATHERINE 21952 11973051994041450311832.36 8MALLEM -2851FEDERATION JACKY BRUNO 11952 419830419820411389 9851.21 8MSANS -2922TRIERE JEAN PIERRE 11952 21972041989101621213032.87 8MESP -4520BARONNETTES MICHEL 11952 51975121993011369311287.43 8MSANS -7884LEPINE YAN MICH 11952 11986061995071288210745.04 8MSANS -2916GRENADIERS LAURENT 11952 71977101991041578112721.89 8CSANS -6995CIVRY MARILYN 21953111975041993041471512025.05 8MVENTE -8042BERTHE DANIEL 11953 11976071993011369311286.57 8MSANS -4389CARPATODE JACQUELINE 21953 31974051993012017815517.95 8MSANS -4164THENIOUX THIERRY MICHEL 11953 31972071992072175716602.09 8DTECHN -9986ARS DOMINIQUE 21953111974051991071578112721.65 8MMARKT -2077VELETA CHRISTIAN 11953 81977121991071684813421.55 8MANGL -7207VICT MICHEL 11954 71979091994041249910472.66 8CSANS -0617ARBOUSIERS MARC 11954111981041991011608112915.62 8MANGL -6266PALOMBES ALEXIS 11954121978061994011578112723.22 8MSANS -3336REPUBLIQUE LOIC PIERRE 11954121986031991121288210745.67 8MTECHN -6034LAMOTHE ROBERT 11955 71976081994011369311286.38 8MSANS -8420COULEUVRE DIDIER BERNARD 11955 21978061994011369311286.30 8MVENTE -7021INVILLE JEAN MICHEL 11955 11975051994012397418037.86 8MSANS -2224EGALITE ISABELLE 21955121978031992021471512025.97 8MALLEM -3309HELENE ISABELLE 21955 41986041992011288210745.22 8MSANS -2341LANGUEDOC ANDRE 11955 61980081979081684813421.33 8MTECHN -5599KOETZINGUE MARTINE 2195512199402199302 7803 7679.49 8MSANS -1570ORB NATHALIE 21955 21976061992072043315669.60 8CTECHN -0095DUNOISE DANIELLE 21955 21977041981011608112915.51 8MTECHN -5288CHELLAH MARIE HELENE 21955 91976071991121578112721.88 8CALLEM -9228CARDINALE PATRICK 11955 81979071994101249910472.03 8MSANS -5668FOY MARC LAURENT 11955 419840319830710791 9503.63 8MSANS -2007NEUVILLE PHILIPPE 11956 31976091991011578112721.79 8MSANS -8560MAI DANIEL 11956121983041995101433211715.69 8MSANS -6777PALAIS ANNE MARIE 21956 21977071976071834514274.96 8MSANS -0514GRENIER MARIE CLAUDE 21956111978061992051471512025.43 8MANGL -2450MEYRAN CHRISTOPHE 11956 91978081990052022115554.36 8MSANS -0738CHATEAU SYLVIE 2195611199310199210 9894 8921.99 8MVENTE -4115MIROIRS LINE 21957 71977071981091834514275.11 8MCOMPT -2843BERRIERE THIERRY 11957 319930819940110876 9503.70 8MSANS -1706KERDANIOU FREDERIQUE YVELINE 21957111979081993051608112916.01 8MTECHN -3794MAL GERARD 11957 71989061993011326611016.03 8CANGL -4102ZOUAVES ALAIN 11957 51980051986112256617145.74 8MMARKT -6349GALLEU LAURENCE 21957101977021992011471512024.60 8MSANS -1461BORGHESE TEVA 11957 91977081995041249910472.91 8MSANS -1587CALIFO ROLAND 11958 6199305199201 9597 8729.39 8MSANS -1182GRANCEY VALERIE 21958 11978031992021471512024.17 8CALLEM -9993VALLON JEAN FRANCOIS 11958 21982031994011471512024.97 8MCOMPT -3559OR CAROLINE 21959111979081993071471512025.77 8MSANS -8859BERENGUIER MARTINE 21959 81980051993071527112373.49 8DSANS -9596SINGER MARIE ODILE 21959111981081980081326611016.26 8MALLEM -1614PIED JOCELYNE 21959101979081993071471512025.56 8MSANS -7872CASTELET CATHERINE 21959 31980101979101684813422.12 8MSANS -3066SCHWEITZER JEAN JACQUES MARIE 11959101984091993121326611016.80 8MSANS -6764EGEOIRES DIDIER PIERRE 11959 519890819880810407 9271.56 8CANGL -0114EGLISE ANDRE 11959121981101992101608112917.19 8MANGL -8832ISOLA ERIC 11959121981061993121471512025.47 8MSANS -0083BRUZETTES JEAN PAUL 11959 31984081991061326611016.78 8MSANS -9690MAUPERTUIS GEORGES 11959 61981011989111608112915.03 8MANGL -5294GIRONNETS MURIEL 21959 31981041980041684813421.54 8CSANS -2982HORACE SATO 21959 7198609198507 9511 8689.07 8MSANS -1765ARGE PHILIPPE 119591019930519920510024 8998.08 8CALLEM -9648MOLENE HEYMAN 11960 21984111991092529918968.43 8MSANS -2260BOULAZAC FRANCOISE 21960 11980101979101684813423.35 8MSANS -0614RENOIR JEAN ADRIEN 11960 31983081993011215710279.72 8MSANS -5022CARTOUCHERIE JACQUES 11960111984121994011578112723.60 8MSANS -7019AULNES BETTY 21960121980091988051527112374.16 8MTECHN -1225GRANIER DIDIER 11960121982091993011527112374.09 8MSANS -0305CANTARON JACQUELINE ANNE 21960 21979111993101471512025.92 8MANGL -9818ULBACH NATHALIE 21960 81982011981011326611018.09 8MALLEM -6769TOURENNE MARIE HELENE 21960 81993081992011249910471.66 8MSANS -4168CAILLE NELLY 21960 11980101979101684813423.35 8MSANS -2371PILATTE PHILIPPE 11960121984071991061326611018.09 8MSANS -1380SALLE BRUNO GEORGES 11960 31982011988112090215980.82 8MSANS -1410REPUBLIQU ROZENN 21960 51983041982041608112915.17 8MSANS -1668VALESCURE GILBERT 11961 619880319930111302 9775.91 8CESP -4486CHANZY GILBERT 11961 81984061988052090215979.76 8MSANS -4667CLAIR ANNICK 21961 51982071981071326611017.91 8MSANS -3248CAMPANELLES MARTINE 21961 51982081989112090215981.29 8CSANS -6422BARBELET THIERRY 11961 319810119800111131 9657.47 8MSANS -5543JUMIN HENRY 1196111199405199201 9597 8729.85 8MANGL -2561SAURSON MICHEL 11961 319820419900111131 9658.72 8MANGL -3290CHARBONNEL PATRICIA 21961 7199607199507 8359 7952.19 8MSANS -4075ORSAY JEAN MARC 11961 919890619950910407 9272.24 8MINFOR -3928DAVID BERNARD 11961 51981091993121326611016.78 8MALLEM -3502MONTGOINS ODILE 21961 91984091983091288210744.01 8CSANS -2628MANET MICHELE 21961 51984091983091288210745.57 8MSANS -3679LAY CAROLE 21961 81982101993071527112374.70 8CTECHN -9476FERREOL PATRICE 11961 51985101993011168610047.54 8CALLEM -6300VALLIER NICOLE 21961 3199207199107 8656 8146.11 8.ANGL -2306RAHO BERNARD 11961 919900319890510407 9270.44 8MSANS -7612VIEUX PASCAL CHRISTOPHE 11961101983051982051326611017.92 8MCOMPT -9056CRAPONNE PHILIPPE 11961121985031989112090215981.60 8MSANS -5891PRESIDENT ROBERT 11961 21992121993122401918074.91 8MSANS -4133AIR PIERRE 11961 71981071991091326611016.35 8MSANS -9028OUSTALET JEAN 11961 819821219811211131 9658.52 8MTECHN -3462MONTEIL JACKY 11962 819820619810611131 9657.15 8MSANS -7126JUSTICE MARIE PIERRE 2196211199504199404 7803 7680.66 8MSANS -2705VILLA MIREILLE 21962 2199201199101 7803 7681.04 8.VENTE -6788EXTE DOMINIQUE 21962101984111991091527112373.05 8MSANS -6035AUMALE SYLVAIN 11962 619840319830311131 9658.70 8MSANS -3359CERNOY PHILIPPE 11962121988061989091527112374.58 8CSANS -8236CANAULET LOIC 11962 919870219870110407 9271.16 8MSANS -2285FAURE NICOLE 21962101982071981071326611016.83 8MSANS -6765PICARD AXEL 11963 61992121991121330611016.03 8CSANS -6602COUDREE LAURENT MARCEL 11963111986051994111693613498.86 8MSANS -6537BOTZARIS MANUEL 11963 91984031991091288210744.23 8MSANS -9865CARDELINO ELISABETH 21963121986061985061288210744.19 8MSANS -7936GAMBARDELLA MONIQUE 21963101984111983111288210743.92 8CSANS -1490PAUTEL PATRICIA 21963 21993091992011202810241.21 8MSANS -8828CAMP JEAN FRANCIS 11963 31983101993011949415050.78 8MSANS -6652SURESNES BRIGITTE 21963121989081988081249910472.82 8DSANS -9991PROF CHANTAL 21963 819950319940311389 9850.74 8MSANS -4136ONDINE LAURENCE 21963 61984111983111608112915.66 8MTECHN -2731DRIVE MICHEL 11963 81983051982051326611017.83 8MSANS -7391SOIE BEATRICE MARIE 21964 11986101985101168610048.22 8CALLEM -7157CEDEX GERARD 11964111991121990121330611016.53 8MSANS -1010ARCES ELISABETH ANNE 2196412198811198606 8656 8145.62 8.ANGL -7723GRATENTOUR FRANCOIS 11964121991051995081202810240.84 8MSANS -7515JARUNSANITWONG PIERRE JEAN 11964 3199612199401 9597 8729.36 8CSANS -7251ISIDRO DANIEL 11964 91988051987052090215980.28 8MSANS -4749AVERTIN CLAUDE 11964101986071993041288210744.26 8MTECHN -2395LOGNES HEDWIGE 21964 61984091983091288210744.23 8MSANS -1171DELMAS DANIEL 11965 11988051992041249910473.45 8MTECHN -8804MAHON FRANCINE 21965 51993061992061202810240.46 8MANGL -0367DANTZIG JEAN 119651219940619930610363 9232.62 8CANGL -4984SOULT ERIC ANDRE 11965 219931119921110024 8999.21 8CANGL -5821POMPIDOU GINETTE 21965 51985061985061347711131.13 8MSANS -6382LABOURD CATHERINE 21965 71989071995091249910472.66 8VTECHN -0635WILLOWCREST JEAN CLAUDE 11965 71985071992121288210745.13 8MSANS -0760PENIL PASCAL 119651019870119860110791 9501.81 8MTECHN -6467HAVRE ANDREE 21965101987051986101527112374.07 8MSANS -9897ONGUI PATRICE 11965 619940119930111389 9851.07 8CSANS -5429HINODE FRANCOISE 21965 2199304199204 9126 8456.10 8MESP -6900MANTEAUX GERARD 11966 719910219930610024 8997.99 8MSANS -0370CASTELL MONIQUE 21966 41989031988031249910473.24 8MALLEM -8517WASHINGTON BERNARD 119661219890119860410407 9272.17 8.ANGL -9967TREMEUR HERVE MARIE 11966 81989081988081249910472.59 8SCOMPT -6163MOLLARD JACQUES 11966 21993021992011249910473.00 8MANGL -7120SOGNES HELENE 21966 31989031988031249910472.73 8MINFOR -6709KERIMEL MICHEL 11966101988011987011539912453.47 8MANGL -5303HETROLLIER MARIE LAURE 21966 119940919930411389 9852.11 8MANGL -7075CEZAIRE JEAN LOUIS 11966 61985041992061527112374.63 8MTECHN -5072SAUVETAT ALAIN 11966 919910519900510024 8999.27 8MANGL -6154CALME MICHEL 11967 91988041991061249910472.82 8MANGL -3329DOME PATRICE 119671219921119931110024 8999.31 8MSANS -6319CALVAIRE YANICK 11967 119920819910810024 8998.01 8MSANS -4968LYCEE MICHEL 11967 31991101990101467711987.34 8CSANS -0009LOS JEROME 11967 2199611199511 8656 8146.86 8CSANS -1878BEAUVILLE ERIK 11967 91990031994011249910473.09 8MSANS -9800DORET CAROLINE LILIANE 21967 719930619920611389 9851.28 8MTECHN -4797PORTOI MIVA 21967 61989111989111839014313.36 8MSANS -7931LABERTRANNE SYLVETTE 21967 81994051992011202810241.97 8MTECHN -8940BARRES MICHAELLE 21967 81990021993071330611016.66 8MSANS -3164CROUY ANDRE 11967 71992091991091839014314.38 8MSANS -1556CAMP VERONIQUE 21967 9199302199202 8656 8145.66 8.SANS -2245FRINGANE VINCENT 11968 419940219920110024 8999.94 8CTECHN -0888CURIE JEAN BERNARD 11968 91988091993121249910471.74 8MSANS -3431BOUEL BERNARD 119681019880919870910407 9270.97 8MSANS -3147ROCHERS ISABELLE 21968 51994071992011202810239.96 8CTECHN -7236SIMENTAL BERNARD 11968 219910719910510407 9270.44 8MCOMPT -9853YAN DAMIENNE 21968 71994011992011202810241.16 8CSANS -3267LONG BRIGITTE 21968 11992091991091330611016.93 8MSANS -8141EXUPERY GERALD 11968 51994011993011267210590.11 8CSANS -3839MINIMES JEAN PIERRE 11968 71989011988011450311831.78 8MESP -6386PAUCOURT SALOLOM 11969 91994011993011420611639.24 8MTECHN -5948CARRERE JOCELYNE 21969 6199205199105 8656 8145.60 8.SANS -1726ASQUES SYLVIE 21969101994021992011202810240.50 8MANGL -3067CHEVRAINVILLIER BERTRAND 11969 119940119920110024 8999.90 8MSANS -5762WINSTON JEAN 11969 11989101988101450311832.69 8MSANS -6200MONTGOMERY DANIEL 11969 91990041995011330611016.47 8MSANS -9177RIEUX BERNARD 119691119920619910611389 9852.27 8MINFOR -6151CANTAGALLO EDDY FELIX 11969 71994011993011202810240.23 8MSANS -8371MOUTHON HERMINE 21969 919950319930411389 9852.29 8MTECHN -5982LONGWOOD MARIE NOELLE 21969 71991091991051330611016.84 8MVENTE -3924ANGELES MARYSE 21970 219940719920111389 9850.74 8MSANS -5000MARCHAND ANDRE 11970 8199306199206 9597 8727.91 8MSANS -6053EXINCOURT DOMINIQUE 11970 419940619920110024 8999.43 8CESP -6405ORMILLES ALAIN 119701119910819900810024 8999.57 8MSANS -4367OURCHES AGNES 21970 1199506199406 7803 7680.36 8CSANS -6055LACATE DENIS 11970 9199308199208 9597 8729.66 8CTECHN -4701DUCA ANDRE 11970 71991051990051467711985.86 8CESP -6470ALLEES YVON 11970 71991021990021467711987.75 8MALLEM -6121RIVAGE FRANCOIS MARCEL 11970 419950119950110363 9233.88 8CSANS -0867FOURS CHRISTINE 21970 3199409199309 8359 7952.10 8MTECHN -9075SEMBAT FREDERIC 11970 3198912198812 8656 8145.26 8.ALLEM -9637JUAN MURIEL 21970 5199310199210 8656 8146.70 8.TECHN -6609GAYE NICOLE 21970 8199607199507 7803 7680.41 8MSANS -5493LAUZES MICHEL 11970 11991071990071202810241.09 8MSANS -6491BRAS BEATRICE 21971 619921019950410668 9425.45 8MSANS -7556YOLA PHILIPPE 11971121994041993041360611209.94 8CTECHN -7031ECOLE CHRISTINE EMILIE 21971 419910219920111389 9851.19 8MSANS -5834ORANGERIE SERGE 11971 8199302199202 9597 8728.46 8CSANS -4526LOT PHILIPPE 1197110199407199307 9597 8729.27 8CSANS -4363QUART VINCENT 11971 4199404199201 9597 8728.44 8CSANS -7702MONTARNAUD PIERRE 11971121992111991111420611638.97 8MVENTE -8710GAULTIER ISABELLE 21971 31994011993011267210589.57 8CSANS -5198ROUILLON CLAIRE LUCIE 21971 819940519920111389 9851.97 8CANGL -6286WATTEAU JEAN CLAUDE 11971 81994071993071360611211.56 8MSANS -3787TAUDE JACQUES 11971121993121994011202810241.40 8MSANS -3968CAPRI MARIE CHRISTINE 21972 8199607199507 7803 7681.22 8CESP -5435BERRE JOELLE 21972 21994091993091360611211.42 8CSANS -2682VINGT GENEVIEVE 21972 7199406199306 7803 7681.40 8CSANS -5935ORVEAU FRANCK 1197212199609199509 8656 8146.25 8MTECHN -5312LUCE GUY 11972 81994041993041420611637.47 8MSANS -5416ESSARTS FRANCOIS 11972 819931019930711389 9850.62 8CSANS -5534ISLE MICHEL 1197210199312199212 9597 8728.58 8MSANS -3974DEVIN FRANCOIS 1197212199605199505 8656 8145.57 8CSANS -6877COUPERIN PHILIPPE 11972 5199310199210 9597 8727.95 8CSANS -4740PLAISANCE SERGE 11972 219950119930410024 8998.82 8CSANS -3393MANAU EDITH 21972 219941019930411389 9851.88 8MTECHN -9615BOL JEAN CLAUDE 11972 21991071994011249910471.79 8MSANS -4599GUYAU MAUD SOPHIE 21972 519940719920111389 9852.47 8MANGL -8612HAMELIN JEAN MARC 11972 8199310199401 9597 8728.98 8CSANS -8541RESIDENCE MICHEL 11972 319951219941210668 9426.89 8CTECHN -3801NASTRINGUES SABINE 21973 8199606199506 7803 7679.46 8CTECHN -2827OREE JOSEPH JEAN JACQUES 11973 6199502199402 9126 8456.78 8CANGL -7660ESTIENNE JACQUES 11973 1199406199306 9126 8455.56 8MSANS -5260JACQUES ERIC BERNARD 11973 319931119921111389 9851.61 8CSANS -3671GARCHES GEORGES 11973 31992021991011202810240.68 8CANGL -4348ROQUEFORT JEAN PIERRE 11973 819930319920311389 9850.74 8CINFOR -6630LAGRANGE THIERRY 11973 9199302199505 9597 8729.63 8CTECHN -9712EMPIRE CHRISTIANE 21973 6199606199506 7803 7680.67 8CSANS -3751OASIS JACQUELINE 21973 219930319920711389 9851.25 8MSANS -3830DRECHO JEAN 11973 61993051994011202810240.55 8CSANS -4561DANNEMOIS JEROME 11973 5199612199601 7803 7679.91 8CSANS -3191JAVEL CHRISTIAN 11973 5199311199211 8656 8147.13 8.SANS -1618CHASLES CORINE 219731219940719930710668 9427.08 8MSANS -4268SENE LUC 1197312199306199206 9597 8728.23 8CSANS -8421ROCBARON JOEL 11974 1199510199410 7803 7680.36 8CSANS -0930ESTANOVE ALAIN 1197411199606199506 7803 7679.99 8CMICRO -6807TOURDRES MANUEL 11974121994051993051360611210.28 8CSANS -4488CHAUVEAU CECILE 2197412199601199501 7803 7679.51 8CSANS -8315COUVENT PIERRE 11974121995121994121450311831.06 8CSANS -6605EDMOND SYLVIE 21974 8199504199404 7803 7679.78 8CTECHN -9778ONS MARIE SIMONE 21974 7199405199406 7803 7679.96 8MSANS -3816AURIC PASCAL 11974 6199502199402 9894 8922.63 8CSANS -2018FOUR PATRICIA MICHELE 219741219940719930710668 9427.40 8CALLEM -7643SEGUIER PATRICK 11974 5199406199306 7803 7679.67 8CSANS -5610SAGET HENRY 11974 9199407199307 9126 8456.47 8CALLEM -6425FINLAY PHILIPPE 11974 81993121994011202810241.74 8CANGL -8616PAEA MICHEL 11975 5199407199406 7803 7681.40 8CSANS -9958DULUD GILLES 11975 6199612199512 8656 8146.52 8.TECHN -8573PIBONSON CHRISTOPHE FREDERIC 11975 6199607199507 7803 7680.81 8CSANS -7803INCAPIS PASCALE NANCY 21975 7199604199504 7803 7680.34 8CALLEM -7514VIENOT ANDRE 11975 3199508199408 7803 7679.78 8CSANS -7507FAISANDERIE JEAN PIERRE 1197512199607199507 7803 7679.99 8CSANS -3865MICHEL PATRICK 11976 3199507199407 7803 7680.12 8CSANS -4755OCTAVE MARC 1197612199608199508 7803 7679.99 8CSANS -0542TORREILLES ALAIN 11976 5199510199410 8656 8145.80 8CSANS -9647DELORME DOMINIQUE PIERRETTE 2197612199407199307 7803 7679.69 8CSANS -4725TACONNAZ BEATRICE 21976 4199508199408 7803 7681.17 8CALLEM -9564CESSOLE FRANCIS 11976 4199607199507 7803 7681.20 8CSANS -8087CHUTES GUY 11976 3199407199307 7803 7680.62 8CANGL -5480LOUIS JACQUES 11977 9199607199507 7803 7680.59 8CSANS -1361BANVILLE PATRICK 11977 4199607199507 7803 7680.34 8CSANS -6209BEAURECUEI CATHERINE 21977 4199607199507 7803 7680.57 8CSANS -3656FLIREY JEAN CLAUDE 1197711199606199506 7803 7679.59 8CANGL -9051SUANE ALINE 21929 919680919870111389 9851.91 9VSANS -2724DEL PIERRE 11930 21989021995023455825330.03 9.SANS -7341GRATECA PIERRE 11933 21966071993012273717260.26 9MSANS -6774BARRAU AGNES 21933 8199512199412 8656 8145.06 9MANGL -0536FIRMAMENT SCHEHRAZAD 21934121962101982052470018541.72 9DSANS -7368RESSAC RICHARD JOSEPH 11934 11967011994011557012567.09 9LANGL -7599ANNE JEAN FRANCOIS 11935 11974031994011578112722.84 9VSANS -1083COUCOURDE DOMINIQUE 11935101973061991011433211715.02 9MSANS -2946ROLLAND OLIVIER 11936 51962111984122470018541.29 9MSANS -7241THERMALE MARGUERITE 21936 7199306199206 9511 8688.67 9MESP -1695LOUVEL CHRISTIAN 11937 519820219920311389 9852.69 9MSANS -9744SALENGRO SYLVIAN ERIC 11937101961071991083417325097.15 9MESP -7083OLIVETTE CATHERINE 21937101966071989031932314934.86 9MALLEM -0151DUCHEMIN JEAN JACQUES 11938 41962061991012470018541.29 9MINFOR -8395FRANCO ANNIE 21939101984011991091288210745.34 9MANGL -9978BARBERAZ MARIE CLAUDE 21939 71972071989011621213034.09 9VANGL -2131ARGENT CATHERINE 21939 71963121994042137316332.05 9MALLEM -3235THUI HUGUES 11939 61967071995041557012566.37 9MSANS -7994THIBAULT PATRICK 11939 31962051983032470018542.10 9MTECHN -5783DOMATS MICHELE 21939121963031992021932314934.12 9MANGL -6426PORTAIL JEAN FRANCOIS 11939 11969121995041557012567.53 9MESP -6856JULIE JEAN MARIE 11940 319950219940211131 9657.83 9MANGL -4024LEBRUN ALAIN 11940111965041995041557012567.77 9MESP -9739NOCETA YVES 11940 21972041991011663613343.82 9MSANS -9045MURET RENEE 21940101964091993072137316332.29 9CSANS -4987UNIVERSITE CATHERINE 21940 41967011990011932314935.20 9MESP -1530CYRILLE ANNICK 219401219741019881011131 9659.19 9VSANS -1447HAMEAU OLIVIER 11940 61964081988092947921838.88 9MTECHN -8268ANNEES PATRICK 11941 51961081992042022115555.75 9SANGL -9303SCIOTOT ALICE 21941 61973071991101578112722.75 9MSANS -0509PIECE ROBERT 11941 51963121994073844228045.38 9MSANS -3288ISERE EMMANUEL 11941 51965081990011433211714.24 9MSANS -9898CHANTEGRIVE JEAN MARC 11941 91964091992082470018540.12 9MSANS -0163DAUTHEVILLE MARCELLO 11941111964121992072137316332.45 9MANGL -0652VAUTHIER MARIE ALICE 21941 41971021991101932314933.60 9MINFOR -7932VAUX DANIEL 11942 51969031991011433211713.80 9MSANS -0197MAURENS CLAUDE 11942 91962081984123200223582.94 9MTECHN -3251RUELLE JEAN 11942111976041992011403411520.12 9MALLEM -8289OLYMPE NADINE 21942 51964121993102137316331.37 9MSANS -9503GLORIETTE ALDO 119421019951219941210024 8999.12 9MSANS -4563CERTAIN LOUIS 11942 31965071995011557012567.22 9MANGL -6383DESGRANGES JEAN CLAUDE 11942 71983051993011249910473.49 9MSANS -8658VALLONGUE BERNARD 11942 71963041995102666519899.30 9MESP -4745RUCHERS GILLES 11942 21980051979051249910473.56 9MSANS -8824PEYBERT JOCELYNE 21942 31963031994012137316332.51 9MSANS -7242CORMEIL PATRICK 11942 81970041990011433211714.79 9MANGL -0065ANGES XAVIER 11943101966101990011663613343.16 9VSANS -4531SENART JEAN LOUIS 11943 21967111987012273717261.13 9MSANS -7154MUIDS THIERRY 11943 31962121990013844228044.24 9MINFOR -5345ORATOIRE ALAIN 11943121970081989011932314934.36 9MSANS -3282SOUGERES JEAN LOUIS 11943 11968051990011433211715.33 9MSANS -6215JOFFRE PASCALE 21943 81986021991071249910473.24 9MINFOR -7867BASTIDE HIROKO 21943 51964071993072334017610.06 9MCOMPT -6194STEPHAN KARIM 11943 81966051995041557012567.45 9MANGL -4570MONDENARD JACQUES 11944 61965051994012137316331.93 9MINFOR -3691CAORCHES MICHELE 21944101965081995042137316331.97 9MINFOR -8595PRAD BENOIT PIERRE 11944111965031984123200223582.37 9MALLEM -6617LONDRES PATRICK 11944 41972041991011621213032.39 9MSANS -9701CAPUCINES ALAIN 11944 119820119830511389 9851.24 9MSANS -7661ROSERAIE FRANCOIS 11944 31973071992011403411521.88 9MANGL -0274FROMAGERIE ALAIN 11944121971011991101433211714.28 9CSANS -9427GROULES MARIE FRANCOISE 21944 81963111993082334017609.06 9MANGL -9749HEROLD ISABELLE 21944 31973071991071578112722.97 9DSANS -5120MONTBY PIERRE 11945 81978041994011663613343.91 9MINFOR -7337MAGINOT PHILIPPE 11945 61965031994012137316330.71 9MANGL -2937PAYEN JEAN PAUL 11945 81973051992011403411520.53 9CANGL -3034SCHUMANN GEORGES 11945 81970041991011433211715.11 9MSANS -4582PETENATI MARIE CHRISTINE 21945 11974121993032043315669.65 9MALLEM -2430TOURNELLES ALAIN 11945 91975031993011369311287.38 9MSANS -4782CHENAY MARIE LAURENCE 21945121968091989012273717259.78 9MSANS -1091RENNES MARIE ANGE 21945 61974071990071621213033.56 9MSANS -2494ONA FRANCOISE 21946 51969081993121834514275.25 9MESP -2170VIENNE MARIANNE 21946 81970021991102137316330.67 9VSANS -2830FONTAINE ANNETTE 21946 41968041991091932314935.20 9MSANS -8673ABEL JEAN PIERRE 11946 2198810198510 8656 8145.21 9.SANS -9142ORSAY MICHEL 11946121970121991041663613343.28 9MSANS -6458FOYER JEAN LUC JACKY 11946 71969111986012470018540.12 9MSANS -8418RIVERIN ALAIN 11946 11979091992011249910473.05 9CCOMPT -2785PONT ANDRE 11947 41968041990102739020403.33 9MANGL -3079MOISE YVES 11947121972071991101433211714.69 9MTECHN -6994CHEMINEES SOPHIE 21947 11976061981091834514276.09 9MANGL -0913ROCHER BRIGITTE 21947101971041990102334017609.66 9MSANS -3030LUZIADES ANTONINA 21947 519940619920111389 9851.64 9MSANS -2592CLOUZIT NATHALIE 21947 7199208199108 8656 8145.20 9.SANS -2816BAULE VERONIQUE 21948 51973031972031236910396.01 9MANGL -0561DELAUNE JEAN NOEL 11948 11975041993011369311287.82 9MSANS -4506DIDEROT JEAN PAUL 11948 619790519880411131 9657.51 9MTECHN -5103CORNETIERE FRANCOISE 21948 21983061990041288210744.22 9DSANS -0785RUDLOFF MICHEL 11949121971121993122547019086.15 9CSANS -7465DEVORAH MICHEL 11949 91980041990091608112915.38 9MSANS -6601LAS CLAUDE 11949 61969051990043417325096.67 9MTECHN -5921SAINTPIERRE CAROLE 21950 31974021991071578112722.12 9CSANS -4717BERARD DENIS 11950101983081987011283810705.67 9DTECHN -6138DUCERIS COLETTE 21950 81992051991011202810241.85 9SVENTE -1254ESQUIROL JEAN CHRISTIAN 11950 81975081992101369311286.84 9MANGL -3226BOX CHRISTINE 21950 41970041990101834514275.65 9MSANS -4683MAUNE PASCALE 21950 61974051995072175716601.42 9MSANS -3496FROIDE JEAN JACQUES 11950111972101991012137316331.69 9MANGL -2173BERNARD CHRISTIAN 11950 41972051991042137316331.34 9MANGL -2204VIA STEPHAN 11951121972101991072017815517.05 9MSANS -5528HORIZONA JEAN PAUL 11951 219931019940510407 9270.34 9MANGL -2181CHAPUIS ALLAN 11951 1198810198603 8656 8145.89 9.SANS -8003COMPREIGNAC JEAN RENE 11951 81973101994082201216756.14 9MALLEM -4444HOTELS ANDRE 11951 41981111992011249910471.71 9CTECHN -3137GARIDECH MICHELINE 21951121993051993041249910473.47 9MANGL -5824LONGCHAMPS SYLVIE 21951 51972011990071578112722.42 9MANGL -8477MENEZMEUR NORIKO 21951 51973071991041578112722.69 9MESP -1336RANELAGH PIERRETTE 21952 21972041995011881314585.46 9MALLEM -6782LAVACHET ALAIN 11952 11978091994011369311287.77 9MINFOR -6451MONTPARNASSE AURIC 11952121973031987112470018540.56 9MESP -9132BOUVELARD ALAIN 11952 619930819910110407 9271.74 9CSANS -9726VIGIER GABRIEL 11952 419930819920811389 9852.47 9MSANS -4608DESPAGNE ANNIE 21952 3199503199403 8656 8146.05 9MSANS -2221LYANES YANN 11953121973071995041881314586.14 9MVENTE -1575PELURES MICHEL 11953111975011991012781920674.59 9MSANS -4898BLANCHET ODILE 21953101973071984051834514275.11 9MSANS -2339ODES MICHEL 11953 31976121993041471512025.77 9MSANS -4008BETHANCOURT MARIE ANNE 21953111981121980121202810241.36 9MSANS -1590CIVRAC PHILIPPE 11953 91977051993041369311286.83 9MTECHN -6109PEIRE GERARD ANDRE 11953 31972071991082175716602.51 9MCOMPT -7232CHAMP MICHELINE 21953 7199001198801 8656 8145.87 9.SANS -4789TOURACHE ALAIN 11954 71974081993011369311286.53 9MTECHN -8709QUIETUDE MONIQUE 21954101977011994101471512025.14 9CSANS -1712BIR ALAIN 11954 31975011991091684813421.42 9MSANS -7069TUBY ROBERT 11954 71975061991071578112722.30 9MSANS -4017BLEURY BRIGITTE 21954101977011992011471512025.20 9CSANS -4255BEAUSEJOUR FRANCOISE 21955101981031995071433211714.70 9MSANS -3435VENTS PHILIPPE 11955 71978041991011471512025.16 9MTECHN -3130CIGALONS PHILIPPE PIERRE YVES11955121978111995021608112916.95 9MALLEM -9170ALMA ANTOINE 11955111978101992011578112722.61 9MANGL -9114CASTEL LILIANE 21955 51976071991121578112722.52 9MVENTE -4844CHER JOELLE 21956 31993091995111202810240.94 9MINFOR -1241GOUVERNEUR JEAN PAUL 11956 31976031990101684813422.68 9MSANS -9766FRAYSSE CHRISTIAN 11956 819800719821211389 9850.88 9MSANS -6781CHANTEREINE JEAN LUC 11956 91979011992012175716602.36 9MSANS -6220PUYRAVEAU MICHEL 11956101985041988061326611017.52 9MSANS -5187BOLIVAR DANIELE MARIE 21956 81981081995071433211714.30 9MSANS -8283VICINAL MARCEL 11956 91977111992012175716600.94 9MSANS -0990CORMERY EYT 11956111979121995041249910472.84 9MSANS -9255SERRES MARY ANNE 21956 71981011980011684813421.58 9DANGL -9968TRAILLES JEAN 11956 919870419860910407 9271.59 9MSANS -6046RONDE JACQUES 11957101976121992011608112915.20 9MSANS -4312DUROC KETTY 21957111980041979041684813421.51 9CANGL -1998MADELEINE CATHERINE 21957 21980061994041471512025.70 9MSANS -0810TROMPETTES LAURENCE GISELE 21957 91994021992011202810240.40 9SSANS -1103JOURDANS JEAN MARIE 119571019900419910410791 9502.58 9MANGL -3941SOUGRAIGNE MICHELINE 21957 71980071979071684813423.49 9CSANS -1971BORDINAS GENEVIEVE 21957111980011993111471512024.89 9MSANS -5459VORS ANNE 21957 5199006198906 8656 8146.61 9.SANS -5423FLOQUET FABRICE 11957 3199408199308 8359 7953.59 9MSANS -0905CARREL KARIN 21957101980101979101684813423.47 9MANGL -4069JUZET JEAN FRANCOIS 11957101976071993062043315669.89 9MSANS -4527MANIGUETS PIERRE 11958 819820619810611131 9658.16 9MSANS -2372FONTANGE EMILIENNE 21958111981041980041381911366.00 9MANGL -4357RAYOL PATRICIA 21958 41994031992011202810240.40 9MSANS -5408BLANCHE GERARD 11958 41981021985112256617147.10 9MANGL -3006FOULQUES JOELLE 21958 51979031993041471512026.00 9MINFOR -6430PERIGORD PIERRE 11958 219790519780511389 9852.09 9CSANS -6468PLANTADE BEATRICE 21958101981041980041684813422.18 9MALLEM -0044MONTBRUN PIERRE 11959 51983061993121326611017.97 9MANGL -2272GRANGE JEAN MICHEL 11959 519790319820111389 9851.46 9MSANS -8185TONNER CHANTAL MARIE 21959 3199606199506 7803 7681.35 9MSANS -8317DAMESME JOELLE 21959 919940219930211389 9851.73 9MSANS -3554FRONTONAS MICHELINE 21959 61979101978101202810241.66 9MESP -3926TARNES NELL 11959 11980101993041471512024.20 9MVENTE -9173BLIGNY MARIE MADELEINE 21959 1198810198510 8656 8146.64 9.TECHN -9704DEMMLER ANDREE 21959101979101993071471512024.66 9MANGL -1648RENAULT MARIE ODILE 21959111986121991071249910472.96 9MSANS -1803HONORE ISABELLE 21959111982041981041202810240.26 9MALLEM -5795SUQUETTE SYLVIE 21959121980031995021527112374.40 9MANGL -9158ALDERBURCHS PATRICE 11959 719790619811011389 9852.67 9MSANS -8333PONCHETTES VIRGINIE 21959 7198801198510 8656 8145.83 9.SANS -5238BOURRE CLAUDE 11960 51981031984091684813423.35 9CSANS -7478ERDRE ANNE 21960 81993111992011202810240.71 9MANGL -2036SALENGRO SYLVIANE 21960 31985121984121288210744.62 9CINFOR -7716GOLF BERTRAND 11960121982071989021608112916.95 9MANGL -4057MILTAT HERVE 11960 719810419800411131 9657.84 9MANGL -2635BIGNAN MARTINE 21960 51981041992092090215980.88 9MSANS -7613PIERRE JACQUES 11961121986041990031527112374.84 9MSANS -0365CLICHY BERNARD 11961 419830519830511131 9658.07 9MSANS -2806GOIZ DIDIER 11961 119840419830411131 9658.46 9MSANS -4103BRUSC CATHERINE 21961 319940919930411389 9852.47 9MSANS -1349MAUROIR ERIC 11961 819900119870310407 9270.29 9.SANS -0451RENARD JEAN MICHEL 11961 1198810198604 8656 8145.78 9.SANS -8494CYGNE SYLVIANE 21961111983021982021326611016.71 9CSANS -9150GAY JEAN CLAUDE 119611119880719870810407 9271.52 9MSANS -3221SURCOUF GUY 11961 91984081992121527112374.97 9MSANS -3083CANADA ALAIN 11961 11982051982111326611017.29 9CSANS -0448LAVANDES GILLES 11962 319930819920811389 9850.79 9MALLEM -3439VERSAILLES MARC 11962 319840419830411131 9657.57 9MALLEM -5360VEZELAY THIERRY 11962 119880919870910791 9502.46 9MSANS -8567PRE FRANCOIS 11962 519910119940810407 9271.42 9MINFOR -0702LACOSTE PHILIPPE 11962 61985091984091608112916.14 9MESP -3016CARDELINE ELISE 21962 11993091992011202810241.27 9MSANS -7387BELLERIVE EVELINE 21962 91992111992061330611016.03 9MSANS -3882RETHACKER JEAN LOUIS 11962 719930819921210407 9272.17 9MSANS -5174SEILLANS NICOLE 21962 71983081982081608112915.08 9MTECHN -2800VILLETTE JEAN PIERRE 11962 51985041991091288210744.28 9MANGL -9420ROURES YANNICK 119621019820319810311131 9658.82 9MSANS -4001ASNIERES JEAN PIERRE 11962121987071994091693613499.67 9MSANS -8856CANALS GILLES 11962 219911219901210024 8999.16 9MANGL -9775MOUETTES FRANCOIS 119621219900219890210407 9270.91 9CVENTE -7097BROUENOU JEAN PIERRE 11962 619860319850310791 9502.82 9MSANS -8917CHANCELIER PATRICK 11962 31995021994021202810240.53 9MSANS -8358CREBILLON NICOLE 21962 61983011982011608112916.37 9VSANS -1296BERARD MICHELE 21962 119941019931011389 9850.89 9MSANS -3188CONCY MICHELE 21962 31987091986092090215979.80 9MALLEM -6829SEINE DANIELE 21962111994061993061202810240.23 9MALLEM -7876VIELLA HERVE 11963 619930119920110407 9272.09 9CESP -7396SANAJO BRUNO 11963 91987081991091249910473.60 9LSANS -7380MARINA ANNE JACQUELINE 21963 119910919900910024 8999.61 9CANGL -5941SIFFLETERIE GILLES 11963 519940219910710407 9270.56 9MTECHN -5364BOUSSY GENEVIEVE 21963 519940519920111389 9850.61 9MANGL -9502MONTOLIEU JEAN CLAUDE 11963 41985051994061527112374.72 9MSANS -8964DOUJAT MICHEL 11963 619841119831110791 9503.92 9MSANS -3405AMANDIERS PHILIPPE 11963 81984031992111527112372.90 9MSANS -1868COUPE JEAN 11963 61993031995081381911366.16 9MSANS -2984GOUSTAN JEAN MARC 11963101987111994091693613499.09 9CSANS -7572CHARONNE DANIELLE 21964 41995011994011206910240.19 9MALLEM -9668EDELWEISS JEAN BERNARD 11964 31984071991121288210745.70 9MSANS -3335CANTEPERDRIX MARIE CHRISTINE 21964 41983061982061326611017.52 9MSANS -2509FINO JEAN MICHEL 1196410199311199211 9085 8417.90 9CVENTE -1812LLORCA PIERRE 11964 21986031993091527112374.72 9MTECHN -5943BERGERIE JEAN 11964 31987021995011373711327.16 9MSANS -5136VALERIEN ANDRE PASCAL 11964 71987081986081527112373.86 9MANGL -6432ECUREUILS PATRICK 11964 3199202199102 8656 8147.19 9.SANS -2610DUVERGIER MARC 11964 91984031992031527112374.88 9MTECHN -5455CEZANNE PASCAL LUC 11965 31988091993031450311831.19 9CALLEM -7204PICCINI CAROLINE 21965121992091991091839014314.08 9CSANS -0125HUNTINGTON YVONNE 21965 91994011992011202810240.77 9MSANS -3791BOUISSETTE PHILIPPE 119651119940119950810024 8998.95 9CSANS -2711ROSETTE PHILIPPE 11965 41990101994011288210744.86 9CALLEM -4882LOZERE ERIC 11965 31988021992061450311831.91 9MANGL -4855BELLEVUE PATRICK 11965 11990101989101249910473.69 9MALLEM -3048PIERRE PIERRE 11965 7199110199010 8656 8146.61 9.ANGL -2278LOGT NORBERT 119651019900619890610407 9270.24 9MSANS -5557LAUZADEL GERARD 11965 91992071994072256617145.75 9MSANS -6129ROZ GISELE 2196510198805198510 8656 8145.20 9.ALLEM -3979RIVES YVES 1196511199609199509 9126 8455.98 9MTECHN -8688FASSUN HUGUETTE 21965 4199511199411 7803 7680.23 9MSANS -9402PARMENTIER PATRICK 11966 819880319870310407 9270.16 9MCOMPT -8428BARJAQUETS THIERRY ABEL 119661119920319910310024 8999.07 9CALLEM -8348CLERMONT ANNE MARIE 21966 11989051988051202810241.40 9MVENTE -3723COURCELLE GENEVIEVE 21966 2199506199406 7803 7680.93 9MANGL -3173CHAL ARMAND 11966101986051988061288210745.88 9MSANS -9965VENETES YOLANDE 21966 519930719920711389 9851.21 9MTECHN -6306ANJOU ALINE SIMONE 2196612199004198707 8656 8147.13 9.ANGL -5448FILHOS JEAN CHARLES HERVE 1196612199212199112 7677 7604.70 9MSANS -7571GORRE SYLVIE 21966101988121987121249910472.03 9MSANS -8890LAMORLAYE FREDERIC 11966 41986041992011450311832.68 9MVENTE -2287DORMOY GENEVIEVE 21966 31988111987111450311830.80 9MSANS -0092ALCANAL JEAN LUC 11966 61987041992121249910472.03 9CSANS -2554ROULOTTE OLIVIER 11966 419940219920110024 8999.03 9MANGL -9801GRAPPONS NATHALIE 21966 919940819930411389 9851.57 9MTECHN -1541ALDES JEAN MICHEL 11967121994051992011202810240.26 9MSANS -9290PLOEMEL YVES 11967121991051990051467711986.91 9MSANS -8169CHAUVIN FRANCOIS 11967 21994011994011202810240.53 9MSANS -6269GOLF ROLAND 11967 919940219940710024 8999.47 9MALLEM -2878RICHART ERIC JEAN MARIE 11967 819891219950410407 9271.91 9MSANS -9098OR DANIEL 11967 719880919870910407 9272.01 9CSANS -4331MONIER DIDIER 11967 719881019871010407 9270.12 9CSANS -0261ROUQUET RENE 11967 41989051988051539912452.78 9MSANS -1507FLACHAT PIERRE 11967 41994011993011420611639.09 9CSANS -7887TENDRE CLAUDE ANNE 21967121994051992011202810241.72 9DSANS -0525SERRES LAURENCE MAGALI 21967 11994011992011202810240.50 9MSANS -9421ASNIERES MARIE CHRISTINE 21967 319951119930411389 9852.22 9MSANS -3624LAPEYRE THIERRY 11967 519870119940110407 9270.12 9MSANS -0344GABRIEL JEAN PIERRE 11967 419940119920110024 8999.57 9MINFOR -7208GAZAN ERIC JEAN 11967 219940119950810024 8998.94 9MTECHN -4335GLACIERE KEIKO 21967 21994041992011202810240.89 9MINFOR -9851TOUCANS MICHEL 11968 219910119900110407 9272.01 9MTECHN -9263ROSSINI ALAIN 11968111991011995021330611018.13 9MSANS -9662DEPORT PHILIPPE GEORGES 11968 3199607199507 8656 8145.38 9MANGL -2814ALFRED VERONIQUE 21968 6199202199102 8656 8146.65 9.COMPT -3291LACUEE REMI 11968 91989021988021450311831.34 9MANGL -3557KERHOUET REGIS 119681019930319920310024 8997.86 9MSANS -6204ESCA BRIGITTE 21968 9199404199201 9597 8729.22 9CESP -1678HADRIEN PHILIPPE 11968 819931219921210363 9231.95 9CSANS -0299MONICA DOMINIQUE 21968 51994021992011202810241.70 9MTECHN -6960PRES COLETTE 21968 2199108199008 8656 8147.15 9.SANS -4443BENOIT JOSIANE 21968 81988011992011249910473.05 9MTECHN -5697QUILICHINI ROBERT 11968 31993121992011202810241.92 9MINFOR -9315PAVE LEON 11968 21988111987111539912452.39 9CTECHN -7230BOUCHE FRANCOISE 21969 3199304199204 9126 8457.67 9MSANS -8237DENEB WALTER 11969 419890919910710407 9271.47 9CSANS -3459ALISCAMPS LEONIE 2196912199610199510 8656 8146.02 9MANGL -4247ARISTIDE CHRISTIAN 11969 5199501199401 9894 8921.55 9MSANS -0137VILLEMENT ANNE MARIE 21969 81994051992011202810239.81 9MSANS -9445STREET DANIELLE 21969 7199204199104 8656 8146.74 9MSANS -9019VALLIERES JEAN 11969121990111989111381911366.90 9MALLEM -4031COLVERTS LAURENCE 21969 11993121992011202810240.89 9MSANS -4000CUENANT THEOPHILE 11969 219890619880610024 8998.09 9CSANS -7496GRASS FRANCOIS 11969 81989051992121249910472.43 9CSANS -4671GRASSET ROGER 11969111992061995121330611018.09 9CSANS -0067RESTAURANT MICHEL 11970 7199407199307 9597 8728.26 9MANGL -0824FIGARES JACQUES 11970121993101992101360611210.03 9CESP -0143MACONNERIE MICHEL 1197010199511199411 7803 7679.87 9MSANS -2934FUZELIER SYLVIANE 21970 5198906198806 8656 8146.56 9MSANS -2663TOULOUSE PATRICK 119701219930819920811389 9850.66 9CSANS -0038LANGRUNE FRANCOIS 119711119940619951010024 8998.32 9CANGL -8414VILLE NOEL 11971 41990051989051202810241.49 9CANGL -5333SQUARE JEAN LUC 11971 81995051994071450311832.45 9CSANS -3680LAUTREC CALIXTE 21971 9199602199502 7803 7680.84 9MINFOR -9370CAMELIAS CHRISTIAN 11971 5199307199207 9597 8729.90 9MTECHN -6026NADAILLAC JEAN LOUIS 119711019910219900210024 8998.44 9CANGL -4310VICTORIA ERIC 1197110199607199507 7803 7680.44 9CSANS -2394CLAVIERS MICHELE RENEE 219711019910919900910024 8998.26 9CANGL -4996GUILLAUME FREDERIC HENRI 11971 41993031992031330611016.30 9CSANS -6930ROYAL EVELYNE 219711219940119930110668 9426.26 9MSANS -1006CRAU MARIE CLAIRE 21971 21994051992011202810241.04 9MSANS -0817ATHEE MAITE 21971 81993011992011267210590.11 9MSANS -5245VAL XAVIER 11971 3199306199206 8656 8146.79 9MESP -7249CLARS ALFRED 1197110199306199206 7803 7679.41 9.ALLEM -9895JUVANTE JACQUES 11971 61995051994051450311832.69 9MSANS -4769BORDERIE OLIVIER JEAN 11972 219940719930711389 9852.20 9MTECHN -4620VERDEILLE FRANCIS 11972 619930419940910363 9232.32 9CSANS -3812BLAINS DIDIER 11972 9199302199202 9597 8729.94 9MANGL -9910FORET JEAN CLAUDE 11972 119930719921011389 9851.30 9CSANS -5930CHATEAU SERGE 11972 9199205199105 9597 8728.49 9CMICRO -3132SAGONE EMMANUEL 21972 4199601199501 7803 7679.46 9MSANS -2171BERGERONNETTES STEPHANE 11972121995111994111450311832.22 9MSANS -5929CARRIEREBLANCHE OLIVIER 11973 6199410199310 9597 8728.98 9CINFOR -6111ROCHETTE JACQUES 1197310199307199207 7803 7680.93 9.ANGL -1480CREYSSAC VANESSA 21973 4199511199411 7803 7679.33 9CSANS -9433BIS NICOLE 21973 6199407199307 8359 7951.65 9MALLEM -5673ROLLIN JEAN 11973 6199304199204 9597 8728.28 9CESP -8786MIMOSAS ALAIN 11973 21993031993061420611637.51 9CANGL -3099MAUR ANDRE 11973 41996051995051450311830.65 9CANGL -1278ENTASSI VERONIQUE 21973 7199606199506 7803 7679.67 9CSANS -6956PRIEURE FRANCOISE 21973 819930919920911389 9851.28 9CSANS -7084AVNEUE JACQUELINE 21974 7199606199506 7803 7679.99 9MANGL -9484DOUMER JOEL 11974 519930819940910363 9232.98 9CESP -9483VILLEBON REMY 11974 8199606199506 7803 7679.78 9CSANS -4120SURBAIX FRANCOIS 11974 719940819930810668 9425.81 9CSANS -6136PASSERO JEAN PAUL 11974 4199606199506 7803 7679.78 9CANGL -9119SERVAN VERONIQUE 21975 7199505199405 7803 7680.00 9CANGL -0958RENDEZVOUS BARBARA 21975 6199307199207 7803 7679.87 9.TECHN -0221ANDALUCIA SERGE 11975 1199606199506 4264 5818.98 9CANGL -1770MARIGOT DIDIER 11975 9199407199307 7803 7679.94 9CCOMPT -2889MANE JACQUES 11975 5199606199506 7803 7680.21 9CINFOR -8800CHEZ JEAN 11975 5199408199308 7803 7680.98 9CANGL -6217MURE GREGOIRE ROBERT 11976 5199607199507 7803 7679.28 9CANGL -9488HARMAS JOSE 11976 8199607199507 7803 7680.27 9CANGL -9074MILIERE ELIANE 21976 6199607199507 7803 7681.26 9CSANS -8755BOITRON MICHEL 11976 4199606199506 7803 7679.67 9CSANS -5066LOGES PATRICK 11976 2199401199301 7803 7680.72 9CSANS -7767CAVOK CATHERINE 21976 4199506199406 7803 7679.49 9CANGL -4014DELAMBRE ALAIN 11976 4199507199407 7803 7680.71 9CSANS -7434CHAMPCEVINEL MICHELINE 2197612199606199506 7803 7681.25 9CSANS -3520CATALINA CATHERINE MARIE HELE21976 9199506199406 7803 7681.34 9CVENTE -6859BILLET JEAN LOUIS 11977 7199606199506 7803 7680.36 9CALLEM -3181NADAUDS JEAN MARC 11977 2199506199507 7803 7679.51 9CANGL -0928DELACROIX CATHERINE 21977 6199607199507 7803 7681.13 9CALLEM -5100BREVAINVILLE GERALD 11977 8199607199507 7803 7679.45 9CSANS -2336ROCAMADOUR GILLES RENE 119331219861119901011131 9658.9910MINFOR -3692ALBIZZIAS DOMINIQUE 11935121965031994011557012566.3610MSANS -1060SEDS ANNE MARIE 21935 61970071991071578112722.8210VANGL -1596OPERA JEAN LUC 11935 31971101991041433211714.3910MSANS -2633SOULEYRAS MONIQUE 21935111958071993012470018540.4410MINFOR -0658LOURMEL BERNARD 11936 51967051994011932314934.8010MTECHN -1362LAC YUMIKO 21937 41965061994012137316332.6910MSANS -7201ILE JEAN PASCAL 1193711198810198309 8656 8145.1210.SANS -7674CASTE PIERRE 11937121971061993072547019086.2710MVENTE -9244LIVRY EDITH 21937 1198901198306 8656 8145.3810.INFOR -4790FRANCIS LYSIANE 21937 2199001198903 8656 8146.5210.SANS -7950CHARBONNIERE STEPHAN 11938 61972051991011433211714.5510MSANS -1814IRMA MARIE 21938101967011989091932314935.3810CANGL -0599FAUBOURG BERNARD 11938 71961011986012273717261.9010MSANS -0425PLUVIERS JEAN PIERRE 11939121971071995081557012567.3610MSANS -7312EST THIERRY 11939111971071992011433211715.4510MANGL -2010CAMP LAURENT 11939 319890119931211389 9852.1510CTECHN -3770COSTES ELIANE 21939 91980071992121471512024.9610CSANS -3046CRIMEE JACQUES 11939 719890619880610494 9309.0810MANGL -5231BONNETERIE VERONIQUE 21940 61962021988042273717260.8010VINFOR -1917CENTRE FREDERICK HENRI 11940 31961091990012739020404.0510MALLEM -0890MIEGESOLLES BERNARD 11940 21960041995043200223583.4110MESP -5720SAULX JACQUES 11941 71971071990071663613343.3310MSANS -4881DESFOSSEZ JULIETTE 21941121976051991051684813422.8110MSANS -5085ALBERIC PHILIPPE 11941 919900719950310407 9271.7010MANGL -0632BESSE PASCAL 11941 51966021989071663613343.7310MSANS -5114SHARON MICHEL 11941 21968081984062022115555.3510MSANS -4229TERRASSE BERNARD 11942 11964111993102137316332.4710MSANS -2811BROSSOLETTE GEORGES 11942 11967121990011663613343.0610MSANS -0937TILLEULS BRUNO 11942 81972061992011433211714.9110MANGL -6193ROOSEVELT CHRISTIAN 11942 71972061991011663613344.1510DTECHN -2942PETEL GEORGES 11942 21974051992071369311287.8610MTECHN -9989TASSIGNY JEAN PATRICK 11942 91971071992011403411520.6610MANGL -1548BARBIER RENAUD JEAN 11942 81961081986042273717260.1910VINFOR -9612LAURAGAIS PHILIP 11943111972031995042547019084.9710MCOMPT -0194FOUQUEVILLE BRIGITTE 21943 51963041991072273717261.1310MSANS -2327GAVOTTE JEAN MARC 11943 11974051993011369311287.1010MSANS -9716HENRI JACQUES 11943 31963041993032922321685.2910MANGL -2720LOCMIQUEL BERNARD 11943 6199301199201 8656 8145.4410.SANS -1736OLIVERAIE VERONIQUE MICHELLE 21943111971071991071578112723.5010DANGL -5205PIOCH VERONIQUE 2194412199302199202 8656 8145.2610.SANS -3085TRASTOUR GERARD 11944 61972041990011433211714.0710DSANS -0317MOUETTE THERESE 21944 51972051988101621213032.5110MSANS -5694PIERRELAIS ERIC 11945 81972091976082022115555.4410CANGL -1116BOISSISE ANNE MARIE 21945 1198901198606 8359 7952.1210.ANGL -4722BRIMONT MARTINE 21945 5199007198907 8656 8147.1710.INFOR -3958CRAMCHABAN MICHEL 11945121969011990101433211714.5110MSANS -7673SURESNES JEAN PIERRE 11945 61982011992101249910472.1010DSANS -7687VALET JACQUES 11945 61972071989011621213032.1710MANGL -8152TAILLIS FRANCOIS 21946 91976021991101578112722.6610MCOMPT -0924BONAVENTURE REIKO 21946 91971011993042547019086.4510MVENTE -8336MASSUGAS MICHELLE 21946111968111992091834514274.3910MSANS -8834LEMENC DIDIER 11946 11974031992102334017609.9510MSANS -6052DURAND LAURENT 11946 21972121988061932314934.9910MSANS -8405GAULLE JACQUES FRANCOIS 11946 31969051989012273717261.7510MSANS -7901VIOLAINE JACQUES 11946 419840719900711131 9659.1710MALLEM -9538SUEDE JEAN MICHEL 11946101971021991011433211715.6910MSANS -7317MARMONT ALAIN 11947 91973051991071621213032.1210MSANS -8240ASSOMPTION JACQUES 11947 11973011991072837121100.6710MALLEM -8104FRERE DOMINIQUE 11947 11975041993011369311286.0310MVENTE -6906VILLEFRANQUE FRANCOISE 2194810199107199007 8656 8145.4410.MARKT -4316DOMDES NOELLE 21948 51971011989082022115554.9910MSANS -8058RANGE MARIE CLAUDE 21949111973061991071578112722.2410MSANS -6117WILSON MICHELINE 21949 21970011993111834514274.5310CSANS -2977CERISAIE CAROLE PAULETTE 21949 81972051993111471512025.8210MCOMPT -3294PLOUER MICHEL 11949101969101989042022115555.4110MCOMPT -4908GIRONDE PATRICK 11949 41981091992011249910472.6910MSANS -2440AJAC FRANCOIS 11949121974081990011684813423.2610MSANS -6866MUSTAPHA VALERIE 21949 71970111994071834514275.3810MALLEM -9238CHOISY JACQUES 11950101976081992042022115555.4810MSANS -5421NATIONALE FRANCOISE JEANNE 21950 21971061995121684813422.3610MSANS -7441ROCHE CLAUDE 11950121977051993041369311288.0110MINFOR -2053LOIR MONIQUE 21951121972061990011621213032.0610MANGL -6550BELLEVUE FREDERIC DAVID 11951121970111990122470018540.4210MANGL -0900PAT VICENTE 11952 61977071991011369311287.7710MINFOR -9719BERAL YVON 11952101986101994011433211714.3710MVENTE -8718VIENNO DOMINIQUE 11952121976101991011369311287.8310MSANS -5348CRIKET JEAN 11953121979051995041471512024.2110MSANS -7442DETAILLE JOEL 11953 81973031991012334017608.5310MSANS -7704MARTILLE CATHERINE 21953 21973041991072137316330.5310CANGL -3122MADELEINE CLAUDE 11953 31978061995041471512024.7810MANGL -7454AURAY MARC 11953121972121992122175716601.7510MSANS -2338LAMARTINE DOMINIQUE 11953 81981051992011471512025.4710MSANS -5898ITALIE DENIS 11955 419941119920110791 9502.4110MSANS -2818ENTREPRENEURS BRIGITTE 2195610199506199406 8359 7951.8010MSANS -4736MONTBRIEUX LAURENT 11956 11982051991071471512024.9210MSANS -5607ORBAY GILBERT 11956121976071994011369311288.0110MTECHN -6044BRONZE CHANTAL 21956 31978031990101911114779.0510CESP -2949AIGREFEUILLE HERVE 119561119810119840811389 9851.9210MTECHN -1891POSTALE DIDIER 119561019820319810611131 9658.0110MSANS -6887ESTADOU MARC 1195712199311199211 8656 8146.8810.COMPT -3156FLACQ PHILIPPE 11957 11980081992011608112915.1510MINFOR -0665MIRAGE HERVE 11957 41978031995041249910471.8810MSANS -9619SOLEIL SYLVIE 2195811199406199507 9126 8456.9610MTECHN -7598COTES MARC 11958 41978041995041249910471.9410MINFOR -1289SOUCI ANNE 21958101980071979071194310202.5910MSANS -5278SEYSSUEL ROSELYNE 21958 51979021993071608112917.1010MSANS -5065INDUSTRIE JEAN PIERRE 11958 81978071995041249910473.1510CSANS -6257PLESSIS JEAN YVES 11959 51983041994011433211714.2810MVENTE -5018CHAUX JEAN 11959 91979061993041471512026.1810MTECHN -4009PLEIN ANTHONY 11959 719810119800511389 9850.5610MTECHN -9730PRINCE JEAN JACQUES 11960 31982051991091326611017.5010CSANS -1357TAMNIES FRANCOISE 21960 11980031979031215710279.3810MSANS -8601VALMY PIERRE M 119601019820319810311131 9657.9610MTECHN -5371ARC GILBERT 11960111988101996012773220636.1610.INFOR -0267OLIVIERS DIDIER 11960 7199312199212 9597 8728.6410MSANS -3866FLEURIS JEAN MICHEL 11960 41986021993041288210744.6410MTECHN -4485ALLEMANE PHILIPPE 11960 71983011989041608112915.2410MSANS -1801CAUTEGRIL CORINNE 21961 11981031992061527112372.9010CTECHN -0557BENEFIAT MARTINE 2196111199412199312 7803 7680.7710MSANS -2605MATHURIN PIERRE 119611019830419820411131 9658.4710MINFOR -8035BASSETTE BERTRAND 11961 31987081986081288210743.8610MANGL -4026GAJAC KARIN 21962 81983011982011608112916.3210MSANS -8790TREDREZ LEONIE 21962 71986061985061288210745.2210MSANS -0932BASTIDON MARYLENE MARTHE 21962 7199301199201 8656 8146.4210.SANS -1052MARJOLAINE PHILIPPE 11962 11984111991071868714507.4710MSANS -3917FONSORBES JOEL YVES 11962111982061988051326611016.6210MALLEM -6770ROUBIN FREDERIC MARC 11962 719840419870211131 9658.4110CSANS -9591BAS EDOUARD 11963 319850419841210791 9503.5810MSANS -0126LALA MICHEL 11963 219830619820611131 9658.7410CESP -0547GAUMERIE EDGAR 11963121985011994011433211714.2510MANGL -5064LOISIRS GEORGES 119631019851219860510791 9503.6610MALLEM -6975BOUCHET YANNICK 11964 61985111985112090215981.0610MESP -2365TERNES ERIC 11964 51983081994011433211714.4310VVENTE -1287OIDE MARIE LOUISE 2196412199201198703 8656 8146.9710.SANS -1746MICHELETTE GERARD 11964 619840719830710791 9503.7410MSANS -4496COLONEL MONIQUE 21964 41984091983091288210744.8610CSANS -6420MERCURE MICHEL 11965 61985121993121288210745.0010MSANS -2452FEUDON ANNICK 21965 81989061988061249910471.8910MANGL -3490DION ALEXANDRA YVETTE 21965 6199504199404 7803 7680.5910MVENTE -9441GALLET JEAN CLAUDE 11965 11991021994022256617147.1310MSANS -8588JARRES GERARD 11966 919880319870310407 9271.5610MSANS -1291HERMITAGE XAVIER 11966111991101990101330611016.3310CSANS -6530ETRUN PATRICK 11966 31989111988111539912452.4210MANGL -1352PLAIS JUAN CARLOS 11967 419870719860710407 9270.9110MSANS -7277REY MICHEL 11967 21995081996012559919162.3610CSANS -1793BARBE VALERIE ANNE 21967 5199201199101 7803 7680.5910.INFOR -3158KERIOLET FRANCOIS CHRISTOPHE 11967 41990051992121381911365.8510CSANS -0027DANS JEAN PIERRE 11967 719920119910110024 8999.9910MSANS -6374PUISEAU THUY LAN 11967 61987041991121249910472.2410MESP -9025BEUVRON PATRICK 1196711199606199506 7803 7679.4610CANGL -9820CHARLES CATHERINE 2196710199507199407 8656 8146.4610MALLEM -6484VIGNAUD PATRICK 11969 91990071992031381911365.6710MSANS -1414BRUNE SYLVIE 21969 619890219880211302 9775.1910MSANS -4633MICHELET JOHAN FR 11970 619901219891210024 8999.7210MINFOR -2182PLANTIER PHILIPPE 11971101995091994091450311831.5510CSANS -8157LILAS PIERRE 1197210199207199107 8656 8146.5510.SANS -5454LOIR MARIA 21973 5199406199306 7803 7680.1410CANGL -9209CARREFOUR SERGE 11974 6199505199404 9126 8455.7410MALLEM -3395ADAM JEAN CLAUDE 11974111993091994011202810241.5810CSANS -8662REIGNIER JEAN MICHEL 11975 9199607199507 7803 7681.4710CSANS -8679MOUTONNE MARIANNE 21935 9199408199201 9085 8419.1611DCOMPT -9359RASPAIL ALAIN 11935 91963121994103200223582.5411MTECHN -0977DELBESSOU JEAN CLAUDE 11935 91958051992013844228044.4211MANGL -5628REPUBLIQUE PHILIPPE 11935111967011995041557012567.7211MALLEM -5361CHAUMIERE CHANTAL 21937 91967011992011471512024.5111MANGL -8814KIKOCHI CHRISTINE 21939 819880519870510407 9271.4611MTECHN -3550CONCLUE PAULETTE 21941 21973081991071578112723.7211MTECHN -3525PAU CLAIRE 21942 81965021991122334017609.2411DSANS -6963CEZANNE CAROLE 2194310199411199311 8656 8146.7911MALLEM -1837FRIZAC PETER 11943 81976041995011578112721.6711MINFOR -5658SOLANGIERE JEAN 11944121969121990041433211715.0511MSANS -7261MONTGERMONT SOPHIE JEANNINE 21945111971111995041834514274.5111MANGL -4785LODI PHILIPPE 11945 21980071994011471512024.5611MESP -5841PORT JACQUELINE 21946 41970021969021300910822.2611MANGL -0606BAGEN MARIE JEANNE 21946 11970121993032022115555.6811MSANS -5640GALLIA BENEDICTE 21946101973101993121911114780.1311MINFOR -0298BRETIGNY MICHELINE 21946 5199208199108 8656 8145.8011.TECHN -3925PELLETIER MARTINE 21946111968111993012137316332.0911MSANS -7692BARBIN MARIE NOELLE 21948 21968111990012137316331.0611CINFOR -3739JUIN MARCEL 11948111981091992011249910472.7411MSANS -7300URANIES CHRISTIAN 11948 91973021992011433211714.6011MTECHN -6456TUBLERIE CAROLE 21949 81968111992032470018540.0611MANGL -3324TAMANACO MARTIAL 11949 21974061993011369311288.2211MSANS -8400LOIRE MURIEL 21949 41969031991091834514275.4511MSANS -9140RENAITRIE CLAUDE 11949101980071995041249910473.7211MSANS -5589SITE PATRICIA 21949 7199508199408 7803 7679.4611MVENTE -5386MEDECIN JACKY 11950 21975051992101369311286.8711MSANS -2377VOLTAIRE CHRISTIAN 11951111976101993041471512025.2511MSANS -4340BAUDRIMONT JEAN FRANCOIS 11951 41984071993121326611017.5511MINFOR -0397PAREAGE JEAN YVES 11951 81979071994101249910472.9611MANGL -9259PEYRAS CHANTAL 21951 4199608199508 7803 7679.6411MVENTE -1711ESTAGNOL BRUNO CLAUDE 11951121983051992071578112722.6611MINFOR -4351CHARRON ANNICK DENISE 2195210199408199308 8359 7952.4311MALLEM -2396CHAPELLE JOCELYNE 21952 41976061975061288210745.0911MANGL -3571OBSERVATOIR NICOLE 2195211199610199510 7803 7679.9911MSANS -2219LISA MARIE LOUISE 21952 11973061991041578112722.4211MSANS -7029VIERGE DANIEL 11953 51976091994112547019086.5111MSANS -6315EPSOM LAURENCE SONIA 219531119961019951010668 9425.3111MSANS -8330GUISE VERONIQUE 21954 91975071974071215710279.3211MTECHN -4963GUILLOTIERE ROBERT 11954 21977071992072350617727.3311MSANS -9223MARCHAUX JEAN PATRICK 11955 91975031991071578112722.0711MINFOR -8081JAMBLES BERNARD 11955101980061995041249910472.1211MSANS -2906DOUGLAS ERIC JEAN MARIE 11955 21978051994011369311287.7711MSANS -3749MAGNAN PIERRE 11956 7197910199111 4134 0.8911MESP -8176THENOT DIDIER 11956 71980021982102470018541.8311MSANS -3392SIMON PIERRE 11956 61979021994041249910472.7011MSANS -6393BERGERS LYDIE 2195611198901198604 8656 8146.4111.VENTE -7181CABAUDRAN FREDERIC MICHEL 11957 21978061991102529918969.2211MSANS -6568LANDEDA THIERRY PATRICE 11958 31979071993071471512025.9511MSANS -0333DAPHNE CHRISTOPHE 11958 719820619810611131 9657.6211MSANS -2504TREICH JACQUES 11959 51982051994081638413149.5711MALLEM -3534KHRAIEF CHRISTIAN ANTONIN 11959 61981031995021433211714.7011MSANS -9601PECLET GENEVIEVE 21959 119791019781010024 8999.7411MSANS -2575BELLEVUE FRANCIS 11959101980051991091369311287.1611MSANS -1679GRIGNAN GERALD 11959 71981081993081804514082.7211MANGL -4039GOULAINE EDWIGE MARCELLE 21959 51979081993071471512024.9611MSANS -3106YABBOQ CHRISTINE 21960 119910619900610024 8999.7011MANGL -5771GONDS JACQUES 11960 21983051995011433211713.8911MSANS -3478ATHOS FRANCOIS 11960 21983081989112090215980.7311MSANS -3217MOINES FRANCE 21961 51982111981111326611017.1611MTECHN -3318EPINAY DIDIER 11961 51982111995091450311832.0011MVENTE -0241PROVENCALE CHRISTINE 21961 11984021983021249910472.6111MSANS -7712JANVRY CHRISTIAN 11962 41986081995011373711328.3211MTECHN -8426FILET GLORIA 21962 1199607199507 8656 8146.2911MSANS -2991BOIRARGUES MARC 11962121982061990091326611016.1711CSANS -4250FOREST ANGEL 11962 219830819950911131 9657.3911MINFOR -0642GOGH ANNICK 21962 719960219930410668 9427.0711MSANS -3978FONDETTES YUKIKO 21963 71984081983081527112374.5211MANGL -1989BRANCION MARIE JOSEPHE 21963 51990041993081330611017.2911MSANS -7919CERFS BRIGITTE 2196310199310199210 9597 8729.1711MALLEM -6531DORMELLES PIERRE JACQUES 11963 41983041982041326611016.5111MSANS -0104SALETTES FREDERIC 11963 219860519850511131 9658.8611MMICRO -3391LAURISTON JEAN CLAUDE 11963 41983061991091326611017.6511MINFOR -9918BOULEAUX DANIELLE 21964 8199505199405 8656 8146.1111MSANS -9860MOREAS LOIC 11964 2199303199203 9597 8728.9811MSANS -4629LEMBRAS MARC 11964 31988041989011527112374.8411MSANS -8531SIGNORE CHANTAL 21965 4199607199507 7803 7680.8911MSANS -5775GRANDS LINDA 21965 41988061987061249910473.6311MESP -0548VALERIEN PHILIPPE 11965 71986041995041710713577.0111MSANS -5728MUCHARISTA GILLES 11965 81985071991121288210744.9511MSANS -0495ALIZES JEAN MICHEL 11965 61986071993111288210745.2211CTECHN -3119GAMBETTA JEAN PIERRE 11965 519851119841110791 9502.2311MANGL -7770NOTTET CHANTAL 21966 31985101984101288210744.2611MALLEM -7186ILLIERS FRANCK 119661219921119911210024 8998.3111CANGL -5800COLOMBIERES VERONIQUE 21966 71992081991081202810240.8611MSANS -8549ROMAI PATRICK 11967 81987041993081450311830.5811MANGL -2557CHAI CATHERINE 21967 9199201199101 7803 7680.9811.INFOR -5044ROUSSILLON HIOU SHU 21967 51987111993031381911365.1911CSANS -3101MARECHAL JACQUES 11967 91988071993011839014313.7211MANGL -9282LEOPOLD ALAIN 119671119880519890910407 9271.9711MSANS -1201PEYRERE PASCAL 11968 919881219871210407 9270.4211MALLEM -7061TEICH PAUL 11968111994031993031267210588.7411MSANS -5746HARRIAGUE GERARD 119681119900919890910407 9271.1911MANGL -6486MAR ALAIN 11968 1199404199304 7590 7564.3511MSANS -0773VICTOR JEAN CHRISTOPHE 11968 71994081993082107316096.7111MALLEM -3494VILLARCEAU ISABELLE MARIE 21969 7199609199509 9894 8921.5911MSANS -1068AMOUR DIDIER 11969111991051990051467711987.6711MINFOR -1796ROCQUENCOURT FRANCK 11970121991091990091202810241.7011MANGL -6197WRIGHT ANNE 21971 919930319920311389 9850.7011MSANS -9660CYPRES GERARD 119711019900719890710024 8997.9011MALLEM -8022ARCAY CLAUDE 11971 51992111991111202810240.1311MSANS -3764CHEMIN FABIENNE 21971 219951119941110668 9425.6411MVENTE -2448PINCHINADES JEAN CLAUDE 11972 21995051994051450311831.0111CALLEM -1927VALESCURE PHILIPPE 11972 4199501199304 9597 8728.7711CSANS -2074AZUR DIDIER 11972 51993111992111267210588.5311CTECHN -9842BASTIDE ERIC 11972 5199312199212 9597 8727.9111CSANS -5954SABLES ROCCO 1197212199305199205 9597 8728.1911CSANS -0278PAIXENT JEAN MICHEL 11972121994101993101360611210.6011CSANS -1572DAGNY BRUNO 11972 11993101992101360611210.2811MSANS -4298AIZIER NICOLE 21972 219940719920111389 9852.4211MALLEM -2321DESIRADE EVELYNE 21972 119910719900710024 8998.1311MTECHN -6794CHEUVRY PHILIPPE 11973 9199207199107 9597 8729.9211CSANS -8383ETIOLLES ANNE MARIE 21974 5199607199507 9894 8922.2111CSANS -3562PORSCAVE GEORGES PASCAL 11974 1199508199408 7803 7679.9911CANGL -6773GERANDO NICOLE 21974 51995051994071450311831.9711CANGL -4226APPY BERTRAND GEORGES 11975 2199606199506 9256 8532.5611CTECHN -1343SANS FRANCOIS 1197510199410199310 9126 8456.3911CSANS -6979ANGLAIS NADINE 21975 7199304199302 8656 8145.5711.SANS -5254BERLIOZ DANIELE 2197610199607199507 7803 7680.5011CTECHN -0275FRIARD GERARD 1197610199608199508 7803 7681.4711CSANS -3929CHATEAU VERONIQUE 21935 2199301199201 9085 8417.4612VANGL -2917PASTEUR NICOLE 21935 31967071990011932314933.6012MSANS -4491FALLIERE CATHERINE 21935 7199109199507 7677 7603.7312.ANGL -4190CHRISTOPHE DOMINIQUE AUGUSTE 11935 31977111992101369311287.1912MANGL -3826RAYON BERNARD 11935 319830819820811389 9851.7412DESP -2841SEVERINE PHILIPPE 11936 6199409199309 8656 8146.7412MANGL -6337FREDERIC CATHERINE 2193812199201199101 9085 8417.6312SSANS -7355ANTOVAL JEAN FRANCOIS 11938101961021995043200223582.3212MANGL -8990DETALOUX CLAUDIE 21938 71962071984102273717260.0812CSANS -7576SEBASTIEN BERNARD 11939 51971121991071663613343.3712MCOMPT -3808CABRIES ANNE LOUISE 21939 31973071985041834514275.9512VSANS -3333BOSQUE JEAN YVES 119391219900919920310791 9503.1612CTECHN -0851ORANGERS CHRISTIAN 11939 11973071992011433211715.2212MALLEM -7226ROYA FRANCOISE 21939121962121983122470018541.7912MSANS -4767DOMITIA VINCENT 11939 6198912198504 8656 8145.1112.VENTE -1932LEROY FRANCK 11939101968101991011433211714.2112MTECHN -4220GUERINIERE MICHEL 11940 11971041991011663613343.9712MSANS -5021MONTLANDON RENE 11940 61973041993011369311286.6612MSANS -3088ALTAIR NICOLE 21941101962031994122470018540.1712MSANS -2222MILLET JACQUELINE 21941 21970051992072137316331.7812MALLEM -6726HURONNERIE CHRISTIAN 11941101980031992011403411521.2912MANGL -1951ROSIERE GILBERT 11941 91971031990011433211715.5412MSANS -4436CHAVANNES MARIA LUIZ 21942 51968111991072137316332.6012MSANS -9151CHATONNAY PAUL 11942 21969021990071433211715.6312MTECHN -2643SOUSBOIS DOMINIQUE 21942 31962041988122470018540.2412MSANS -6554SARCELLES JEAN MARIE 11943111963071993083200223584.0712MTECHN -6672RENDEZVOUS FRANCOIS 11943 11969091990101663613343.6012MSANS -3579RUISSEAU DANIEL 11943 31965011994011557012567.1812MANGL -0484PAUL CORINNA 21943 61965121988062470018540.6612MSANS -3880ROUVRES ERIC 11943 819931119950610407 9271.7412MSANS -4665MONTEE JOSETTE 21943111968041991052470018540.5712MSANS -3302VERS JEAN 11944111970061991011433211714.8712MANGL -6749AUCUN JEAN CLAUDE 11945 11974071992041471512025.0212MINFOR -6957RESIDENCE EVELYNE 21945 61971071991101578112723.4212CSANS -1669CHEZY PIERRE 11946111976051993011369311286.0612MSANS -1674AVENIDA SYLVIE 2194611198806198706 9511 8688.4112DINFOR -6741FONDS GEORGES 11948 11977041994011249910472.1012MSANS -4859ZORI CATHERINE 21948 81968111991021834514274.7012MSANS -1314MINES JEAN MARIE 11948 31975061993071369311288.1812MALLEM -5393PROVEN ANNICK 21948 9199309199209 8656 8145.0612.ALLEM -9886FLAUBERT YOLANDE 21948 41968041995111684813422.3612MANGL -8118JUGY JACQUELINE 2194912199504199404 8656 8146.6412MTECHN -3693RETRAITE MARYSE ARMANDE 21949 9199201199101 7803 7681.4712.SANS -7335PETITES MICHELLE 21949 71970101990112043315671.1512MSANS -6896MERIMEE PATRICK 11949 11972031995011834514274.2412MANGL -0173RESIDENCE HARRY 11949 71973061992101369311287.1412MVENTE -7211LAVIGNAC MARIE ANNE 21950 6199307199207 7803 7680.0912.SANS -6258DEAUVILLE SALIM PHILIPPE 11950 61975101993011684813423.4912MSANS -6945BERANGER AGNES 21950 11970011989011621213034.1012MSANS -6072LAZUEL CHANTAL 21951 11971051995041834514274.4412MSANS -3233GRETZ PATRICK 11951 61981041993011608112917.2412MSANS -3090VERTS THERESE 21951 21972101987072334017610.2012CALLEM -4522POISY BRIGITTE 21951 41973051991011578112722.7012MSANS -1211SAINTE PIERRE 11951 219940119940110407 9272.1312MSANS -9697RUE NADINE NICOLE 21951 11977071991051608112915.7412CTECHN -7336GRURY ANTOINE 11951111977051993041369311286.9212MTECHN -4900BENARD JEAN LOUIS 11951 71973081992032470018540.1512MSANS -0543BARETY JACQUES 11951 71977031993011369311286.8012MSANS -4195GRENIER THIERRY HENRI 11951 71979011994111403411522.0912MALLEM -6636BERANGER JEAN PIERRE 11951 619831219821211131 9659.0112MALLEM -1282PALOMBES OLIVIER 11952 81979061995011621213033.3712MESP -7146VENERIE YANN MAR 11952101981031992011249910473.4712MSANS -8503GIRELLES MARTINE 21952 41993111992011202810240.1312MANGL -9767ROUBLOT FREDERIC 11952 71976121991071578112722.3712MSANS -1506BELLES SERGE 11952 1199301199201 8656 8146.7012.SANS -5411MERMOZ BRIGITTE 21953 419910919900910024 8997.8112SSANS -8001PANORAMAS JACQUES 11953111980031992101369311287.3212MALLEM -8972NOGUES JEAN 11953121981091992011249910472.0112MSANS -6536MARX EVELYNE 21953 7199201199101 9511 8688.8912MANGL -3768LAMBRIGOT PHILIPPE 11954 51976071991012022115554.5412MSANS -0662BRACQ GEORGES 11954121975111993121369311286.4712MSANS -5304BETOUILLERE NORIKO 21954 71979061993041433211713.9212MALLEM -4215PARA KARIN 21954 91979071992111608112915.5312DSANS -2037FORGE LUCIEN 11955 21984021992111578112723.2412MSANS -2945ABBEVILLE PASCAL 11955101983101993011471512025.4612MANGL -2849NERTHE MARTINE 21955 21978091993101471512025.9212MSANS -3488REVOL ANNE 21955111977071992011471512024.0612MSANS -4431LAUNAY LOIC 11955101984091993011215710278.6912MSANS -8724CASSIFLORE ROGER 11956 11976071985102397418036.3812MANGL -0629FRANCOIS SANDRINE 21956 91977071995101881314586.0612MSANS -4823RENARDIERE JEAN LOUIS 11956 41977031992111608112915.2912MSANS -8808ENGHIEN MAX 11956 91977061992011471512025.6512MVENTE -2432MICHELE ISABELLE 2195710199611199511 7803 7679.4512CINFOR -7158CAPITAINE DOMINIQUE 21957 91978061993031608112917.0412MSANS -6317COURLIS GUY 11957 21980051992121369311286.7412MSANS -7608DESSUS SABINE NICOLE 21957121979031993041471512025.2812MSANS -3637PEYRIERE FRANCOIS 11957 81979111995101911114778.2412MSANS -9600HAKEIM THIERRY 11957 51981031986092256617146.6812MANGL -1537RESISTANCE SERGE 11958 81986031991101868714506.0112MSANS -3033PIERREDON JEAN LUC 11958 51980041992121471512024.7812MSANS -9058ROYALES ALAIN 11958 31982081994041326611016.6912MSANS -1074PONTILLARD JACQUELINE 21958 51981111980111608112915.8412MALLEM -0339VERNOCE THIERRY 11958 81982041994041471512025.3212MSANS -1325ZOLA CHRISTINE 21958 81978121993041471512024.9312MSANS -6083HAIG MICHELE 21959 419791119781110876 9502.3712MSANS -9351QUIHOU STEPHANE 11959 41988061992091450311831.2512MSANS -9582LAENNEC COLETTE 21959 41983071982071326611016.0812MSANS -5220RECOLLETS YVES 11959 51981011994011471512026.1512MSANS -5140DAILLON DOMINIQUE JEAN 11960 31984071995081527112374.5812MANGL -4446ELPHEGE PIERRE YVES 11960 419840319830811131 9657.2612MANGL -0969BOUNIN PHILIPPE 11960 71983031991111616712995.2012MSANS -2335CAILLOUP CHRISTINE 21960 11980091994071471512025.0212DSANS -8339MER ISABELLE 21960111980101979101684813422.5712MANGL -6061ESCALES JEAN MARIE 11960 51982051995121804514082.6512CSANS -0818GATTIERES PATRICE 11961121983121989031527112373.0812MTECHN -5053LARUE KARINE 21961 8199407199307 8359 7952.0712MSANS -9219OPALINE EVELYNE 21961 61983111982111202810240.8412MALLEM -6160LAURENT ANNICK 21961 51982091981091527112373.7112MANGL -9514GARGAS NICOLE 21961 31981041980041684813421.4912MSANS -2936KIPLING ERIC 11961 419830419830711131 9659.2212MTECHN -3023BOREL PHILIPPE GILLES 11961 51982041981081608112915.8912MSANS -5767BORGHERE PASCAL EMILE 11961 51985061989112090215981.0912MSANS -9519SUISSES PHILIPPE 11961121985031984031608112916.4312MSANS -7271BOUEL JEAN LUC 11962 21982071990101527112374.1612MSANS -1969BIERE SIMONE 21962 3199404199304 8359 7953.2412MESP -1388MOLIERE GERARD 11962 71987081988011527112374.2012MSANS -5714NICOLO DIDIER 11962 11983071984121608112916.8112MCOMPT -1039ATTILL ERIC 11962 91983081984091608112916.6412MALLEM -4474SAUSSAYE MICHEL 11962101989011992121249910471.9712CANGL -0108ORBESSON MIREILLE 21962 81983041989112090215981.4112MSANS -8464DIJON JEAN LUC 119621219860219850210791 9503.7012MINFOR -0217MAGDEBOURG PIERRE 11962 51986071995011373711327.8712MANGL -5259VANOEL SERGE 11963 81984021991011868714507.8512CSANS -6176GOETHE GILLES RAYMOND 11963 41983051993121326611016.5712MSANS -3711SIGNAL KARIN 21963 6199407199307 9126 8456.8212MCOMPT -5792ARCACHON SERGE 11963 519931019910710407 9271.9712MCOMPT -2491OSSOLA ANNIE 21963 51993101992011202810240.2612CSANS -5463PERE JEAN LUC 11963 819860319850310791 9503.8812MSANS -0572ALSACE MICHEL 11963 219830619920111131 9658.0212MANGL -5197LATECOERE BERNADETTE 2196411199201199101 7803 7680.2312.SANS -3820SAUSSES MICHEL LOUIS 11964 31986061985061288210743.8312CINFOR -3831CRESP BRIGITTE 21964 6199109199009 8656 8145.8412.TECHN -7862GUILLEMARD GERARD 11964 619870419880910791 9503.2712MSANS -3863TREMOILLE LAURENT 11965111989011991051249910473.0012MTECHN -2269VERDUN DIDIER 119651019870219910110407 9271.4212MSANS -4817VAUCLUSIENS JEAN PIERRE 11965101986051991091288210743.8612MVENTE -8120BUSSIERE LYNDA 21965101988041994121450311832.2912MSANS -9872ROTTEMBOURG PHILIPPE 11965 71985071991091288210745.6112CALLEM -3157GEORGES MARC 11965 119870219860210791 9502.1412MVENTE -5375GRAFFIANE ROBERT 11965 119870419861210791 9502.8912MSANS -9838SELLE XAVIER 11966101992011991011202810240.9512MSANS -4716BEG PASCAL 11966 61987061992041249910473.4212CANGL -8142FONTENIL MADELEINE 21967 91990051993051723313653.6012VESP -4631ROBINS ISABELLE CAMILLE 21967 61993111992011202810241.8112MSANS -0875RESISTANTE ALAIN 11967 61988041994011249910473.1812MSANS -7618JUANE JOSEPH 11967 919880919910210407 9270.4812MSANS -6297QUINT MARIE CHRISTINE 21967 11989121988121202810240.8412MINFOR -9234SAINTRY FRANCK JEAN 11967 619891019881010791 9502.8912MSANS -0878MERIMEE GUY 11967 81990011989011467711986.9112MSANS -7463VALETTE BERTRAND 11967 91987051994051381911366.9312MSANS -1043RAMBOUILLET JEAN FRANCOIS 11968 81990071989071381911364.8712MANGL -2350PANPYC CLAUDE 11968 91990111989111467711985.8712MSANS -9468GUEPIN EVA 21968 41989051988071949415051.6812MSANS -4690VERLIN YVES 11968101989111994011249910473.4712MINFOR -4832BAYARD CORINNE 21968 21990111989111202810239.8312MSANS -2141CHATAIGNIER CATHERINE 21968 519940919930411389 9852.2212MMANAG -2439AIGUILLE CATHERINE 21968 9199407199307 8359 7952.2512MVENTE -2895PASSAGE PHILIPPE 11968111990031989081381911366.2212CSANS -6720ANTHEOR VINCENT 11968 21988051993041249910472.6412MSANS -4877AUBIN PATRICK 11968 71990011989011202810239.7812CSANS -7975GUITTARD ISABELLE 21968121993121992011202810240.1912MSANS -3884DESMOULINS ANNIE 21969 2199510199410 7803 7680.5012MSANS -4326CASSIOPEE JEAN PIERRE 11969 21989031988031249910473.5612MSANS -9844DAUDET ROBERT 11969121993101992101330611016.3012MALLEM -1235TRANSIT CHRISTINE 21969101992031991031420611639.2212CINFOR -9148CARTIGNY TONY PIERRE 11969 81994091993091450311830.6212CMANAG -1898VEUVE BERNARD 11969 119891019881010407 9270.6912CALLEM -4856BELIER JEROME 11970 11990111992011381911365.6212MSANS -3215BASTILLE GILBERT 11970 219921019911010024 8997.8612CSANS -1681VAUCHAMPS THIERRY 11970 319940419930111389 9852.2412CVENTE -0330GIRAUD DIDIER 11970 319940319920110024 8998.7112MALLEM -2920FONZERI PAUL 11970 81993061992061267210590.0212MTECHN -3390CLANS LOUIS 11970 51989111988111539912451.9712CSANS -7148OISEAUX FRANCE 2197011199004198904 8656 8145.6612.MANAG -2817GAIRANT MONIQUE 21970 319910719900710024 8997.9112CSANS -8162VOLONTAIRES MONIQUE 21970 5199410199310 7590 7564.3812MSANS -9567LEGUMES CHRISTINE 219711119950419940110668 9426.0312MANGL -2435BRESSON SYLVIE 2197112199007199101 8656 8145.9312MSANS -0955BEAUGENCY LAURENCE 21971 1199206199106 9597 8729.9712CSANS -4021VICOMTE ROLAND 11971 119900619890610024 8998.0112MINFOR -7963MONTESQUIEU HENRI 11971 51993081994011249910473.0512MVENTE -9955WAY JEAN MARC 11971 1199305199205 9597 8728.0112CSANS -1833INKERMANN LAURE 21972 919930519920511389 9851.3912MANGL -4630CHEVREUILS CHRISTINE 2197312199306199206 8359 7952.0112.TECHN -3273MIREILLE ALAIN 11973 819931119921111389 9851.5512CMARKT -6842DARONNE ALAIN 1197311199307199503 9597 8729.2212CINFOR -5953BOURGEOIS BRUNO 11973 21993081994011202810241.9212MSANS -3467PONTIER ALAIN 11973 619930919920911389 9850.5612MSANS -6507MAYVILLE CHANTAL 21974 1199208199302 8656 8146.4112MANGL -4060HALLEGUEN MICHEL 11974 11993121994011202810241.7012CSANS -8760RAGUINOT GHISLAINE ROBERTE 21975 1199507199407 7803 7681.4412CSANS -1454NEUF GILLES 11977 9199606199506 7803 7681.3512CSANS -2092BRASSAURIS MICHEL 11931 91956101978013327724477.6013VSANS -8552VIOLET DIDIER 11933 4198810199501 8827 8263.5613.SANS -6589DEVENCON BERNARD 11934111955111993103417325098.4513MSANS -7036PERNETY FREDERIC 11934101961111987102273717260.4013MINFOR -7079CHARDONNERETS LAURIS 11935 31978071992011403411520.5313CINFOR -9868JAURES MICHEL 11935 51970051992011403411521.2013MSANS -8365HELIOTROPES LISE 21935 11963021991072273717259.8613CSANS -7450POISSON CHANTAL 21936 91968111989011621213033.5613MINFOR -9779CONSOLACAO NATHALIE 21937 3199401199201 9085 8417.3613VSANS -8202DIANE JACQUELINE SUZANNE 21937 61972041989101621213032.8713VESP -5521LAZURE RAOUL 11937 31966021995011557012567.6313MTECHN -7843NOM ETIENNE 11938 1199001198510 8656 8145.6213.SANS -7282IRISASCO ERIC STANIS 11938121958081988013844228045.3713MSANS -3124VIVIER GEORGES 11939121967011994011663613342.8513MSANS -1445GAUSSADE FRANCINE 21939 11967121992012137316332.1113MSANS -5399GROSSETI JACQUES 11940111969011990011433211714.7913MSANS -7177MONTSEGUR DOMINIQUE 11940 2199206199106 8656 8146.8313.ALLEM -4475SOLEIL JEAN CHARLES 11940111962041993043417325097.6413MINFOR -6615GRAVELLE CLAUDE 11940 419880319870810407 9270.3013MESP -5880OR LILIANE 21940 8199301199201 8656 8147.0113.ANGL -0756RENARD PATRICK 11941 71960041991013327724477.7213MSANS -9016SIMON JACQUES 11941 81973061992101369311288.1813MANGL -4931AIGNAN SALOMON 11941121972111992011403411520.2913MSANS -7676ROUX DOMINIQUE 11941 81969121990011433211715.5413MSANS -3434NOUVELLE GUILLAUME 11941 31970061991011433211715.4713MSANS -1569MOULINS CATHERINE 21941 31993051993101249910472.9113MSANS -4399SOLDATS ANNE 21941 71963091994011932314934.0013VSANS -4929MANOUCHIAN RICHARD 11943 41979011992011249910473.3213MALLEM -5101CLOT PATRICK 11943101977041995011578112723.1813MSANS -1399PLANTES MEDERIC 11943 61962111991072273717261.5413MTECHN -4835LECHIAGAT MAURICE 11944111963121993082922321683.6013MSANS -2862CASTELROC PHILIPPE 11944 81968091988062947921840.0613MTECHN -5852PUGET JEAN LEO 11944101971011990032022115554.8113MSANS -4369BOUCHER LUCIEN 11944 51976051991012022115555.3913MALLEM -6206VERANE COLETTE 21945 11975101987031684813422.3113MSANS -2842ROND THIERRY PIERRE 11946 11967121993013844228045.1613MANGL -8250JULIEN MARIE PAULE 21947 4199409199309 7803 7680.0013MINFOR -4160ALLUES DANNY 21947101978071993012529918968.6013MSANS -8190BUT CLAUDE 11947 71982041994011471512024.0813MANGL -9979FLORALE STEVEN 11947 21975041992101369311286.7813MANGL -5458BEYNAC PIERRE 11947111972031994011663613343.8813MESP -5735CONDE THIERRY HENRI 11947 51976041995011578112722.5213MSANS -6972BIRAC DANIELLE 21948 41973071991071578112722.1913MSANS -8328MAC LAURENT ROLAND 11948121977031993011369311287.1013MSANS -8020COMMODORE JACKY 11949 21977031993071369311287.0713MSANS -9492BOURGADE FREDERIC NICOLAS 11949 91972081986092470018540.6013MANGL -7494HAM JEAN BAPTISTE 11949111979041993081369311287.1913MSANS -2684LANTERNE JEAN PIERRE 11950121975041991071578112723.1813MSANS -8110LACOUSSIERE MONIQUE 21950 71993101992011202810240.4013MANGL -4050HERBILLON FRANCOIS 11950111971051991012470018540.6113MSANS -0115ACHILLE JACQUES 11951 41976021992091834514274.9313MSANS -6913MADAGASCAR FRANCOISE 21951 81977101993041471512024.8713MANGL -9541FARGE FRANCOIS 11952 91984031994011433211714.8813MANGL -1147VERTES GEORGES 11952111979041991011608112917.2413MANGL -3720FRESNE PASCAL 11952 91973021992082022115554.4213MALLEM -3427LYAUTEY SOPHIE 21952 91973051991011578112723.4213MALLEM -6348TOURELLE BEATRICE 21952 51972061990011621213034.1513MANGL -6291MONTMERY MICHEL 11952111978091995011578112723.5413MSANS -9048VILL YANN 11953 51981021993011369311286.6913MSANS -2556GAGNEUR MARTINE 21954 3199611199511 8359 7952.9113MTECHN -5041GALAND MICHELE 21954121981071995071433211714.0113MSANS -6421OUERRE CHARLEY 11956111982071993011249910473.1113MESP -8090BALISE JOEL 11956 61986011995011373711326.7113MSANS -6312RASPAIL CAROLINE 21956 619940619920111389 9852.5113MSANS -6598RUBENS JEAN MICHEL 11957121976121992011578112721.6513MMARKT -7944MAUBEUGE JEAN ALAIN 11957 11982031981031326611016.2913MMARKT -8793MOREAU BERNARD 11957111985051988031288210745.0413MANGL -8404CHEVERNY OLIVIER 11957 51983081995011578112722.8713MSANS -1860CHAMPIGNY JEAN HUGUES 11957121978031993051608112916.7213MSANS -9938CHARENTON PASCAL 11957 21981061993011471512025.2513MSANS -0001TASSIG ARMELLE 21957 71982031981031288210743.8113MSANS -6966GARE MARIE THERESE 21957 41979101993071471512025.8213MINFOR -5849ELOI FRANCIS 11958 21983051993011215710279.9913MALLEM -0222GERTWILLER ROLF MIC 11958 61983061995061894014661.1213MINFOR -9106MAISON JEAN CLAUDE 11958 11978021992051471512025.5613MSANS -3045BATISSE PHILIPPE 11958 51977121992012175716600.9413MVENTE -6087HUCHA ANNE NATHALIE 21959121981011988112090215981.6313MSANS -7732GENETS JEAN DENIS 11959121986061985061288210745.3913MSANS -8156BRASLES BRUNO ROGER 11959 81984041995071433211714.0613MSANS -4809GENEVOIX ALAIN 11960 219810919810111389 9851.6613MTECHN -2618BOCOUMYAJOUR PHILIPPE 11960 41980061992092090215981.1813MSANS -1786TREVARESSE FRANCIS 11960 21981091994011471512025.5013MSANS -7909CHARITE CATHERINE 21961 11985041984041527112373.8513CESP -7849BUCHES COLETTE 21961121985051984051527112373.8513MSANS -7624JOUVENES CATHERINE 21961 1199504199404 8359 7953.5113MANGL -2428DUCOS FRANCE 21961 1199309199209 8656 8146.1613.ALLEM -4640FINLAY JEAN PAUL 11961 319830419841011131 9658.3413MSANS -0498MONET ANDREE 21961111983081982081608112917.0013MSANS -3902ISTANBUL DENIS 11962 519840619830611131 9657.5313MINFOR -8720LOU ALBERT 119621119880819870810407 9271.3413MALLEM -9086CARNOT HENRI 11962101990111989111450311830.9813MSANS -4105CHAMINY YVES 11962 21982051987041608112917.1013MVENTE -7566SAINS CHRISTIAN 11962 31983091993051527112372.8113MSANS -2552FOCH FRANCK 11962121986061990111288210745.8113MSANS -5248VERONESE PATRICE 11962 219890119880210407 9271.9913MSANS -0127GRENETA BEATRICE GENEVIEVE 21962101984071983071288210743.8613MANGL -6150MAUREL DOMINIQUE 21962 11984071983111608112915.0813MVENTE -7881CHAILLEY ISABELLE 21963101985091984091288210744.4413CSANS -3227POINT COLETTE 21963 31989031988031249910471.5813CANGL -1094FERRAT ANNE LORRAINE 21963 91983061982061326611017.8313MSANS -0209MONTALEAU PASCAL JEAN 11963101983061986111326611017.3413MTECHN -6991COLOMBIER MARCEL 119631119870519880210791 9502.8913MSANS -8764PALMAS MARTINE 21963 81994051993051267210590.2913MTECHN -2275FANGADE ELISABETH 21963 51984021983021288210744.8513MTECHN -0866SECRET MIREILLE 21963 71991111990111249910472.0313MSANS -0133TORREPORTO CHRISTIANE THERESE 21963 6199302199202 7803 7680.4513.SANS -1651VALERE VINCENT 11963101987081991071288210745.9413MANGL -0332FRER CATHERINE 21964 7199407199307 7803 7681.2913MINFOR -1313ARPHY FREDERIC PASCAL 119641019870319860310791 9502.9813MSANS -7694BANNIERE GERARD 11964101987041992111288210745.9913MSANS -2808BOULIE ISABELLE 21964 41985051984051450311832.6913MSANS -9520ERMONT VERONIQUE 21964101993111992011202810241.1313MSANS -7726BUTIN JEAN YVES 11964 6198810198707 8656 8145.0313.COMPT -9487MARECHAUX ERIC JACQUES 11964 21988051987051450311830.9813CSANS -7195ARENE CHRISTINE 21964 71994101993101249910471.7613MINFOR -3536HAIE NATHALIE LUCE 21965 71985121984121249910472.4713MSANS -0845CHARLEMENTINE DOMINIQUE 21965 519940419920111389 9852.7413CTECHN -8486CANADEL SUZANNE 21965 41985121984121288210744.4113MALLEM -5385ROZOY TRISTAN 11965 31987071992031450311830.8313MANGL -7086BEAUME ALAIN 119651019860619850610791 9502.5313MSANS -2621LOTISSEMENT STANISLAW 11965 51986051990111616712995.9313MSANS -9449POSTE MARIE CLAUDE 21965111989031988031202810241.5713MSANS -1109PERRAULT CHRISTIAN 11966 81986041994041450311831.3713MSANS -4280BEGUDE MARTINE 21966 91986041985041288210744.1913MSANS -1973ESPRAT JEAN BAPTISTE 11966 919900119900510024 8997.9113MTECHN -6164UNIVERSITE VERONIQUE 21966 41985121984121288210744.1313MSANS -9407THIERRY GUENAELL 21966 91990091989091638413150.7913CALLEM -6809PERCEY PHILIPPE 11967 519930819920811389 9850.5313MTECHN -9633GILANDIERE ANDRE 11968 61993081994082256617146.7213CSANS -7128PERSPECTIVE PHILIPPE 11968101991101990101467711987.3613MSANS -0709AMYOT ISABELLE 2196810199603199503 7803 7680.2113MSANS -9931CIVADE PIERRE 11969 51991111990111467711986.6213MSANS -1496FERME STEPHANE 11969 519890919880910407 9271.7913CTECHN -4802JAURES MARIE CLAUDE 21969 21994011992011202810240.8213MALLEM -5721VIEUX ERIC 11969 41989061991021249910473.5413MSANS -4763PINTA ALAIN GEORGES 11969 919921019930210407 9270.6513MSANS -9618PASTOUR CHRISTINE 21969 11994081993081206910240.4613CSANS -3207PAQUERETTES MARIE CHRISTINE 21969 619940619930410668 9426.0813CSANS -0667FOURCHES SYLVIE 21969 719920719930411389 9850.6213MSANS -8437ORANGERI DANIEL 11969 31989041992121249910473.1513CSANS -4233LEBLANC CHRISTIAN 11970 419910119900110024 8999.3113MANGL -2043RAVEL FRANCOISE 2197010199301199201 9597 8728.8913MSANS -4748REDONDO CHRISTINE 21970111994081993081206910241.3013CINFOR -6379ROUGE CATHERINE 21970 11994011992011202810241.7213MALLEM -4507ALBAN CATHERINE 21970 91993011991011202810240.9813MSANS -8424FRANCE JEAN PIERRE 11970111992081991081202810240.9913CANGL -3409FLEURUS BRIGITTE 21970 9199009198909 8656 8146.6813.ALLEM -8040ROY PATRICK 11970 41991111990111839014313.7013MSANS -4985CUTTE MICHELE 21970 419940519920111389 9852.6013CANGL -0589MARTIN FABRICE 11971 11990091992021202810241.9013CANGL -2531ROI MICHEL 11971 41994011992011202810240.4413LSANS -0686RENAUDIN JEAN FRANCOIS 11971 51990091993121202810241.1213CSANS -1223ROUDIL CECILE MARIE 219711019921019911011389 9852.5913MVENTE -0603THORETON GUY 11971 7199605199505 7803 7681.0813MSANS -4480WAGNER YVES 11972 31991091994011249910473.6313CSANS -7873VALERY NORBERT 11972 319921019911011389 9852.0613MSANS -0068LAC CATHERINE 21972 419940519920111389 9852.2713MSANS -6496BEL CATHERINE EMILIENNE 219721119920219910211389 9851.3413MESP -4096XAVIER THIERRY 11973 31995121995101288210745.8513CSANS -0302FRANCH WILLIAM 11973 8199502199402 9894 8922.8613CSANS -1195GUILBERT ELISABETH 21973 819930319920311389 9851.4113CSANS -8888LEGER BERNADETTE 21973 7199409199309 9126 8455.9813CSANS -9415FONTANEY MARIE PAULE 21973 4199404199304 9894 8922.4113MSANS -8921ROSA SUZANNE 219741019940819930810668 9426.3413CVENTE -1867BASSE JOCELYNE 21974 6199404199304 9894 8923.1713MSANS -1798RUSSE THIERRY 11974 4199401199301 9894 8923.3113CANGL -8684CHEM BERTRAND 11975 6199407199307 7803 7680.3913CSANS -3841UTRILLO JACQUES 1197611199506199406 7803 7681.1613CSANS -6399ABEILLES RENE 11934 7199207199107 9511 8687.5114MSANS -1983PETUNIAS MICHELLE 21935 1199208199501 7803 7680.2614.SANS -0006DOMONT YVES 1193511198810198509 8656 8145.3914.ALLEM -6326JATELIER CHRISTIAN 1193511199107198509 8656 8146.0914.ANGL -5224MAGNOLIAS MICHELE 21936 31962111991072273717260.2614MSANS -1839ANSELME REMY 11937 21963121994011557012567.7714MSANS -6250ASPREMONT JEAN LUC 11937 91968081990071433211715.6514MALLEM -2328AGE MARIE HELENE 21937 81966071995102017815518.0914MSANS -1178NAPOLEON HELENE 21938 61967071990071578112723.2714CANGL -9417SOUTRANO MICHELE 21938 11963021963051288210744.3714MVENTE -9022GATINES CHRISTIAN 11938 11973071992011403411520.0814MINFOR -6359LANCHY SOPHIE 21938 8198811198511 8656 8146.3414.ALLEM -4141JASMINS PIERRE 11938 81976071992041403411521.0714MANGL -7981NOUVELLES PHILIPPE 11939111968011993011557012566.8214MTECHN -1626VEUR LOIC 11939 11982011993011215710279.2314MANGL -4677ORMEAUX CHRISTIAN 11939 91963121994011557012567.6614MSANS -0263ASPHODELE STEPHANIE 2194010198807198707 8656 8146.5514.ANGL -8254CONNETABLE JOELLE 21940 8199509199409 8656 8147.1714MINFOR -9870RESISTANCE PHILIPPE 11940 61967071993061834514274.5714MSANS -4388ORBAY PATRICK 11941 41965051994011557012568.1314MINFOR -0023ROUVIGNARGUES CATHERINE 21941101963011994042666519900.9114MMARKT -9628BROOKE ROGER 11942 11962021991072273717261.4714MMARKT -4240NUMANCE ANNIE 21942 71963031992012273717261.0014MANGL -3342ROMPU FRANCIS 11942 61962031994113200223583.9014MSANS -4773HA DIDIER 11942101961091994033200223583.1214MANGL -2795ECHO BRIGITTE 21944 419941019930411389 9852.4114MSANS -4188VISONNIERE MARIE CHANTAL 21945121972101971101249910473.7414MINFOR -0739VALLES JEAN FRANCOIS 11945 71966081995042666519900.3614MSANS -4899COURBANIERE DIDIER PIERRE 11945 31972061991011663613343.1614MESP -7972FORET MARC 11947 41971071991011433211714.9114MESP -1272CIGALES JEAN DOMINIQUE 11947101976101991011369311286.2114MTECHN -6191HUGO MARLENE 21948 91973101991071578112722.6114MSANS -1802CAVALIER PHILIPPE 11949111972021992092256617145.2914MALLEM -3695JEANNE CHRISTOPHE 11949121977081992101471512024.1514MESP -9900ANTOUNE FRANCE DOMINIQUE 21949 31972121992012017815516.8314MSANS -0012MAUREILLAS RAPHAELE 21951 51971071988052334017609.1514DSANS -9378VERDIERS CLAUDE 11951 41980031992061369311287.0114MSANS -8265POUSSIEU DOMINIQUE 21951 81980061988052090215979.7614CSANS -3423MORIGNY LUC 11952111979061992011608112916.7214MSANS -7925FOURNIER JEAN PIERRE 11952 21976021995061608112916.2814MSANS -2966ANTIBES JOEL 11952 41975101994041894014661.7814MANGL -7905BOISSONADE FRANCOIS 11952 51990031989031288210744.1914MINFOR -2700LERINS MURIEL 21953 91974011973011288210745.5214MTECHN -6213TOISON JACQUELINE 21954 21974081982041527112373.3514MSANS -1204TRIANON ANNICK 21954 3198801198511 8656 8146.6514.SANS -7183CABRIER MARIE FRANCE 21954111974071979112470018541.1114MSANS -0005BOILEAU FRANCOIS 11954 61974051990052175716601.9514MSANS -7845LARGADES NOELLE FRANCOISE 21955101977021992011471512024.8714MSANS -3059BLEUETS MAURICE 11956 81980071995011471512025.7014MSANS -3868IORANA PATRICIA 21957 2199201199101 7803 7680.0314.SANS -4327MARTILLE CATHERINE 21957101984091983091288210744.6414CSANS -3448FAREL MICHELINE 2195712198805198603 8656 8145.9314.SANS -6045AIGUELONGUE MICHEL 11958 71983081992061527112374.8114MANGL -3104GAIRAUT JACQUES 11959121987021989051288210743.9914MSANS -6864SCHMITT DENISE 21959 3199201199101 7803 7680.3414.ALLEM -3805OUEN GERARD 11959 91980061994011471512024.5714MANGL -7188SOL FRANCOIS 11960101981051991011868714507.4514MTECHN -7952CABRO MARIE CLAUDE 21960 4199504199304 9126 8456.3314MTECHN -3834JEANPIERRE FRANCK 11960 21981091987011684813421.4614MSANS -2909BLERE PHILIPPE 11960 31983041993121326611017.6114MSANS -8259VALOIS NATHALIE THERESE 21961 2198810198603 8656 8147.0114.SANS -9506FORESTIERE ANTOINE REMI 11961 719821119811111131 9658.0714MSANS -5269BIZET JEROME 11961111985041993021433211714.1514MESP -5031CORBIERES PASCAL 11961 21982121993041326611016.6214MSANS -0735MONTAIGUET ANNE MARIE 21962 819960619940111389 9850.5614MANGL -0633BULLY LOUISE 21962 91991121994061202810241.5214MANGL -7250SERMET XAVIER 11962 41985061986011527112373.0414MANGL -9656SARRAMEA ANDRE 11962101983081994091868714507.1614MALLEM -8263MAISONNEUVE MURIEL SOPHIE 2196212199404199301 9597 8727.8714MSANS -8851BERGES MARTINE 21964 2199406199306 8359 7952.5514MSANS -7351NUNGESSER PHILIPPE 11964 71988111987112188616680.9314MSANS -3681LOOZE BRITTA 21964 21993121992011202810240.9114MESP -1581VALLAGON MURIEL 21964 31986041987091527112374.1214MANGL -0821BRANLY YVES MARIE 11965 51986011993041288210743.8714CVENTE -3591MANNA CATHERINE MARGUERITE21965 7199407199307 8359 7952.4314MSANS -7792INSTIT PHILIPPE 11965 619870719870410407 9271.4114MSANS -5791RADEGONDE MARIE LOUISE 21966101986041985041168610048.4714MSANS -0301ESTERELLA ANTOINE PAUL 11967121989021988021450311832.0014CSANS -1872TOUL FRANCIS 11967 919900419900910407 9271.3814MTECHN -5651MURIERS CHRISTOPHE 11967 31989101995071249910472.7414CANGL -0527REMPART DENIS 11967111992071991071330611016.9614MALLEM -8590TOURNEFORT CHRISTIAN 11968 6199410199508 9126 8456.6614MANGL -5968PRESBYTERE DOMINIQUE 21968 21992011991011202810241.8414MSANS -8374AUMALE JACQUES 11968 819890419880410407 9270.6614MSANS -7416BREGUET DANIEL 11968 21987061993051381911365.2614MSANS -0198MARINES MARTINE 219691119920419910411389 9852.0214MANGL -8772GORGE MARC VITTORIO 11969121989091994011249910472.7814MSANS -9157LEON JEAN CLAUDE 11969 81989061995101249910472.6114MSANS -3588LUCIEN DANIEL 1196912199403199303 9597 8727.9914MSANS -5266COUTANT DOMINIQUE 21969 2199502199402 7803 7680.0914MINFOR -6967CONTI GILLES 11969 9199612199512 7803 7680.6614CSANS -4277COLLONGES MARTINE 21969 2199112199012 8656 8146.3814.ALLEM -6780ERIK SABINE 21970 819910619910411389 9850.6214MSANS -9400LONGCHAMPS MARIE CLAUDE 21970 71990041989041202810241.6714MSANS -0861ROUMEGONS GERARD 11973 81996101995101288210744.8514CANGL -1149MOULIN MYRIAM ELISABETH 21974 9199501199401 7803 7681.2514CINFOR -8134AJOUPA PHILIPPE 11974 3199508199408 7803 7680.5314CANGL -5009LEVIS FRANCOISE 21974 6199506199406 7803 7679.6914CCOMPT -5993FROBERT ARN 11975 7199503199403 8359 7951.9414CANGL -7536ORNE BEATRICE 21976 3199602199511 7803 7680.3214CSANS -0584LISON PATRICK 1197611199610199510 7803 7679.2814CSANS -9645TESTE ALAIN YVES 11935 31964091994011557012567.6215MANGL -4415CROIX GUY 11936 61966081981072022115555.5015MANGL -2212BAC JEAN PHILIPPE ANDRE 11937 41972051992011433211715.3215MSANS -9432ULYSSE JEAN MARC 11938 91960121988062947921840.2015MINFOR -8124CHAMIGNY STEPHANE 11938 2199001198604 8656 8145.1215.SANS -7324MOLITOR ROMAIN 11938 41962111992032572519240.6415MTECHN -8862CONDAMINES NICOLE 21938 41960111976012470018540.4715MSANS -2089ALLEN DIDIER 11939 81972041990011403411520.5715MSANS -3194COUTURIER DENIS 11939 11963101994011557012568.2615MVENTE -0835VALMANTE DENIS 11939 21959051991113327724475.7015MINFOR -8646MESNAY ANNE GENEVIEVE 21939 51967011994091834514275.5215MANGL -3426GAMBETTA ISABELLE CECILE 21940 7198912198603 8656 8146.0515.COMPT -0422VAUGAILLERES CHRISTIAN 11940101963111988011663613343.0315MSANS -0838ORVANNE PATRICK 11940 31962061993082922321683.8515MSANS -4067OUTREMONT PATRICK 11940 31962031987012022115555.6215MSANS -0744GRANAGHIU DIDIER 11940 81972021995041834514276.1015MVENTE -9034TREILLE MARIE JOSE 21940 11962051984062470018540.8215CSANS -5214BART MICHEL 11940 21964071991072273717261.7615MALLEM -3460SERENA MARTINE 2194011198810198604 8656 8146.0515.ANGL -3601MONTJEAN DOMINIQUE 21941 6198805198610 8656 8146.2015.SANS -9277ELNE LAURENCE COLETTE 21941 31968071990011621213033.3215MSANS -0325PLATANES CHRISTINE 21942121966081995091834514275.8315DSANS -9878GAUTIER MARYVONNE 21942121972101989011621213033.2915VCOMPT -9699GERVAIS JACQUES 11942 11966101992011663613343.4715CSANS -6148GATINAIS FRANCIS 11943101969101992082470018541.2815MSANS -4347MONTFRAY CLAUDE 21943 71962121991072273717260.0115MANGL -4710VIRY GUY 11943 51970051991011433211714.3715MALLEM -0354BENIGUET MARIE PASCALE 21944 41965021993111471512024.3315MINFOR -6561LEBAS HELENE 21944 21964071994011932314934.2715SSANS -1882BARBES JEAN MARC 11945 9199309199209 8656 8145.8915.SANS -0226FERRIE CLAIRE 21945 4199207199107 8656 8146.7315.SANS -6166BARGUE FRANCOIS 11946 61972071991101433211715.4515MESP -9007CLAYE PHILIPPE GERARD 11946 21970041991011433211715.0915MALLEM -9314GRILLONS MARTINE MONIQUE 21947121969031981122470018542.1015MSANS -2474RODIN ERIC JACQUES 11947121972121991071621213034.1315MSANS -0379ARGENSON BERNARD 11947 61971121991082470018541.2915MSANS -1358SEILLE JEAN PAUL 11947 31971021993061834514274.8915MTECHN -0628GOURGAUD PHILIPPE 11948 11969051993082666519901.0015MTECHN -1939DISQUE ERIC 11948 41977031991011578112723.4215CTECHN -1605FRESNES ALAIN 11948 51975061991011684813422.8115MSANS -9214CHAMPS BRUNO 11948111973081991013417325098.6515MSANS -5666NOVEMBRE JEAN PHILIPPE 11949 41971101994013417325097.9315MSANS -0720MOINES GUY 11950121978011994031471512025.3415MSANS -8674IMPERIAL JEAN CHRISTIAS 11950 21970041989111932314935.4315MINFOR -8739HUGO MICHEL 11950 21974041992011578112721.8015MSANS -9090CYR CATHERINE 21950 7198908198808 8656 8145.3915.SANS -8528EMERAUDES BERTRAND 11951 61979061992011249910472.0615MSANS -0912ALBERES MARTHE 21951 41974051991072137316331.3315MTECHN -1664BENASY DOMINIQUE 2195210197206197106 7252 7486.2815MSANS -5853ROI CHANTAL 2195210199112199012 8656 8147.0615.SANS -6634DUMAS BRIGITTE 2195210199509199409 7590 7562.6315MESP -9376LOUVRE SABINE MARIE 21952 51975051995021433211713.5315MSANS -8735BYRON MARTINE 21952 51973071991071578112722.0715MALLEM -1663PLANESTEL CATHERINE 21953 11974101993042017815517.2015CANGL -5646ALEXANDRE MARIE CLAUDE 21953 11975071991091578112723.4215VSANS -6614GLYCINES PIERRE 11953 71978101994031471512025.7215MSANS -8773CLEMENCEAU ROLAND 11953 81974031991012334017609.3715CTECHN -2191HEBERT PIERRE 11953 21972081992072043315669.2915MSANS -7378THOMAS PATRICK 11954111982051994011433211715.6315MSANS -6161HASTIGNAN ANNICK 21954 31980071994041471512025.0115VVENTE -6895VALETTES ANORE 11955 31979061993121369311288.2415MALLEM -8499ATHIS JEAN PAUL 11955 11977081976081834514274.8015MSANS -8271SPORTS PAQUITA 2195612199112199012 8656 8147.0115.ANGL -3980RAPHAEL MARLENE 21957 61980041979041684813421.6715MINFOR -9964MUGEL PATRICK 119571119821219820311131 9658.4715MSANS -0593GRACE JEAN MARC 11957 41977121992021471512024.5615CSANS -2905EXEMPT PATRICIA 21957 3199201199101 7803 7680.5915.ANGL -5492PERRIERE PASCAL LUC 11957 11983121994041894014662.7215MSANS -7685SURMELIN JACQUES 11957 5198109198812 4864 2.1915MSANS -3608ROOSEVELT FLORENCE 21957121980111994071471512024.5315MTECHN -5451TULEU JEAN LOUIS 11957111977121994011621213033.1015CSANS -4681VERIGNON JACQUES 11957 51984051995071433211714.1615CSANS -1478RESIDENCE CLAUDE GUSTAVE 11958101982091995011433211715.7415MSANS -0355ROSAIS MICHELINE 21958 81978061992051471512024.1515MANGL -4981CHRISTOL BRUNO 11958 11978061995041249910473.5415MSANS -6921MATRA FERNAND 11958 11978051993011471512024.4215MESP -2956LAPEYRERE PHILIPPE 11958 11977071985102397418037.4715MANGL -8126CYPRES JACQUES 11958 41983081982081608112917.1515CALLEM -5587BERENGUIER JEAN PASCAL ROGER 11959 81981061993031894014662.0615MSANS -2962CAYES CAROLINE 21959 61981051995041433211713.9215MESP -5994GRASSE PHILIPPE 11959 819820419811211389 9851.6915MALLEM -0767SOUCHET MARTINE 21959 91983011982011249910471.9215MTECHN -1353AGEN JEAN MARC 11960 319810319800311131 9657.6515MANGL -9232GROULLES ANTOINE JEAN 11961 31993101992011249910472.5715MALLEM -3855BAUMES JEAN LUC 11961 41982111994031527112373.1015MANGL -9369HELBRONNER VERONIQUE 21961111994031993031202810241.5715MINFOR -4341OLIVIER CHANTAL 21961 31981101980101684813422.3515MSANS -5305DAME ANNIE 21961 51981071995071433211715.5915MSANS -6569GAULLE JEAN CLAUDE 11962 91989041992121249910472.3015MSANS -6715SEINE KARL 11962 719840219830211131 9657.1215MSANS -3136GOBELINS JEAN PIERRE 11962 21993091992011249910472.3015MSANS -5291LAMBERTIANAS MARIE CLAUDE 21962 7199506199406 9126 8457.5615DSANS -6342MISSECLE DIDIER 11963 41989111988111539912453.6015MSANS -3447VIAL GEORGES 11963 51985041984111527112374.3415MALLEM -5045GRAZAILLES LAURE 21963 8199108199008 8656 8146.9715.INFOR -7974CHAUSSEE PAUL 11963 61985071991121288210743.9215MSANS -2189PEYBERT DIDIER 11963 81983081988112090215980.4615MSANS -7262JOZE PATRICK JEAN 11963 91983111982111326611017.4115MSANS -8222ETANG LIONEL 11963 71985011993031693613497.9015MSANS -6881OUEST OLIVIER 119631219840419840210791 9502.0815MSANS -8121MADELEINE JEAN 11964101984071983121288210745.1815CESP -6828CONCY JEAN MICHEL 11964 91988041994091693613499.2215MALLEM -3939CHURCHILL BRIGITTE 21964101992021991021330611016.6015MSANS -5116PEREIRE DIDIER PAUL 11964 21986071992121288210745.9915MSANS -2174TEISSEIRE ELFRIEDE 21964 4199212199112 8656 8145.5615.ANGL -0585CRETS LAURENCE 21965 3199306199209 9597 8728.8415MSANS -7988DOMAINE PASCAL 11965 61984051993071527112372.8715MSANS -1646PERDRIX MARCELINE 21965 51985101984101288210745.7015MSANS -7090KERAVEL GILBERT 11965 11988041994091693613498.2215MSANS -3100BARILLERIE BRUNO 11965121988111987112188616679.7215MALLEM -8075ESCALE YOKO 21965 61991061990061381911365.3215MSANS -1009CHARRIERE SYLVAIN 11965101993021993121249910473.1115MSANS -8542MOLIERE PIERRE 11965 51987111995021450311830.6215MSANS -8729ROSTAND PIERRE 119661219860419850410791 9503.7015MANGL -8802DOUMER JEAN LOUIS 11966 619860319930110791 9502.8415MINFOR -8596ABEBERRY PATRICK 11966 619891119910910407 9270.2415MALLEM -6485CHALEUTRE GILBERT 119661219870719860710407 9271.9715MTECHN -9054FAURE FRANCIS 11966 519860719890710791 9503.7915MALLEM -6168CHENEAUX COLETTE 21966 61994021992011202810240.1915MSANS -9809PESSOT JEAN JACQUES 11966 11992011991011202810241.3015CALLEM -8041BIGUE THIERRY ALAIN 11966 619860419850410791 9503.8515CCOMPT -7730CALIANES STEPHANE JEAN 11967 3199404199304 9894 8921.6315CSANS -2161TOUCH MICHELE 21967 11989111988111949415052.4015MSANS -1999LISLE GILLES 11967111990021989021539912451.6115MMICRO -2038GRANDES ROGER 11968 2199312199212 9597 8728.0115CSANS -4888BELMONTET ANN 21968 619960419950410668 9426.5315MSANS -5809ROUSSIER DENIS 11968111990011989011467711987.1615CSANS -0146ROSESCERNY MIREILLE 21968 5199602199502 8656 8145.5715MANGL -3432GARCIA PHILIPPE 11968 51990121992041249910471.8915CSANS -3058SANGRIA CAROLINE 219691119910519900510024 8998.6815MANGL -7679BLEU CHRISTIANE 2196911199207199107 8656 8146.3815.SANS -0602VAUGINES GILBERT CHRISTIAN 11969 91991061994011249910471.7615CCOMPT -5226BOULEE PHILIPPE 11969 819900419890410407 9271.7215CSANS -5904ORANGERIE MARIE CHRISTINE 21969 1199001198712 8656 8146.0115.ALLEM -8131NICE CHANTAL 21969 41989031990011450311831.6615CTECHN -8570SOULAGE MICHEL 11969 41989091994031330611016.4415MVENTE -5857ALLEE JACQUES 11969 7199304199206 9597 8728.9515MANGL -6920LOTI YVES 11969 919911219901210024 8999.3115CVENTE -3599PLANA JEAN PIERRE 11970 61991051990051467711987.6115MALLEM -7579BERGUEROLLES MARIE CLAIRE 219701219910919900911389 9852.4115MSANS -0494DESBORDES BERNARD 1197012199101199001 8656 8145.1215.SANS -9496MONTBAURON ERIC 11970 61991051990051467711986.2215MSANS -8603DESCENTE FRANCOISE 21971 5199607199507 7803 7680.9915MSANS -2449TAHITIAA MIE 21971 619940919930810668 9425.5515MSANS -7786LOUP ISABELLE 21971 61991121993041202810240.8915MANGL -6100MARNE JOEL 119711219940719940111389 9851.4615MSANS -8569ASPIRAN ANDRE 11971 61991121994011249910472.8415MSANS -0626ODET PAULE 21971 2199611199511 7803 7681.0415MSANS -7006ARGENCE PHILIPPE 1197212199308199208 9597 8728.2215CANGL -2516MAILHEAUX LAURENT 11972 41991121991061202810241.5215CSANS -4928COLLEDEBOEUF ANNE MARIE THERESE 21973 51994071993071206910240.6415MANGL -1718HACHETTE ERIC 11974 7199606199506 7803 7679.4615CALLEM -5240MUSES JEAN BERNARD 11974 9199507199407 9894 8922.4415CANGL -3654MAIRIE MARIE 2197412199507199407 7803 7680.6315CSANS -3017BAUCHAT MICHELE 21975 8199505199405 8359 7952.4615MSANS -1395BROSSOLETTE MARIANNE 21975 4199609199509 7803 7679.7615CESP -9154REYNARDE FREDERIC JEAN 11975 8199406199306 7803 7680.3415CANGL -3041BOYER ERIC 11975 3199406199306 7803 7679.3315CSANS -8817FILOURIE FRANCOISE RENEE 21976 8199506199406 7803 7679.3615CANGL -3408BRIE BRUNO 1197611199508199408 7803 7679.4515CSANS -6446WYLLIE PATRICK 11976 1199507199407 7803 7679.4915CSANS -7476SOMME BEATRICE 21976 4199606199506 7803 7680.8615CSANS -8951BARNIER MARTINE 2197612199506199406 7803 7679.4915CTECHN -5707FOCH DENIS 11977 7199607199507 7803 7679.3615CCOMPT -9331PEYPIN MICHEL 11977 3199506199406 7803 7681.2015CALLEM -2044RENAN BERNARD 11977 7199607199507 7803 7679.9915CSANS -0991GUTENBERG BERNADETTE MARCELLE 21930 6199207199107 9894 8922.1616MANGL -4650NORD PASCALE 21930 6199001199506 8827 8262.8016.SANS -7670BOURG ERIC 11935 11967071994011433211713.8816MCOMPT -1067ITALIE SVETLANA 11935 81973071991011433211713.6116MSANS -7446BELMONT MARIE JEANNE 21936 4199010198910 8656 8145.0316.ANGL -4567VICTORET DOMINIQUE 11936 2198812198511 8656 8146.6116.ALLEM -1382ARIES DOMINIQUE 11936 11970081991041433211713.8816MANGL -7727TERRASSES BERNARD JACQUES 11936 91957051994123417325096.9816MALLEM -2304MERCUES JACQUES ANDRE 11936101955061992113327724476.7316MSANS -1717FEUILLETS EDITH 21936 51971091992021932314935.3116MSANS -5274VALLEES PASCALE 21937 8198901198511 8656 8145.6216.INFOR -1751BESSE WILLIAM 11937101959021994065760041273.7516MSANS -7544TRAIL PATRICK 11938 41971081991101433211714.7916MINFOR -0247VIARD CHRISTIAN 11938 11962121984073200223583.9016MTECHN -9383CHALONNIERE MARIA 21938 4199009198909 8656 8147.1916.SANS -1762EMERAUDE BRIGITTE 21938 11975051995011369311288.0616VESP -8379MAGNIOUX NADINE CHRISTINE 21938 81966071990071578112723.4716CTECHN -4635CYTHERE CORINNE CHARLINE 21939 4199201199101 9085 8418.3916MANGL -2414PILATTE MARIE JEANNE 21939 11962051983032470018540.4716CSANS -9003MOULIN DIDIER PAUL 11939 51980021995121471512025.3716MINFOR -6102MARINVILLE ERIC ANDRE 11939 21971031991101433211714.6416VANGL -9945ELANCOURT AGNES 219401119841019810111131 9658.0916CVENTE -5615THORELLE FRANCOIS BERNARD 11940 219840119840311131 9658.6416MALLEM -9231HERBILLON MADELEINE 21941 11968071990071578112722.1216MSANS -9547REMY CATHERINE 21941 31965121990012273717261.0916MTECHN -8538DAMPMART THIERRY 11941 41964071994013200223582.7616MSANS -4432ECOLE CLAUDE 11941121966071995041557012566.5416MALLEM -7122SORRIERES JACKY 11941111975031992011403411520.6216MSANS -5855CESARI PHILIPPE 11941 41972081992011433211715.6916MSANS -4569BELTCAGUY JEAN PIERRE 11941 31974041991011369311288.0016MSANS -0119BAUMETTES VONICK 21942 7199309199209 8656 8146.7316.SANS -5799ICARD JACQUELINE 21942 31968071994031834514275.4316VTECHN -3230NIBELLE PHILIPPE 11942101963011990042273717261.8816MTECHN -1160PLAY JEAN DANIEL 11942 81975091993041369311287.9716MSANS -8701ORRIANES DIDIER 11942 81964101989122470018540.0616MTECHN -9211ANJOU JEAN CLAUDE 11943 81969101991011433211715.4716MSANS -2069CHURCHILL ANDREA 11943 61970061995042201216756.8916MINFOR -4457ARBAUD JEAN CLAUDE 11944 61971011992102137316332.3116MSANS -9480SABLONNIERES CAROLINE 21944 11962121991072273717261.7616MALLEM -1573HOCHET HELENE 2194410199208199108 8656 8145.3416.ESP -8504ANDRE FRANCOISE 2194510199301199201 8656 8145.4216.SANS -2608THIRD ALFRED 11945 91971041990012137316331.6616CSANS -0698CEDRES BRUNEL 11945 91968061990071433211714.3916MSANS -8224CLOSERIE MARTINE 21945 61971061991101932314935.2616VTECHN -6798MONTESPAN JEAN NOEL 11946 21983121993011215710278.5716MTECHN -4449TRAW ALAIN 11946 21976091993041369311287.8216MSANS -1458BOIZEAU PHILIPPE 11947 11973071993041518612334.9216MANGL -8853OUF HENRIETTE 21948 91970011994062201216756.8016MALLEM -0743GEORGE BERNARD ALAIN 11948111973021991011433211714.9316DALLEM -2218GEMEAUX GUILLAUME 11949 51970101992072739020404.5916MSANS -3154MONTAGNE SERGE 11949 31973061992011403411522.1316MSANS -2871VILLERMONT EVELYNE 21949111970061993102175716601.0116MINFOR -8174SARDAN PATRICK 11950 61978051990091966515206.0716MANGL -5180LONE ALAIN 11950 31978021994011369311287.4616MANGL -7155COSSON DOMINIQUE 11950 41970101991012990722150.5216MANGL -7616QUAI FRANCOISE 21951 51973101991071578112723.5116MSANS -1943VAUGIRARD DANIELLE 21951 7198810198709 8656 8145.3916.SANS -8270LOUPS CHRISTIAN 11951111979031993011471512024.3816MALLEM -2654PRESSENS ANNE MARIE 21951 31973011976011288210745.5416MINFOR -8175COUDOURON LUC 11952 21978061995011249910472.6616MSANS -9368DOLMENS CLAUDE 11953 81977081991071578112723.3816MSANS -3828ESTIENNE PATRICK XUAN VINH 11953 71984071992041326611016.1116MINFOR -8961APPART JEAN LUC 11953101973021992102017815516.1216MSANS -9113PERIGUEUX JOELLE 21953 21973101991071578112723.0616MINFOR -7735FLEZ PIERRE 11953 11978071994011403411521.0216MINFOR -4018FONTMERLE MICHELINE 21953 8199311199211 8656 8146.9516.SANS -5157GREZ FRANCIS 11953111974051992082350617725.9216MTECHN -5311SUFFREN MARIA 21953 41973021990101578112722.9116MANGL -7764BRON CLAUDE 11953 91979081994011249910472.9216MINFOR -0120POSTAL CHRISTIAN 11954 31976071994011369311288.1516MSANS -5265HUGO JEAN 11954 51975021993092256617146.9116MSANS -5590SOPHIE SUZEL 219541119960119940110668 9425.3116VSANS -5401LARREY MONIQUE 21954 31975041995101881314585.7316MSANS -6562LANTERNE CLAUDE 11955121980061995041471512024.3516MANGL -1519GOURDON SYLVAIN 11955 51980051995011249910472.9716MVENTE -3963RUISSATEL MICHEL 11955 51979051994011249910473.2216MSANS -3870COMMANDERIE BERNARD 119561219850419870910791 9503.3616MANGL -6506SUPERIEUR JEAN CLAUDE 11956 31979011994011249910472.3016MINFOR -0863FIGUIERES JEAN PIERRE 119561219890919881210407 9270.6216MSANS -1566GROS ANDRE 11956 419950119950110363 9232.9816MSANS -2124CHASSEURS AUDE 21957 219920619930110024 8997.9516MINFOR -5594VAAGGASSE CLAUDE 11958 71978051992011471512024.3916MALLEM -7033TITAN ERIC 11958 41978011992021471512025.2516MSANS -5186CEYRESTE JEAN 11958 91980091993041471512024.7116MSANS -7174SEPTEMBRE PIERRE 11958121978081995071369311286.1516MSANS -4207REGARD GINA 21958 1199107199007 8656 8146.5216.SANS -0723GARDONNE SIMONE 21958 21989081991101249910473.2416MALLEM -3190MONTAUROUX FRANCINE 21959 61989011991071249910473.4116MINFOR -7379SUD PHILIPPE 11959 81982051992011527112374.2216MALLEM -0598FERBER GUILLAUME 11959101981051995082256617146.9116MINFOR -6321CEZANNE ALAIN 11960 41984041993041326611016.0616MSANS -6273FONVERT MARC 11961 619901019891010407 9271.5916MSANS -6867GENEVE ANNE MARIE 21961 31983011982011608112916.2516MSANS -7828PUISEAUX BERNARD 11961 5199403199303 9597 8728.1416MSANS -7252CHEM MARC 11962 41986091992041949415052.0616MSANS -0052TEMPLIERS CATHERINE 21962 61982021989041608112916.9716MSANS -4660HAROUSTA PHILIPPE 119621119900119890110024 8998.9516MVENTE -3619MURAT PIERRE 1196212199406199306 9126 8455.9716MINFOR -1366REINE GEORGES 11962 5199606199506 9126 8456.6416LSANS -6020YVART ELISABETH 21962121994051992011202810241.1616MANGL -9740SEJOUR DANIEL 11962 81982121992041326611017.0516MSANS -3790BEAURONNE PAUL 11963 419840619830610791 9502.6816DSANS -0831VICTOR MICHELE 21963 11985121984121288210744.4116MSANS -5171NEIGE DANY 21963 21985051984051527112372.9916CSANS -4834CROIX CLAUDINE 2196310199101198807 8656 8145.0616.SANS -9575HILL DOMINIQUE 21963 319951219941211389 9852.5416MSANS -1494FECAMP DANIEL 11963 31991041990041381911366.6116MSANS -2944MONCET THIERRY 11963 91991081992051249910471.9416MCOMPT -8018DRAGON XAVIER 119631019830519820510791 9503.5216CCOMPT -7258CASTELLAS LAURENT MARC 11964 31984091992121288210745.9316MSANS -3956CORDIERS PHILIP 11964 219861019851010791 9503.0416MSANS -1434TRESPOEY HENRI NICOLA 11964101987041991091450311831.5216MTECHN -7725MASSANE LAURENT ALEXANDRE 11964 819850919840910791 9503.9916MALLEM -5509FLAMANTS OLIVIER 11964 219890519880510407 9271.8216CSANS -9732VENT THIERRY 11964 91987071988121288210744.9116MALLEM -8053CAUSSINIERO ANNY 21965 8199610199510 7803 7680.3216MANGL -8933CHOPIN VERONIQUE 21965101986061994091288210744.0816MANGL -4294GRAVIER PHILIPPE ARTHUR 11965 61994041992011202810240.0416MTECHN -7996LOUPIATS CATHERINE 21965 3199312199212 9597 8728.5816CSANS -5751DIMANCHES JEAN FRANCOIS ROLAND1196511199404199201 9597 8727.9916CSANS -3314COPERNIC NATHALIE 11965 91993111992011202810239.8316MALLEM -8095MALIKA ESMERALDA 21966111994051992011202810241.6116MINFOR -2514CANGINA MARIE CLAUDE 21966 519951219941210668 9426.3416MANGL -8137BARBE SOPHIE 21966 61985061984061202810241.6116MSANS -2086FELIBIEN GILBERT PIERRE 11966 619860919850910407 9270.8916MINFOR -5743FOUESNAN PHILIPPE 11966101987021991071288210745.4316MANGL -7755ALGLAIS BERNARD 11966 81989031988031249910473.3616MVENTE -4183NEUVICQ MARIE CLAUDE 219661119950119930411389 9851.0116MSANS -5854BINEAU BRUNO DANIEL 11967 51991081990082107316097.0316MSANS -1015HUSSON MICHEL 11967 31990041989041467711985.8116MINFOR -8894VEGA YANNICK 11967 1199311199211 9597 8729.4016CSANS -2165POMONE EVELYNE 21967111989031993071381911366.4716CSANS -3736LYS DIDIER 11968 919950119950110363 9232.6616CSANS -9047PUITS VINCENT 11968 21990081989081539912453.7216CSANS -6745COMMANDANT DOMINIQUE 21968 6199403199303 8656 8146.3216MANGL -2664JAMES CHANTAL 21968 719940419920111389 9851.5216CSANS -2387LECLERC BERNARD 11968 819950119950110363 9233.9016MSANS -8096PAROISSE DOMINIQUE 21969 61991091991021330611016.5116MTECHN -8708BOISSY BERNADETTE 21969 7199006198708 8656 8145.2116.SANS -7358CUQUERON MARTINE 21969121994031992011202810240.4616CSANS -5192BESSOU ROSINE 21969101991111990111839014314.0816MSANS -1422LAVAUX DOMINIQUE 21969 11992061991061202810240.9816CSANS -4798IDOLE MARIE CHRISTINE 21969 219930419920411389 9852.1516MSANS -7101NOGENTAIS CHRISTINE 21969 91989111988111202810240.5916MSANS -3573MIRBEL ANTONIO 119691019900519890510024 8999.4916CSANS -8187NORD ROBERT 11969101991101990101467711987.9716MVENTE -2888CASTELS YVONNE 21970 419960619940110668 9426.8916MSANS -5902GARRIGUE MICHELE 21970 21994021992011202810241.7616MSANS -7139BRUANT ISABELLE 21970 919940619920111389 9852.0916MSANS -8561FREGATE DOMINIQUE 11970 81993041995091267210590.1516LSANS -8391ESCOURADIERES CHRISTOPHE 11970111991111990111467711986.0816CSANS -7113FLAVIEN MICHEL 11970 91992121991121467711987.9416MSANS -1139CHAMPIGNY LIONEL 11970 11995031993041202810241.7416MANGL -3774FAHNESTOCK MAX 11970 11992101991101467711987.9016MSANS -3115MAGATIS PIERRE 11971 119960219950211389 9851.0316CSANS -7606ITALIE JACQUES 11971 4199407199307 7803 7679.4516CVENTE -2804JOYEUX FRANCIS 11971 21990061992121202810241.0416CSANS -5659HOULE PATRICK 11971 21993121992121420611637.3316MESP -9687LANCIERS DANIEL PHILIPPE 11971 8199311199211 9597 8727.9016CANGL -5871LACOURTADE PHILIPPE 11972 11991121994011249910472.6116CVENTE -4676LUPINO ATSUKO 21972 6199501199401 8656 8146.1416MTECHN -2981VIREBELLE FRANCOISE 21972 219940819930810668 9426.5716CSANS -1979LOMBARDS JEAN DIDIE 11973 6199309199209 9597 8729.0716CSANS -7372BOIS MONIQUE 21973 1199407199307 7803 7681.1116CSANS -3844PERIGORD NICOLE 21973 319930919920911389 9850.5616CSANS -0819THOBIE DANIELLE 21974 1199409199309 8359 7952.6116CALLEM -8257SEVIN CLAUDINE 21974 4199409199309 8359 7951.8816CSANS -5832DELAGRANGE MICHELE 21974 3199309199209 9597 8728.8216MSANS -6357MORTARIEU MARIE JEANNE 21974 8199607199507 9894 8921.8516CSANS -7800TOURNELLES FLORENCE JACQUELINE 21974 519950119940110668 9426.0016MSANS -1978CENIS ALAIN 11974 71994091994011202810240.8616CSANS -4208BEAU OLIVIER 11975 8199510199502 8359 7951.6616CTECHN -2472TOWERS CORINNE 2197511199410199310 8359 7953.1116CTECHN -8054QUINTA PASCAL 11975 4199606199506 7803 7680.5016CSANS -5910JARRY CLAIRE 21976 1199608199508 7803 7680.6616CVENTE -9513GENISSIEUX HERVE 1197612199607199507 7803 7680.0016CSANS -6334MUSSET MARIE PIERRE 21977 3199607199507 7803 7681.4716CSANS -3177VILLEFRANCHE NICOLE 21977 7199607199507 7803 7680.4416CESP -3707PREVOST CLAUDIA 11934 81963071994011663613343.7817MANGL -7266OUCHE JEAN LOUIS 119351019930919910110407 9272.2217CSANS -5677VIRGINIE JEAN PHILIPPE 11938 51963111989071663613342.9817MESP -0564PEYREBELLE JOELLE 21939 11967011989091932314934.5317MSANS -6752SILLERY PIERRE 11941 41962061985072273717260.5917MSANS -7389BILLOUX NATHALIE 21941 3199012198912 8656 8145.3317.SANS -0440MALASSIS EVELYNE 21942 11993101992011202810240.7217DSANS -6527CURSON JEAN LOUIS 11946 71974121991011369311287.1017MANGL -4166EVIAN FRANCOIS 11946 31969101986012470018540.6117MSANS -6635ROSAY FABRICE EUGENE 11946 71970031989122334017609.4317MANGL -3999MUSARDIERE CLAIRE 21946 81968111983042470018540.9317VALLEM -9845YVETTE MARTINE 21947 71972101990071621213032.1717MANGL -1439FIEF EVELYNE 21947 91974071991071578112723.1817MSANS -2404ROME BRUNO 11947 91988031995011433211715.0917CSANS -8776ROME THIERRY 11948 61974011995031911114779.7717MSANS -5946TERRA MARIE CHRISTINE 21950 91970011991071578112723.6817MSANS -5232DEBUSSY CATHERINE 21951 81973051991021684813421.7217MTECHN -0869CARAMEL ELIANE 2195211199207199107 8656 8146.0917.SANS -1911PLASSAN THIERRY 11954 41980031992031608112916.5917MTECHN -1670LORETOHOHE MARIE EDITH 21954 11974071993101911114780.0617MANGL -9187BINGER DOMINIQUE 21955121986091991041249910471.9217DESP -2614COLLONGUE MARCEL 119561019810319820611389 9852.2917MANGL -9658BEAUREPAIRE MICHELE 21957 81977071992011471512025.4717MSANS -1305HOPITAL DOMINIQUE 21957121979071980041684813421.6717CSANS -2762PELUT PIERRE YVES 11958 119881219871210407 9271.4117MALLEM -4217ALEXANDRA JEAN MICHEL 11958 71983031993081326611017.7417CTECHN -8469CRETES PAULETTE 21959 619910719900710024 8999.3117MANGL -1495RIBAUTE PIERRE LAURENT 11959 119801019820611389 9850.8817MINFOR -1650BRIAND SYLVIE 21959 91980041992121608112915.9217MSANS -8360JOUY CLAUDIE MARIE 21959 319940419920111389 9852.7417MSANS -5653ROLL ROBERT 11959111988061991091450311830.5617MINFOR -4042TANE PHILIPPE 119591019870719890410791 9503.7017MANGL -0940YVETTE MICHEL 11959 31978071991032022115555.5017CTECHN -9875DANREMONT THIERRY 11961 41982091995041433211714.5117MTECHN -9667CASITA JEAN LUC 11961 81982081995121638413150.9717MSANS -1371ROME MAURICE 11962 21984051995081710713577.9317MSANS -6755AUBAIS BRIGITTE 21962121983011993051527112374.0017MTECHN -2907BRETEUIL FREDERIC VALERY 11962 41993021993081202810241.7217MSANS -4530MICHAUDES CHRISTINE 21963 11982071981071326611017.7417CSANS -9935TAZARKA BERNARD 11963 91992111991111330611016.2617MSANS -1813PLOUGUIE DANIEL 11964 21985081989051288210745.8117MTECHN -2666DAUX JACQUES ANTOINE 119641219840119830110791 9503.3917CANGL -4498LOUVEAUCOURT MICHEL 11965 81985061988061288210744.9117MSANS -6274BRIE PIERRE 11965 21984071983071288210745.4317MANGL -8475PATHE LOUIS 11966 91987111993091839014314.3417MSANS -2923LACLOTTE NADINE 2196610199501199304 9597 8728.7217CTECHN -5049CROZES CAROLE 21966 71987021992011450311832.6817CMANAG -9666RABINES MICHEL 11966 81986071995121450311832.3617MTECHN -1503LESTRADE GILLES 11967 119870119860110407 9272.1917MINFOR -2577JONCQUIERES MARCUS 11967 61987041990091249910471.6517MANGL -6372VILLARS LYDIE 21967 3199411199311 7803 7680.5917MANGL -8399HAMEAUX BERNARD 11968 61990071991081249910473.2417MSANS -0624BLOY MICHELINE 219681219940619930610668 9427.0217MANGL -0069ARTHUR CLAUDE 11968 71989021993041249910472.5717MTECHN -9429MATIN FRANCOIS 11969 919890419890410407 9271.0217MANGL -6364LEONIE SERGE 11969 919900319890310024 8998.4117MSANS -3990SALANGANE CATHERINE 21970 619950919940110668 9426.0017CALLEM -9447AYGULF CHANTAL 21970 419950219930411389 9851.1617MSANS -5807CIMES ODILE 21970 1199404199304 9126 8457.6317MINFOR -6551FOUCHER CHRISTIAN 11970 81990081989081202810240.2617MSANS -9323SAUVAGERIE MARCEL 11970 7199512199412 9126 8457.5917MSANS -0265PEYRIERE YVES 11970 91990111989111381911366.7217CTECHN -8683BRUSE VERONIQUE MARIE PAUL21971 119960119950111389 9851.9717CCOMPT -4051CHANTILLY PATRICK 11971 8199602199502 7803 7681.2017CINFOR -5145ETHORRI BERNARD 11971 9199309199209 9597 8729.2517MSANS -2756CADDESI THIERRY SERGE 11971 919910719900710024 8998.0117MSANS -5810HAUT CAROLE 2197212199610199510 8656 8146.9517MESP -1266GAUTIER VIRGINIE SOPHIE 21972 1199603199503 9894 8923.0217MSANS -8948CLOUD RICHARD 11972 81991071992041202810239.8317CSANS -4395DELIBES ERIC 11972 619940219930211389 9852.6917MESP -9450DAMMARTIN YVES 11972 6199404199304 9597 8729.4517MSANS -4403MORTIERS BERNARD 11972 219910919900910024 8999.0917MANGL -1227ROSSAT MICHEL RENE 1197212199407199201 9597 8728.3517CINFOR -8746VERGER JACQUES 11972 519940219930211389 9851.0117MCOMPT -9344ECHEZ CLAUDE 11973 9199505199405 9126 8456.2417CSANS -4420CASA ALAIN JEAN CLAUDE 11973 319930719941111389 9851.8417CSANS -2752BEAUTE PATRICK 119731219930419920411389 9851.7417MSANS -0850MULON GERARD 11974 619940919940110668 9425.6717MCOMPT -2641ESCURIAL JEAN FRANCOIS 11974 3199606199506 7803 7679.5117CTECHN -2955MALETACHE GENEVIEVE 21974 9199508199408 7803 7680.9817MSANS -5801COSTES NOEL 11975 8199609199509 9894 8921.3117CSANS -2146DAUMIER IGINIO 11975 4199310199210 8359 7951.7917.ALLEM -3984OR GISELE 21975 9199607199507 7803 7679.6717CANGL -9050GIRAULT LILIANE 21975 5199406199306 8359 7952.9617MSANS -3948SEIN FREDERIC 1197511199410199310 8359 7953.3217CSANS -4265MIGNET BERNARD 11976 5199507199407 7803 7679.7817CANGL -0351RIMBAUD JEAN PAUL 11976 619961219951211389 9852.3617CSANS -1931BERGERAC DIDIER 11933 3198810199501 8656 8146.3218.SANS -9698SCHUMAN DOMINIQUE JEAN 11935 71968101995041557012568.3518MANGL -2020JOLY PIERRE 11935 119870719900710791 9503.6618CSANS -7058BARGE REMI 11935121955021980013327724475.6718MTECHN -3747MARIES RENE 11935 51955021988013844228044.8418MSANS -3141VALLONGUE GUY 11936101976071991011433211715.2418MINFOR -1098CACTU CATHERINE 21936 41962111991072273717261.7218MINFOR -9199PLOUHARNEL BERNADETTE 21936 21967011989102273717261.0418DINFOR -9270ABBE SOPHIE 21937 71968061991041932314934.4118MSANS -2969BEDOYERE GUY 11937 7199001198412 8656 8146.6418.TECHN -1219HOCHE JEAN MAURICE 11938 51969051990011433211714.1218MANGL -1887TOURNON GILLES 11938 51967051990011433211714.1918MANGL -5417AMBREVILLE FRANCE 21938 51973071990071578112721.7618VSANS -1954SOPROCOM PATRICK 11938 71973101992011403411522.1318MSANS -0028ROLE PHILIPPE 11939 81963111994011557012567.1418MSANS -6857KERPADIRAC EMMANUEL CLAUDE 11939 71965051990011433211714.6418MANGL -3697PEYRUIS BRIGITTE 21939 81962061991021834514276.0918MSANS -5636SAVE RENE 11940 21969061991101433211714.1918MSANS -5290VIALE PHILIPPE 11940 11974071991011369311286.8418CINFOR -2591COLLE FLORENCE 21940 3199207199107 8656 8146.5218.SANS -7651GOZLAN XAVIER JEAN 11940 41960031993033200223582.7318MSANS -8388MONTROUGE LOIK 11940121974071992011403411520.2018MTECHN -3384LIVRON FRANCOISE 21940 71964071992072273717261.1818VSANS -7291MARLY MARTINE 2194010199206199106 8656 8145.8318.INFOR -2644EAU FRANCIS 11941 11968121990011433211713.5818MSANS -0515WRIGHT PHILIPPE 11941 21973061992041403411520.2118MSANS -1243SEMAPHORE ANDRE 11941 71969111986072470018540.5618MTECHN -1791PASTEUR BRIGITTE 21941 61974101992011578112722.8818MTECHN -1226SAUD JEAN PIERRE 11941 91973081995011621213034.1018MANGL -3874PASSERINES DOMINIQUE 21941 61966021992042273717260.5318MANGL -5394QUAY YVES 11941 91973041990101684813421.4518MANGL -0308BELLIVIER MICHEL 11941 21963091988043417325098.6318MSANS -8445HEROS SYLVIE 21942121963091991082470018540.5318MSANS -7703CERF NICOLE 21942 51978071992121471512025.6118MSANS -3807REBAIS FRANCOISE MICHELE 21942 31972041989011621213032.7018CSANS -5173TARCO MARC 11943 51973051993011369311286.4718MSANS -3544RESTANQUES SERGE 11943111971121990011433211713.8018MVENTE -7289FRAMBOISIERE DANIELE 21943 51969071991011578112721.6718CALLEM -2761WYLLIE ANNIE 21944 41963121985051932314935.2918MSANS -7593AMPHORE BERNARD 11944 71964101989062922321684.7218MANGL -7373PAMPERIGOUSTE MICHEL 11944 21972101992011403411521.3418MSANS -1159PATIOS ELISABETH 21944 91970101991101932314935.2618MSANS -6999BEL ALAIN 11945121969101990011433211714.7918MSANS -7962VIGIE MICHEL 11945 91971071994122295317300.3718MTECHN -3123GAULLE ERIC NOEL 11945 51973121991082470018540.6918MMARKT -9943DOUMER PATRICK 11945 51968041990071433211715.1118MSANS -3765IMPERATORS GHALIA 21945 61965021993102137316332.1118MSANS -6688COULOUNIEIX HERVE JEAN MARIE 11945 61971031991062273717260.7718MSANS -0965JUDITH BERNARD 11945 51966051987122470018542.2418MINFOR -3763MERMOLLOD DANIEL 11945 21972071992011433211713.5318MSANS -0042POUTGE PHILIPPE 11945 81968081990101433211715.7218MSANS -2250JACQUIN JOEL 11946 41971071991102022115556.3818MSANS -7112REDOURTIERE VERONIQUE 21947 3199303199203 7677 7603.7718.ANGL -5217SARRAZINIERE MICHELE 21947 51968111991102137316330.6718MINFOR -1448MAUPASSANT PHILIPPE 11947111968121988102273717260.8118MSANS -7506CLAP JEAN JACQUES 11947101968061986042470018540.8918MSANS -5237JAS MICHEL 11948 21975101993121369311287.1918MSANS -0341MAKILA NICOLE 21948 2198901198510 8656 8145.1118.ESP -3475REMISE MARIE CLAUDE 21948 41968041989042273717260.3218CSANS -3575DONAT JEAN MARC 11948 51972121991011621213033.6418MINFOR -0433CAROUBIER PHILIPPE GABRIEL 11948 5198801198306 8656 8146.1618.ANGL -9184PINEUILH CATHERINE JEANNE 21948 11968091967091493112142.5618MSANS -1377KERCOLIN ALAIN 11948 91972061992112137316331.4718MSANS -7248MERCIER FRANCOIS 21948 71970071993121834514275.1418MSANS -9014FELOUQUE JEAN LOUP 11948101972121994011621213032.9718MCOMPT -1756FREMICOURT DOMINIQUE 11949 81969121989111932314933.9918MANGL -7383BLAISON FRANCOISE MARIE 21949111970071994031834514275.1618MALLEM -6290TILLEULS BERNARD 11949 61971041990123417325098.1518MINFOR -2226VIVO DOMINIQUE 21949 41971101995041834514275.6118MTECHN -8441SARGIS CLAUDE 21949 11973061993082175716601.4318MINFOR -1520PIC JEAN JACQUES 11949 11975041992041403411521.8618MSANS -5696DRUGEON PATRICE 11949 81980071995041249910473.1818MANGL -1048MORIZET ANNE 21950 11970121994051834514274.8318MSANS -4058FRANCE ALAIN 11950101974091991071578112722.6118MMANAG -0512MARBO JOSIANE 21950 71972011992102017815517.3818MANGL -2797GUY LIONEL GILLES 11951 51976051993071894014662.5918MSANS -9267SAUSSIERE MARC 11951111972041992102017815516.2418MSANS -6865EMMANUELLA ALAIN 11951 51982041993011369311287.7418MSANS -0116GALICIE FRANCOISE GEORGETTE 21951 41971101992011471512024.0618MANGL -6144ROSERAIE DOMINIQUE THIERRY 11951 91972081992112739020404.7018MANGL -9941JULIETTE CHRISTIANE 21952 71976091992011578112721.6518MANGL -1879CLAIRVAUX JEAN SYLVAIN 11952 31976041993011369311287.4318MALLEM -9577PECHEURS DOMINIQUE 11953 31978031995011578112723.3318MSANS -4352BAR REGIS 11953 71979061994011249910473.4518CSANS -2194EVIAN DANIEL 11953 81977061992011608112915.1218MANGL -0566PARADISIER DIDIER 11953 11983111993011215710278.3018MANGL -8627CHARRIERES PHILIPPE 11954 61974111982102470018540.8018MSANS -5729BRECHET PHILIPPE EMMANUEL 11954 41974081991012137316331.2818MINFOR -3643RONSARD PATRICIA 21954121976011982052256617146.4518MSANS -1486AGEN CAROLE 21954 91977071984112256617147.1818MANGL -4779CALIFORNIE PATRICE 11955 31975051991101578112723.3318MSANS -0975BIEVRES ALAIN 11955 61978101993011471512024.4718MSANS -8614DUSENBACH ALAIN 11956 61979031992011471512024.3918MSANS -4428SAUZON ISABELLE 21956111977051992011471512024.2618MSANS -1720EOLE PATRICK 11956 41987111986112090215980.5518MALLEM -8905JANVIER MARLENE 21957 11979071993041471512024.3018MSANS -7774GAL PHILIPPE 11957 81977061982041834514275.7218MESP -3204SAGINAW EDITH 21957 319790719780711302 9774.2018MANGL -5409LEUN CLAUDE 119581019800719821011389 9852.4518MANGL -4971CHANTEGRELET FRANCOIS NICOLAS 11958101978061987112256617146.9518CSANS -5691ALTIPORT ANNE 21958121979101993111471512024.9618DTECHN -1005FLEURS PIERRE 11958 81981041985041684813421.4218MSANS -6295WINTER JACQUES 11959 81982081988052090215980.7318MINFOR -3634CELY JOELLE 21959 31979101995021433211713.6518MSANS -8425SOPITENIA BERNARD 11959 919790619831111389 9851.2118MANGL -2714AGNEAUX VINCENT 11959 21980091979091684813422.7218MSANS -3908SAN CATHERINE 21959111980031989112090215980.7318MSANS -9522ALLERAY EUSEBE 11959 81982041989052090215979.8918MANGL -4818CARNOT GENEVIEVE 21960 61981031995021433211714.8218MSANS -2809VAUCRISES FLORENCE 21960 1199205199105 8656 8146.4618.SANS -6703LAFONT CAROLE 21960 31993081992011249910472.3918MSANS -4781RUSSIE FRANCK 11960 1199006198906 8656 8146.2818.ESP -0025OYANA AYALA 21960 31981011980011202810241.2518MANGL -4606GARNET CHRISTOPHE HUBERT 11960 41983011993041326611017.3218MSANS -3285CASTAGNIERS BRIGITTE 21960 61980061986101684813422.5318SSANS -9855HEBERT GABRIEL 11960 11988091992041249910472.9618MALLEM -7538RUSTICANA JACQUELINE 21960111981011980011326611017.7018MANGL -7245HAVRE ALESSANDRA 11961121985031984031608112917.1018MSANS -2845ROSNE ANNE NOELLE 21961 6199507199407 7803 7681.3818MESP -4993NOIR GUY 11961 81982031995101638413149.8318MINFOR -0352NOTAIRES PHILIPPE SERGE 11961121986111993072397418036.8018MSANS -6114LAMPAUL ROSELYNE 21961 61994021992011202810240.8618CSANS -8947GUE JEAN PIERRE 11961 41981071995071433211713.7018MSANS -6115NICOLAS DOMINIQUE 21961121983011982011608112916.0218MSANS -0276ESQUIERE YVES 11961 81988081992061450311832.1518MSANS -5271BARGEMON SERGE MAURICE 11962 51992111991011249910471.6518MSANS -3485SOURCES MARTINE 21962 1199201199101 7803 7680.9818.SANS -1542BOCAGE MARYVONNE 21962 5199203199103 9597 8728.5818CSANS -8004CARDINAL MARIE JOSEE 21962 21983051982051527112373.2318MSANS -7577VIE KAVERIO 11962121982061987111608112917.1318MSANS -1474RABIAC CLAUDINE 21962 81984061983061249910472.0718MSANS -7742CAZILHAC DOMINIQUE 21962 51983011982011608112915.6518MALLEM -1316BRIAND FRANCOISE 21963 21983041982041608112915.7518MCOMPT -5967MASCREE YVES 11963 91983071988011608112915.3918MSANS -8262PENSEES FRANCOIS 11963 71985081991091288210745.3018CALLEM -9624JOFFRE FRANCOISE 21964 71988041987041202810240.7718DALLEM -1583MONTGOLFIER BERNARD 11964 11984071993041288210745.2718MSANS -8539GILBERTIN MOISE 11964 11985041986081288210745.4318MSANS -9414YVELINES JEAN PIERRE 11964111985071984071288210745.6618CANGL -2500PROVOST DANUTA HALINA 21964 51985051984051381911365.9518MESP -4860AUBEPINES THIERRY 11964 31993081993082401918075.8118MANGL -1591CALADE ALAIN 11964 21984071990091288210745.7518MSANS -8611DUGUESCLIN MARIE NOELLE 219651219880619870610876 9503.9018MANGL -1890DUC PATRICK 11965 21985091989111527112373.2218MANGL -8780ANTANANARIVO JEAN PIERRE 11965 219860619931210791 9502.9918MINFOR -9489CALMETTE JOEL 11965 31991121992122401918075.5718MANGL -0389VICTORET YOLANDE 21965 1198810198707 8656 8146.2818.SANS -8865VERDIE CHRISTINE 21965 51990111989111949415051.6818MSANS -3552LOGEM ISABELLE 21965 3199408199308 8359 7951.8018MSANS -2210MANCHOULAS PHILIPPE 11965 31994021993021420611638.9518MTECHN -6427LAUTIN JEAN DANIEL 11966 719890619880610791 9502.0518MINFOR -9413KERAVILOU HUBERT 11966 51989061993111249910472.6918MANGL -0446CHENEUSE JACQUES 11967 419931119950910363 9232.5318MVENTE -8752ALPILLES PATRICE 11967 6199105199005 8656 8146.2318.ALLEM -8347AICARD BERNARD 11968 219880619880110407 9271.1118MANGL -2090ALICE JEAN MICHEL 11968 61993041992041202810240.9118MSANS -8583EPINETTES DENIS 11968 31988041994101249910472.6618CINFOR -2122SEE PHILIPPE 11968 9199205199105 9597 8728.6418CANGL -2399ROQUEPAVA PAUL 11968 81988071993111249910472.9118MSANS -8130FRATERNITE JEAN FRANCOIS 11969 91992061994011288210745.7218MSANS -7498CARROUGES JEAN MARC 11969 31989041993121249910473.0618MANGL -3505CHEVREUL JEAN JACQUES 11969 61990091989091467711987.2218MSANS -2473MAJOR THIERRY 11969 3199406199306 7677 7604.8418CSANS -7707AYGOSI CORINNE 2197010199502199402 8359 7953.4218MSANS -6442BERGER NATHALIE 21970 5199607199507 7803 7679.4518MANGL -5162CHANDELIERS JOEL 11970 7199501199301 9085 8419.1118CSANS -1417BILLETS WADY 11971 119931019921011389 9851.2118MANGL -1522PARAME COLETTE 21971 3199606199506 8359 7952.5518MSANS -2322BARRE JACQUELINE 21971 91991011990011202810239.7818MANGL -8136TASSIGNY JEAN PAUL 11972 31992061991061249910472.4618MSANS -2240LOUP VERONIQUE 21973 21994031993031267210589.1018MSANS -2489VELLEDER MARC 11974 7199506199406 7803 7679.7818CTECHN -8166GUERRIAS CLAUDE 1197710199610199510 7803 7680.5718CSANS -6073ALLENDE DOMINIQUE 11977 1199606199506 7803 7680.9018CSANS -6606FROIDEVAUX FRANCOIS JEAN 11934111958051993013844228045.6538MESP -5822DITTE NAGUIBA 11937 61966091991072273717260.5038MSANS -1148KERVENNEC JEAN JACQUES 11938 31971051991011663613342.7438MANGL -8491ROCHEBRUN MAURICE 11939 51967011992021932314935.2938MCOMPT -5749GILBERT JACQUES 11939 61968031992102334017610.6938MTECHN -3667PERGOLETTE JACQUES 11939 31963051988011663613344.6938CSANS -6409PLACE JOSYANE 21940 71984011991091288210745.1338MSANS -2498GASNIER CLAUDE 11940 119810719890511131 9657.9738MSANS -2100BRASSIOUX BRUNO 11942 41973061991011621213032.2438MSANS -1118HOUMEAU ANDRE 11943 51962111991072273717260.3538MSANS -4519CAGOU JEAN CLAUDE 11943 41972071991011663613343.2038MSANS -6013REMO JEAN MARC 11943 91966121990011663613343.0138MANGL -8050YAN BERNARD 11944111963121992042273717261.8138MSANS -3614EGUILLON SERGE 11944 31978041992011471512025.5638MSANS -5430CHARPENTIER JEAN PIERRE 11944 91966061994072137316332.5038MSANS -8523PARIS PHILIPPE LOUIS 11945101969071992062334017610.6538MANGL -2111TOUL ROLAND 11947 51972021992012017815518.0638MINFOR -0683GEORGES RICHARD EMILE 11948 91976091994012000715439.1738MANGL -7517GRAND PHILIPPE 11950111971041995072470018540.9738MSANS -4909AIX JACQUES 11950 11970041993121834514276.0138DCOMPT -3400NOUAN PIERRE 11951 41971041992122739020403.8938MSANS -7319BERGERONNERIE MICHEL 11951 21979031993011578112723.3338CSANS -2615PATURES DANIEL 11952 91972081993122547019085.9538MALLEM -1673MIRAMAR PHILIPPE 11952121973071983112470018541.3438MSANS -4747LOLIVE FREDERIC 11953 81978111993011608112915.9738MSANS -9613BORD JEAN MARC 11953 41978051995041249910473.2038MSANS -9161CHANTE PATRICK 1195311199603199505 8656 8147.0938MTECHN -1511COLBERT PIERRE MARIE HENRI 11953121973031993042017815517.9138MSANS -0700BRAGELOGNE ALAIN 11954 91974021989052256617146.1638CSANS -4590BERRY CHRISTINE 21954 5199302199201 9085 8419.4938DMANAG -7017LASPLANES DOMINIQUE 11955 41984061993041326611016.6238MCOMPT -4869ROUMANILLE CLAUDE 1195512199306199206 9126 8457.4938CTECHN -2931PYRAMIDE ANDRE 11956 61979031992011471512026.0638MSANS -0636COTEAUX MICHEL 11956 31976011992011608112915.2138MANGL -9829EUROPE JACK 11957 11980061985011684813422.6838DSANS -7001FORET MARC 11957 41977011994011249910471.5638MTECHN -7136OCEAN HENRI 11957121977061992011471512024.5338CSANS -3955VIGNES PATRICK 11959 51981011993031608112916.1438MANGL -9568ARNOCHE GERARD 11959 71981061993121471512025.8338CTECHN -4979AIMEE PASCAL 11959 519860219880110791 9503.5238MSANS -2891SCHLOSSER BRUNO 11960 51982111995071433211713.6738MSANS -8194CABIRAUX JEAN LUC 11960 219930119910110407 9272.1338SANGL -2865LEIGNE ANNE MARIE 21960 71980091993051527112374.8538MSANS -4343GERMIGNY YVES 11961121983041982041326611017.7438MSANS -2039ROUTE JEAN CHARLES 11961 21982031981031326611017.8838MANGL -8887CUTTE HUBERT 119611019820619810611131 9657.5738CANGL -5692LAC FREDERIC 11961121981051994011433211715.2438MTECHN -9404COMBES HUBERT 11961 9199308199208 9597 8729.7438MCOMPT -7675CHEVRIER JEAN HERVE 11962 41984021991071527112374.2538MINFOR -8147PROMENADE CHRISTIAN 11962 3199405199201 9597 8729.7238MANGL -8550RASCAS JEAN 11963 119850219900610791 9503.9738MSANS -8387JEROME PIERRE 11963111985041992011949415051.6838MALLEM -7757FAVIERE PATRICK ANDRE 11963 51984081991021527112373.3138MSANS -2903GLADIATEURS MICHEL 11963 31984121983121326611016.0338MSANS -5686BEDFORDALE THIERRY 11963 819831219821210791 9502.0438CINFOR -5983TANNERON JEAN FRANCOIS 11964 61987111995042256617147.2238MTECHN -5469CIGALIERE JEAN FRANCOIS LOUIS 11964 31988081988021450311832.6838MSANS -2425BOUVREUILS MICHEL 11964 11988011995121381911366.9938MMANAG -7826EAU ARNAUD 11964 81987021986021249910473.4938LSANS -4783TESSIER MICHEL 11964 61990011991011249910472.1238MALLEM -4053ARPENTS PHILIPPE 11965 219901019891010407 9271.1138CESP -5354COMBELONGE PHILIPPE 11965 41985041984041288210745.9338CESP -0915TUILLIERE JEAN LOUIS 11965 51989031991011249910471.5838MCOMPT -3732MALABRY FREDERIC 11965 219940119910110407 9271.7938CSANS -8032VIRO PASCAL 11966 319921119911110024 8998.3738MSANS -0237TORRICELLI ERIC 11966 61988101986051288210744.7638.SANS -9815LAPLACE PHILIPPE 11966 5198912198812 8656 8146.1438.SANS -0253TALLOIRES ERIC 11966 61989121993071381911366.0338CSANS -7893BOURBOTTES JOEL 11966 8199404199201 9597 8729.0338MANGL -2674SET OLIVIER 11966 619891119881110407 9270.5638MSANS -8321LONGS FREDERIC 11966 219950319940110668 9427.0238CSANS -6369DOURBIES PATRICE 11966 319920319910310024 8999.3438CSANS -1563TURBINE JACQUES 11966 91987031994091693613498.1438MTECHN -6038COLLINE RICHARD 11966 5198912198812 8656 8147.2238.ANGL -8370BONSON THIERRY 11967 5199011198911 8656 8145.3838.MANAG -1538FAUVETTES HUGUES 11967 6199609199509 7803 7681.3138MANGL -5092DJINNS MICHEL 11967 1199111199011 9597 8728.9938CSANS -3468GARDES FARID 11967 119880319870310407 9270.4238MSANS -7303DENY JEAN CLAUDE 11967 51993021992021202810240.7738CESP -1319PLOUGONVELIN JEAN FRANCOIS 11967 919880919870910407 9270.1638MTECHN -7182BEAUMARCHAIS ALAIN 11967 11990111993071381911365.9838MSANS -5432ROMAIN JEAN PIERRE 11968 519940519920110024 8998.1738CANGL -8756PEGUIERE PHILIPPE 11968 919940319930310668 9426.6338MTECHN -0590MONTROSIER DIDIER 11968 419940419920111389 9851.6438MSANS -3773FIORI MICHEL 11968 61990051990051381911364.9938MSANS -9060CHAMBORD AGOSTINI 11968 9199406199306 7803 7679.9138CSANS -7693DIZIER THIERRY 11968 319920519911111389 9851.7338CSANS -7838CECILE PATRICK 11968101988071991011249910473.6738CSANS -6964GOYRANS GABRIELLE 21969 91990031992011202810239.9638MSANS -0784COSQUER COLIN 11969 719940619930611389 9851.9638MINFOR -8622COURTAIS JOSE 11970 619960719950710668 9426.6238MSANS -2794BERGERET CHRISTOPHE 11970 61992051993041202810240.5938MINFOR -4688RABELAIS FREDERIC 119701219940619930411389 9850.7138MANGL -9681POUSSEAUX RICHARD 11970 61991041990041202810241.4538MINFOR -0530BRANCOLAR PIERRE 11970 619900619890610024 8998.3538CANGL -9957LENTILLY LAHOUARI 11971 7199607199507 7803 7680.6638CSANS -7210CHAMPERRET ANDRE JEAN 1197111199406199201 9597 8728.6838CTECHN -7549BRAMO JEAN 11971 2199612199401 9597 8727.9638CSANS -1719TELEMLY JEAN 1197110199612199512 9894 8922.8038CINFOR -7574MOUQUET PIERRE 11971 3199304199204 9597 8728.7738CANGL -1471ETOILE PHILIPPE 11971 3199501199304 9597 8729.9038MANGL -1536MAISTRE LOUIS 11971 51990121989121202810241.5238MINFOR -7328BLAMONT BRUNO 11971 31991021990021202810240.4038CSANS -4093TOLOSANE JEAN 11971 51991071990071202810240.7638CANGL -8648RAPHAEL GERARD 1197210199408199201 9597 8728.4938CMICRO -2769GOULET ERIC 11972 119950419940111389 9852.5938MSANS -9108CRETEIL MICHEL 11972 4199606199506 8656 8145.6638CSANS -5284POMPONNE ALEXIS 119721219920519911211389 9851.7938CTECHN -8876LAIGNEAU ALAIN 11972 3199202199102 8656 8146.4138.ANGL -6070REVOULUN CONOR 11972 2199608199508 7803 7681.4038CMARKT -8083CLEYRAC JACQUES 11972 5199403199201 9597 8727.9138CANGL -8314PARIS GERARD 119731119940819930810668 9426.0338MANGL -4108SEGURET GUY 11973 9199207199107 9597 8728.4638CSANS -4139PRESSENSE PATRICK 11973 9199608199508 8656 8145.6938CALLEM -2465CHATEAUDOUBLE DIDIER 119731019950219940210668 9426.4838CSANS -5213MARTINIERE GERARD 11973 8199608199508 7803 7679.2838CSANS -0769POUR PHILIPPE 11973 719940919930910668 9425.8538CSANS -2580BESON MARC 11973 7199307199207 9126 8457.0238CALLEM -4770LIEUTENANT JEAN OLIVIER 11973 8199607199507 8656 8145.6638CINFOR -1963SENGA CLAUDE 11973 6199412199201 9126 8457.2238MCOMPT -2932SOULT CAMILLE 11974 5199604199504 8656 8145.8338CESP -5177CLOS GILLES 11974 4199506199406 9126 8456.6138CALLEM -0619MEUR BRUNO 11974 2199607199507 9894 8921.6938CANGL -3202RUBEU DOMINIQUE 1197411199610199511 9894 8922.0838CINFOR -1263PONTILLOU DIDIER ERNEST 11974 1199309199209 9597 8728.1738CSANS -3833NEUVE JACQUES 11974 2199508199408 9894 8921.6438CANGL -6528NIMES ROBERT 11974 1199410199310 9597 8729.3638MSANS -9312CHAT ANDRE 11974 7199307199207 9597 8729.6338CANGL -0437SAUVAGEONNE RICHARD 11974 4199301199201 9597 8728.8238MSANS -5387PLEHEDEL JEAN RENAUD 11974 8199309199209 9597 8728.9938CVENTE -5835MAROLLES DENIS 11974 7199609199509 7803 7679.9438CSANS -5277BURON STEPHANE 11975 4199410199310 9126 8457.5938CALLEM -0147URSULES PATRICK 1197510199512199412 8656 8147.1738CSANS -6637DEVANT PATRICK 11975 7199610199510 8656 8146.2938CSANS -7462BARBICAJA STEPHANE 11975 9199609199509 7803 7679.3138CSANS -9096HELENA PHILIPPE 11975 81994111994011202810241.8538CINFOR -7777ENGOULEVANT JEAN CLAUDE 1197511199612199512 9894 8922.0838CSANS -7823BRENNUS JEAN PIERRE 11975 2199606199506 7803 7681.2038CINFOR -7353LOOVAS FREDERIC 11976 6199612199512 9894 8922.8938CANGL -5381BRIAND JACQUES 11976 1199507199506 7803 7681.4038CSANS -8880LECLERC FRANCOIS 11977 2199506199406 7803 7679.8738CMICRO -1576MONTMELIAN CLAUDE 11977 9199607199507 7803 7679.3138CANGL -6203GUECH RENE 11977 1199507199407 7803 7680.2638CCOMPT -2768MERIBEL RICHARD 11977 7199607199507 7803 7681.2938CSANS -7366FERNANDEZ OLIVIER 1197712199607199507 7803 7681.0238CANGL -7525LONJUEUIL SYLVIE 2193011198901199511 8656 8145.9141.INFOR -8410CAIXA JEAN PIERRE 11935 31956051979013327724476.3741MSANS -4687FURSTENBERG NADIA 21936 31972041994101881314585.6641MSANS -9030AMIRAL JEAN RENE 11936 61961081993011663613343.8441MSANS -0747SURREY TOMOE 2193611199201199101 7803 7680.6241.INFOR -6230LIGURES JEAN PAUL 11937 81962021994042666519900.8141MALLEM -5598FONTENELLES CLAUDIE 21937 31962031995102666519899.2941MANGL -7964AUMONT JOSE 11938 31968121991011433211715.7241CSANS -1865HUBERT CHRISTIAN 11938121962111982112470018542.1041MSANS -0974ROMAINE JEAN MARIE 11939 91962111989071663613342.9741MALLEM -8959BILLEHOU DENIS 11940 41962011993011663613343.2041MSANS -3134RESISTANCE CHRISTIAN 11941 61970051987012022115555.5741MANGL -2829MARCIGNY ANNETTE 21941 8198901198711 8656 8146.6141.SANS -9621AIR MONIQUE 21941111968071990071578112723.4141MTECHN -2532MIMOSE JEAN 11941 31979031994011369311287.2541CANGL -6822BERLIOZ MICHELE 21942 81965021992051932314934.6841MSANS -8381REGRATTIER FRANCOISE 21942 41963101991072273717261.0341MSANS -1877GASTON APOLLINA 11943 41972061995011663613343.5241MANGL -9764NORTH CATHERINE 21943101992051995121330611017.8841MVENTE -0051FABRON GILLES 11943111972121992041403411522.2441MSANS -2826DESTEY RICHARD 11943101965121990011433211713.6541MSANS -4901GANDHI FRANCOISE 21943 31969031991011932314935.1641MSANS -2788ENSOLEILLADE CHRISTIAN 11943 81966011991043844228044.1541MINFOR -2725SAROIS CORINNE 21943 71972081994051804514081.9541MANGL -4033GRIVES PHILIPPE 11944 31966101990011433211714.0341MSANS -0306LUTECE CATHERINE 21944 91977061992011471512026.2241VSANS -6413TURALURE LOUIS 11945 11967121990041433211715.1541MALLEM -6065BUARD JEAN JACQUES 11945111969061991011433211714.6441MTECHN -0713CLAUVEL MARIE CHRISTINE 21945121993101992011202810241.7441MSANS -2016BENGALIS HENRIETTE 2194510199103199003 7677 7603.0141.SANS -5741SAUVAGERE ALAIN 11945 91972021989011621213034.1541MSANS -5896GAILLARD ERIC 11946 31973021995011663613344.4541MANGL -4390PAROUQUINE MARTINE 21946 81973041995101911114778.4441MESP -4358MAYE CHRISTOPHE 11946 81970111994051834514276.1841MSANS -3228PERRET JEAN PIERRE 11946 419800719790711389 9852.6741MESP -2070COMMERCE MARTINE 21946 11965101995042739020405.2241MMARKT -2112COT CHANTAL 21947 5199104199004 8656 8147.0141.ANGL -5488MONTAIGNE ERNEST 11947 81972061989041621213032.6541MTECHN -4615JAURES PASCAL 11947 319850219840211389 9852.1441MSANS -3975BENAT MARTINE 21947 9197204197104 8103 7796.4541MTECHN -5422LAUGIER FREDERIQUE 21948 719850419880110791 9502.2841CANGL -7269TORTE DENIS 11948 71969081994083916628548.6641MSANS -9916MARNES JEAN CLAUDE 11948 719931019910710407 9270.0341MCOMPT -7840GRIGNON CHRISTIAN 11949 51969121989122470018541.4341CVENTE -5255VERNY ARLETTE 21949 81971061990071621213033.7041MALLEM -4729SALONINA PATRICK 11949 91974041992011608112916.6141MCOMPT -5121KISS THIERRY 11949101976041994011369311288.2241MTECHN -3042FERIC MARIE CLAIRE 21949 51984071994031288210744.1741VTECHN -3660PLAINES FLORENCE 2194912199303199306 9597 8728.0841MANGL -6514EPINIERE JANY 21950101972011990102175716601.3041MSANS -4692HUNTZIGER BERNADETTE 21951 71992101991101202810241.0741MSANS -6747CHAMPERRET LAURENT 11951 819870719870810407 9270.9741MSANS -5984JAMET DANIELLE 21952 9199203199103 7677 7603.0441.SANS -8680SERRALONGUE ANDRE 11952 31977071981102470018541.9541MSANS -1345LENTILLAC ALAIN 11952 919940119920110407 9272.0141CALLEM -9942AUSSEL MURIELLE 21953 4199406199306 9597 8729.5841MINFOR -6512SCIPION CLAIRE 21953121974081992032175716602.2441MSANS -2634FOCH JOCELYNE 21953 31996011995011249910473.0941MINFOR -5957CYPRIERE CHARLES 11953 81977091993071369311288.1041MANGL -7817EMILE SYLVIE 21953121973041994011527112373.0441MSANS -8678HUNG HUGUES 11954 819810519850611389 9852.6041MSANS -7968LUBONIS MICHEL 11955 71980041992021471512025.5241MSANS -3688EBAT ANNE MARIE 21955 31977071995071433211714.0341LSANS -0140GIRARD CLAUDE 11955 71978111991041578112722.8741MTECHN -6583EUGENE CHRISTINE 21955 71978051992111608112916.2541MINFOR -3771CUQUES ELISABETH 21955 11993101992011202810241.6641MSANS -9329CARRIERO JOSE 11955 719830419820411131 9658.8341MSANS -6210MACHIEL ROGER 11956 71977031993041471512024.0841MSANS -7407QUENU PATRICK 11956 71980051995041249910473.3241MALLEM -7722CARNOT GENEVIEVE 21956 51977051993031608112915.4241MALLEM -7051PALMIERS EVELYNE 21957 41980041994011471512025.1141MSANS -6978JACARANDAS ALAIN 11957 11985081993041288210744.7741MANGL -5352VANTAGE GERALD 11957 91978071992091471512024.5341MTECHN -9337CHALONS MICHELE 21958 3199609199509 4342 5820.2441MSANS -6534HERRET VIVIEN 11958 919861119860710791 9502.8041MSANS -3402RUVEI LINDA 21958 71981051995041433211713.6241MSANS -5959SERLIANE HERVE 119581119851219841210791 9503.3141CANGL -2613ROSIERS RICHARD 11958 3199601199507 9894 8921.8141MSANS -3289ALLEGRES GERARD 11959121981071994011471512025.9141MSANS -6523ROCCA GUY 119591219850119860411131 9659.1541MMARKT -8881CHATEAUBRIAND GILLES 11959 51981011993071471512025.3241MSANS -5781HELSINKI DANIELLE 21959 81981011995011433211715.7441MANGL -4147SIAGNE CORINNE 21960 61981041980041450311832.2441MSANS -1606POIL MARIE THERESE 21960 919941119920110024 8999.5241CANGL -1752ROUGUIERE GUY 11960 319940819951011389 9851.1041CSANS -5961CHALAIS MICHEL 11960 919930819910110407 9271.4641MSANS -1601DURUY ANNE MARIE 21960 21989071988071249910473.2741MALLEM -3631ESPARIAT MIREILLE 21960 4199511199411 9126 8457.4941MESP -2747TENSE MARCEL 11960 11982021995042256617145.7841MSANS -6989JACQU YANNICK JEAN LOUIS 119601219831119850111131 9657.0641CSANS -4612BOURNET LAURENT LOUIS 11960 119900519891110407 9271.2441MSANS -3236PIOL DOMINIQUE 11960 51984051991011326611017.7741MSANS -6475VILLETTE PHILIPPE 11961 21984081983081608112915.6641CANGL -8207MESNIL REGIS 11961 21982101990112090215979.7941MSANS -0526AGUESSEAU DARA STEFANE 21961 91986041985041288210745.7541MSANS -3092MONTFLEURY JACQUES 11961 11983041994011433211713.9441MSANS -7762BUCHERIE ANNIE 21961 91986101985101288210744.6741MSANS -9535MADONA CHRISTIAN 11961 719931019910110407 9270.8041CSANS -4953GARE HIROMI 21961121984031994011527112374.4941DSANS -6431CORNEBARRIEU JEAN PIERRE 11962121985101991021527112373.6241MANGL -3878ANLHIAC MICHEL 11962 7199602199502 8656 8145.9641MSANS -6464ESTEREL GASTON 11962 619860319880310791 9503.7641MANGL -2255MAUVALLAT ANNE 21962 71982081981081326611016.1541VANGL -8438CHANTACO MARIE NOELLE 2196211199307199207 8656 8147.1541.SANS -4202FENOUA MARC 11962 3199212199112 9597 8728.5041MTECHN -3836PAUL PHILIPPE 11962 31982011993041326611016.2141MSANS -0418CHANET NICOLE 21962121982041981041608112917.1541MSANS -2005ROCHES MARIE HELENE 21963 31984071983071608112915.2141MINFOR -7305RASPAIL YANN 11963 719850919840910791 9501.7841MSANS -4264SCHOENFELD PHILIPPE 11963 619830419841111131 9658.4241MANGL -4951LAUVE JEAN PIERRE 119631119840319860610791 9502.5941MSANS -7632VALLOIS FREDERIC 11963101986011990111288210744.6741MSANS -6021ANTOINE JACQUES 11963 4199406199306 9597 8729.3441LANGL -1193SAUT YANNICK 11963 51987061992121450311830.7941MSANS -5840VIRARD JEAN PAUL XAVIER 11963121995011994011206910241.4941MTECHN -0346CASATORRA BERNARD 11963 419910619900610024 8998.1741MSANS -0082BAURECH HENRI 11963 41991101990101381911365.5041CSANS -3466TULIPES ANNEE 21963121984111983111450311830.8541MTECHN -3635FUSTEL BRIGITTE 21963101983041991091527112373.6441MALLEM -3776THUITSIGNOL ANDRE 11963 91983071986081326611016.7441MSANS -7941PINS MICHEL HENRI 11963 81983081993041288210745.4341CSANS -8903CHARTRES MARIE ODILE 2196412199412199312 8656 8147.2441MANGL -6455GIANOTTI FRANCOIS 11964 219870119860110791 9501.8341MSANS -3178PABU PATRICE 1196412199606199506 8656 8145.9641MANGL -1683TOKI GILBERT 11964101994051993051267210589.2541CTECHN -1069COUTURES ERWIN 11964 6199504199404 8359 7952.6641CSANS -7668PALISSY ALAIN 11964 2199310199210 9597 8729.2741MSANS -4934AIGUES JEAN MARIE 119651019860719860310791 9503.9741MTECHN -5099LARRALDIA REMY 11965 11987021993091949415052.3541CANGL -8301BOUCHAREL FABIENNE 21965 81993091992091839014312.4041CSANS -7214VOUTE CHRISTIAN 11965 419870719870610407 9270.9741CTECHN -7913MOULINS YVES 119651219890519880510407 9271.8641DCOMPT -1180REPENTANCE MICHEL 11965101993111992011249910472.8741MALLEM -1457SAUVETTE GERARD 1196512199301199201 9597 8729.3041MSANS -4206LONGERE ISABELLE MARIE ALICE21965 8199610199510 8656 8146.1141CANGL -2030TONELIER MARC 11965 719860419880510791 9502.5541CSANS -2828DERRIEN JEAN JACQUES 11966 71991011990041202810241.6141MSANS -5283COULLET OLIVIER 11966 519880619870610407 9272.1341MANGL -8198COUPANCES CHRISTINE 2196610199403199303 9126 8456.3041CSANS -4478NOSTRADAMUS GREGOIRE 11966 719860419900210791 9503.9741MSANS -7215HILAIRE FRANCOIS 119661019860319850310791 9503.9741CSANS -8745MONTREUIL GUY ROBERT 119661019910419900410024 8999.0741CTECHN -3647DELESTRAINT JEAN CLAUDE 11966 11989061994011381911366.2741MSANS -7458LISERB JEAN LUC 11966121991061992031381911366.0941MALLEM -6758BIGOCHETS FREDERIC 11966 119911119901210407 9270.8341MSANS -0098JARDINIERS MYRIAM 21966 51986061993071450311830.9441MVENTE -0882BRUXELLES CAROLINE 219661019940319920111389 9851.8241MALLEM -5390VEYRE NATHALIE 21966 419941119930411389 9851.9741MALLEM -4046CHAMBERTE BERNARD 11966 31987091988071949415052.4441CSANS -4837BONNAMOUR MICHELE 21966 21994031993011723313654.5941MSANS -0532MORE LOUIS 11967 919870819930410407 9270.2441MTECHN -4906LELIWA DANIEL 11967 219870619860610407 9271.2041MSANS -5362MAGNOLIAS JACQUES 11967 6199609199511 7464 7525.6141CSANS -8779SORQUES GUY 11967 61988041990011249910472.9741MANGL -1022ETANG GERARD 11967 3199506199304 9597 8729.5841LANGL -8535DELACROIX JEAN PAUL 11967 619940519930511389 9851.5141MSANS -4910ARANDELYS HERVE 11967 71990101989101202810241.0941MANGL -4304EURE ALAIN GEORGES 11967 51991101990101330611017.7941CESP -0132DJILLALI ALAIN 119671119931119920110407 9271.1941MSANS -9907BON THIERRY 11967 91987091992111450311830.6141MSANS -5376REGNAULT DANIEL 11968 51990111991021381911366.7941MALLEM -0903SUR BRUNO 11968121992051994121330611017.0541CSANS -7066RENAN FRANCOIS 119681219890619910510024 8999.7441CVENTE -9334ALL ADELE 21968 9199310199210 9597 8728.9841MSANS -1100MONTFORT ANNE MARIE 21968 519950219930411389 9851.7441MSANS -7153PINSON GENEVIEVE 21968 31989111993071381911366.3041MSANS -4338MABO MICHELE 21968 7199602199502 8656 8147.1541MSANS -2568GODEAUX GEORGES 11968 61994051993051267210590.4141MSANS -9355MEUNIER MARIE HELENE 219681219940919930411389 9851.1041MINFOR -4462CACTUS MICHEL 11968 51993091992091839014312.7641CTECHN -2155REINOTS DENIS 11968 1199406199201 9597 8729.6641CMARKT -1708QUEUILLES ALAIN 11968 91991111991111723313654.7041MANGL -9411MANDRAGORE ALAIN JEAN 11968 81995041994041206910241.6641CSANS -4930ELVIRE PATRICE 11968 41995121993041202810241.7441CALLEM -8112PAVOIS LUC 11969121992021991021381911366.7941CSANS -8181UNIVERSITE OLIVIER 1196912199408199308 9126 8456.6941LVENTE -6245CAIRE ANNICK 2196911199405199301 9085 8419.1641CSANS -2166PRETY CORINNE 21969 7199612199512 9894 8922.5341.SANS -4325COTTAGES YVAN 1196911199407199307 9126 8456.9741MCOMPT -0898SYLCO ALAIN JACQUES 11969 91989091988091249910472.9641MSANS -4572DARTHE DIDIER GEORGES 11969 4199503199304 9126 8456.5541CSANS -9418AUREVILLE PHILIPPE 11969 519900719890710024 8998.2841CSANS -7504MAROT ALAIN 11969 119910319951110024 8997.8341CANGL -4672TRUCQUES JACQUES 11969 2199606199506 8656 8145.6041MANGL -5588POUTILS ALAIN 1197012199405199305 9597 8728.2241MALLEM -8965SAUCES JEAN PAUL 11970 71992021991021381911366.2541CSANS -1934PRESSES LUCIEN 11970 11991091990091467711987.9041CSANS -5600LAROIN LAURENT 11970 91991061990061202810240.6841CTECHN -8935REINE JEAN PAUL 11970 119920819910810024 8998.7141CSANS -9304MARCQ MARCEL 11970 719940119930111389 9851.4341CANGL -5444CHEM LOUISIANE ALAIN 11970 11991021990021202810240.2241MSANS -7850HUBERT BERTRAND 119701219920619920410024 8998.1441CSANS -0638FLEUZY PHILIPPE 119701119900419890410024 8998.7141MVENTE -0729MUETTE CLAUDINE 21970 5199204199104 9597 8729.8541MALLEM -5723MARCHE LAURENCE YVONNE 21970 919940619930411389 9852.3641CANGL -1904CHENE JEAN GABRIEL 1197010199501199304 9597 8729.2141MSANS -1861CREOUNE MARIE THERESE 21970111991101990101330611018.1541MSANS -5885LONGUET MICHELINE 21970 619950319940110668 9426.5941MSANS -9271SEINE LIONEL 11971 81993121992121267210589.8241MSANS -6056CHE FREDERIC 11971 219901019891010024 8999.8541MSANS -8822BOUSSOLE ERIC 11971 819910419900410024 8998.7641CSANS -1433COMBE ALAIN 11971 5199308199208 9597 8729.3941CSANS -5251GRELLOU DOMINIQUE 11971 91992091991091330611018.2441MESP -6795EMMANUEL MARYSE 219711119920719920811389 9851.3041MANGL -6104AUDE CATHERINE JOELLE 21971 7199309199209 9126 8456.4741MSANS -3946PLEUMER CATHERINE 21971 6199301199201 9597 8728.1941MANGL -9614BOUE FRANCOISE 21971 519921219951011389 9850.7641CSANS -5568TASSY DANIELLE 2197111199605199505 8656 8146.4141SSANS -5159CHATEAU GUY 11971 619910419900410024 8998.9541CSANS -3722VERE ALAIN 119711219930919920911389 9852.6941CVENTE -8496ORANGINI PATRICK 11971 31994051993051267210590.4241CSANS -4662CANTE WINNI 21971 9199206199106 9597 8728.7141MSANS -5032CHATAIGNIER MARIE LOUISE 21971 81991121991091330611017.6441MSANS -1771PICHOLINES JOELLE 21971101991121990121202810240.9441MALLEM -8900BOULAINVILLIERS MARTINE 21971 719940619920111389 9852.0041MSANS -8306GUERRE FRANCOIS 1197112199103199003 8656 8146.2941.ALLEM -9088LAROQUE MARIE FRANCE 21971121993091992091723313654.6141CALLEM -6520LIEU JEAN PIERRE 1197112199201199101 9597 8728.2341CESP -2579HERANDIERE PIERRE 11971 6199606199506 8656 8146.4641CTECHN -8999JARDINS PIERRE 11971 819910119900110024 8999.3041MSANS -8513PERRIERES PHILIPPE 1197211199205199412 9597 8728.0941CTECHN -5836GIRARDON SYLVIANE 21972 119911019901010024 8998.5041MTECHN -9465DAN FRANCOIS 11972 31994031993031267210590.0541CALLEM -3970BREGUI GERARD 11972 5199311199210 9597 8729.5241CALLEM -8911RIVIERE MARTINE 21972 5199310199210 9597 8728.8441CANGL -8506RIBOT JEAN PIERRE 11972 3199403199303 9597 8728.1341CANGL -4988CHATILLON DIMITRY 1197210199303199203 9597 8729.2541MANGL -3678GRES CLAUDE 21972 8199608199508 7803 7680.6241CSANS -9757CADENELLE PAUL 11972 219951219940110668 9425.8141MINFOR -8910RENAISSANCE RENAUD 119721019931119921111389 9851.5541CSANS -4973SAL EMMANUELLE 21972 719920119910111389 9851.3941MANGL -8099TURENNE MARTINE 21972 8199407199407 9126 8457.5641DANGL -6683HIRONDELLES MARGUETITE 219721219930919920910668 9425.4541MANGL -3610BERTRAND DIDIER 11972 8199403199201 9597 8727.9941CSANS -7709MORINERIE YVES 11972 7199206199409 9597 8729.5241CSANS -6549BOISSERAIE HERVE 11972 41995041994041206910240.7641CTECHN -8170MALHEUREUX PATRICK 11972 21991111990111202810241.4041CSANS -0105CRONSTADT CHRISTOPHE 11972 6199209199109 9597 8729.1741CALLEM -3953CHARBERYS NICOLE 219721019930819920811389 9850.9841CALLEM -7071BARBINIERE PHILIPPE 11972 71993031992031267210590.4741CSANS -4851LETRIMAN CLAUDE 11973 5199602199502 9894 8921.9641CANGL -0165VAUGRENIER JACQUES 11973 119930919920911389 9852.3841CINFOR -7080BANCHE ANTOINE 11973 3199306199206 9597 8729.6741CSANS -1252VINCENNES ANDRE 11973 6199410199310 9126 8457.3641CSANS -1299SERIGNE LOUIS 11973 4199310199210 9597 8728.2641MSANS -7759WILDERTON LUC 1197311199410199310 9126 8457.3241CSANS -8844LORGUE SYLVIE 21973 119930319920311389 9852.3841MSANS -8332BRANLY BRIGITTE 21973 7199509199409 7803 7680.7241CSANS -8767DEMOISELLES LUC JACQUES 1197310199301199201 9597 8729.7441CANGL -6481MANCEY RENE PAU 1197311199411199506 9597 8727.8341CSANS -9685HERRIOT MARIE CHRISTINE 21973 6199408199308 9126 8456.8241CESP -5412JANVIER KATY 21973 6199210199110 8359 7953.4241.VENTE -3049VICOMTAL ANNE FRANCE 21973 2199305199205 9597 8728.1741MANGL -8606DIDIER MARC 11973 3199308199508 9597 8728.5041MSANS -5438MOREL JEAN JACQUES 11973 91994031993031267210589.0641MSANS -1333CERET ISABELLE 21973 3199608199508 9894 8922.4141CALLEM -8656COUBARD FREDERIC 11973 9199305199205 9597 8729.6641CTECHN -7939MONOD SYLVAIN 11973 5199301199201 9597 8729.2541CSANS -2807BOTTERO PATRICK 11973 4199403199303 9597 8728.5341CSANS -1950VAROISES ELISABETH 21973 619930919920911389 9850.8341MSANS -0981MARCILLY JEAN RENE 11973111992101994011249910472.1941CTECHN -7067ROSES PASCALE ISABELLE 21974 3199406199306 8359 7952.7941CSANS -5670DEVLOO RICHARD 11974 5199512199304 9126 8456.9141MALLEM -0896CHEVAL CHANTAL 2197411199603199503 7803 7681.1141CVENTE -7374BAUX MARTINE 21974 6199607199507 7803 7679.6441CALLEM -2343PANSEROT BRIGITTE 21974 7199406199306 9126 8456.5741CSANS -8458ARMANDY CLARA 21974 419940719930810668 9427.4041CTECHN -5573TAKAOA MARTINE 2197412199306199206 8359 7953.1141.ANGL -1351ROYAN MICHEL 11974 8199606199506 8656 8145.8741CSANS -2308COAT MARIELLE 21974 21994091993091206910240.3741CANGL -1077BARBY HERVE 11974 3199609199509 8656 8146.8341MSANS -8863JUNOT JEAN GILLES 11974 7199610199510 8656 8145.4441CSANS -3894CIEL JACQUES 11974 119940919930910668 9425.6741CINFOR -5086FABRE GEORGES 11974 7199407199307 7803 7680.7141CSANS -3050CROISON RICHARD 11974 9199409199309 9126 8457.3341CSANS -9319CHAT DIDIER 119751119941219931210668 9426.9341CINFOR -2636MONTJUSTIN BERNADETTE 21975 8199609199509 7803 7680.8141CSANS -1156MER JEAN MARIE 1197512199603199503 8656 8145.2141CSANS -2790RAGEUL SERGE REYNALD 11975 5199603199503 8656 8146.7941CSANS -4387BRETEUIL ERIC 11975 1199606199506 8656 8146.2941CALLEM -7191COCHET HUGUES 1197511199609199509 7803 7680.7541CSANS -7798LARGE DOMINIQUE 21975 8199609199509 7803 7680.8641CSANS -1442CANDEOU ARMAND 11975 3199603199503 8656 8147.1041CSANS -6969CHAIGNEAU CHRISTOPHE 1197512199610199510 8656 8146.0241MALLEM -5660HOULET MARIE ELISE 21975 5199603199503 8656 8147.0441MANGL -9225TOURNON MARIE ELISABETH 2197612199607199507 7803 7680.8641CSANS -3312GURGY FRANCK KLEBER 11976 6199606199506 7803 7679.6741CESP -2078CEDRES JACQUES 1197612199509199409 7803 7681.4941CSANS -1381ALPHONSE MARIA ISABELLE 21976 3199607199507 7803 7679.6341CSANS -2376POMPADOUR HELENE 21976 7199606199506 7803 7681.2941CINFOR -2713RUILLE PATRICK 1197612199507199509 7803 7680.1241CALLEM -2134FRANCOEUR ELISABETH 21977 6199610199510 7803 7680.3241CINFOR -7879EGLISE LAURA 21977 8199608199508 7803 7680.6241CCOMPT -6841GEAUNE GILLES 11978 2199507199407 7803 7680.3041CANGL -8261LOC PHILIPPE 11935 11955021990084330331421.1942MSANS -0031DEFEND JEAN YVES 11935 51961081987042273717261.5642MINFOR -7162PIOT YUMIKO 21935 41969041991051932314933.5575CSANS -6005DESIDERATO ASSUNTA 21935111962101994012137316332.6342MSANS -1346NIZON JEAN LOUIS 11936 51971021994011663613343.9542MSANS -6423CHARTIF ANNIE 21937111962081987082572519241.9042MANGL -3151EUBAS DIDIER 11938 81963021981053327724476.0342MSANS -0345KOCK CLAUDINE 21939 91968051995041834514275.4142MSANS -4204POSTILLON NICOLE 21939 31963121992102137316332.0042MSANS -1286BERTIN BERNADETTE 21939101967011990011932314935.1342CTECHN -0588ONZE BERNADETTE 21939 41962101990072273717260.7142MTECHN -0552ARENE PASCAL JACQUES 11939 21963071988101663613342.9742MSANS -8335DRAGON BERNARD 11939111963031987012022115555.3642MSANS -5819CORNEYRETTE MICHEL 11939 41963041983123200223583.0542MSANS -6812MONADE ANNIE 21940 11961121994072137316330.5642MSANS -5797PLATEAU ROGER 11941 71964041993113844228045.2942MSANS -0254FONTAINE DOMINIQUE 11941 41963071992041557012567.5042MANGL -8521PRELLAVICA JEAN 11941101966061989071663613344.4542MSANS -1509MOINE JEAN PIERRE 11941 21960031984102273717260.4542MTECHN -9780LETELLIER JEAN CLAUDE 11941111975071991011369311286.0842SALLEM -0995HECTOR MICHELINE 21941 91971011991071578112722.3742MALLEM -0917PUISAGE JANNIE 21941 81962041992042273717260.7242MSANS -0311LIEVRES ELISABETH 21941111968031990011932314934.1442CTECHN -2094NOTRE JEROME MARIE AUGUSTE11942101970061993071557012567.0042MSANS -3489EGALITE SYLVIE 21942 81962041981112470018541.3642DSANS -2303BUSSY PASCALE 21942101968121991011932314933.8242MMICRO -2502MEAUX JOSEPHINE 21943 41966061994102137316332.2942MSANS -9316DANTON ANNE HELENE 21943 91969091991051932314933.6942MSANS -0398ABREUVOIR JEAN LUC 11943 41962111986012470018540.7542MSANS -6448FORCET VALERIE SYLVIANE 21944 81964091994072137316331.2842MANGL -9339TOULON DENIS 11944 91970121994011663613343.1042MSANS -1107OUZOUER ANNE 21945 11966061992021932314935.2242DTECHN -1368ALIVOU MICHELE 21945101971101989102273717260.0542CSANS -9954LANFRIERE JOSIANE 21945 41996011994011202810240.4142DANGL -1709LUXEMBOURG FABIENNE 21945111972071991101578112721.5342MSANS -5979DESNOUETTES PASCAL ROBERT 11945 31975061990011684813422.8442MSANS -3473AULX OLIVIER 11945 61971081991012334017610.4742MSANS -3451MANEBIT MARIE MADELEINE 21947101972041993121471512025.3442MSANS -7163GIGNAC MYRIAM 21947 11969081989042334017610.2042MSANS -8839CORINA DOUGLAS 11947101967041995042137316332.5642MSANS -7647COCTEAU YVAN 11947 21973051995072547019086.4742CSANS -9097APARTADO BRIGITTE 21948111974101994011621213033.6142CANGL -9822VERONIQUES PATRICIA 21949 419791119920111389 9851.0342MSANS -5016SYLVAFLOR BRIGITTE 21949 51970021994032334017609.4642MSANS -5933BROUILLARD SYLVIE 21949 31969011991072137316331.1542MSANS -1734PLAGE LUDWIKA 21950 61971081991012137316331.0742DSANS -8533LIBERTE PATRICIA 21950121970011995041834514276.1042DANGL -7399FONTVERT ISABELLE 21950 41970121994051834514275.5542MTECHN -7055MONTGIVRAY PIERRE 11951 41972081994062547019085.7942MVENTE -4158CHARTON DANIEL 11951 91980041993041608112915.2642MANGL -7325NIEL RICHARD 11951 71973081989053417325098.0042MANGL -7367BRIAND MICHELE 21951 41973061991011578112722.0142MSANS -0279HEURES PHILIPPE 11951111980041993011527112373.3542MSANS -5487TOURAINE CLAUDE 21951 41972081991012137316332.7242MALLEM -1239JALMOUTIERS CLAUDE 11952 31983031991031693613499.3442CINFOR -4152CHEMST ELISABETH 21952 91972031971031258210512.6242MANGL -7961ABBE KATIA 21952 51986071991041249910472.5942MANGL -9227LEPELLETIER MARIE FRANCE 21952 81973051992102017815518.1942CSANS -2603ESCALE DANIELE 21952101972071990011621213034.0142MANGL -9280SISLEY BRIGITTE 21953 319740719730711515 9931.0742MESP -6356ROZIER MONIQUE 21953 51972081990041621213032.3542MSANS -6175CHENNEVIERES MARIE THERESE 21953111980101991011249910473.1542DSANS -0679FONT EMMANUEL 11953 81984081993081326611018.0942MESP -2032VIALA DANIEL 11954 71973061991011578112723.0642MSANS -7857MASSEL GILLES MARCEL 11954 81976011995072256617145.4842MTECHN -4251CLINCHAMPS ANITA 21954111977101976101279810668.5342MALLEM -4945COURS ERIC 11955 71988101992044121428006.7742.SANS -1834FUBLAINES BRUNO 11956 91976041995042000715438.5042MSANS -3825KRIMAHER JEAN CLAUDE 11956 91984081992061326611017.8242MSANS -9642MORILLOT CATHERINE 21956 319950419940411389 9851.7942MINFOR -7414DUVEEM FRANCOIS 11956 51988041992011168610047.2742MSANS -8488BOUGAINVILLIERS PATRICIA 21957 31978071977071224010317.3642MSANS -3611COURSEGOUL DOMINIQUE 11957 21984081993011215710278.5342MSANS -5494LABROUSTE AINA 21958 81980011993111471512025.4142MTECHN -9526FLEURY MARIE CLAUDE 21958 319880719890710407 9270.6042MSANS -2858LABBE FRANCK 11958121980111994051450311831.3442MMANAG -3479NOISETIERS MONIQUE 21959 31989011991101249910473.6742MCOMPT -0868ODET CORINNE 21959111989031988031249910471.6542MSANS -3022TORSE PATRICK 11959 31978121993012022115555.8642MSANS -3375ORLAMONDE MICHELE 21959121986091993051450311832.4142MTECHN -5711PASTEUR CHARLOTTE 21959 71980051994011471512024.9242MSANS -1466PERRIERE MAUD 21959101979081993071471512025.7442CSANS -9464ROS ANDRE 119601019900419940110024 8998.4042MSANS -9586TRAVERSIERE ALAIN 11960 11984121993041527112373.3742MINFOR -4466GATTIERE BRUNO 11960 41982081992081215710280.1042MSANS -4368GALIGNES GENEVIEVE 21960 61982091988031326611016.2442MSANS -2690CHERBOURG HENRI 11960 91983111992091326611017.5542MSANS -2470LEPLESSIS JEAN FRANCOIS 11961 31984041994011578112722.3742MSANS -7595GLOIRE MARIE LAURE 21961 519940219920111389 9850.6542MTECHN -1338SCAMARONI PATRICIA 21961111981111980111608112916.9742MANGL -2208PLAINES MICHELLE 21961 21982021981021326611017.4742MSANS -2517REMENIER MARTINE 21961 7199409199309 9126 8457.3642CTECHN -9410BARRELET GENEVIEVE 21961 41983021982021326611016.3542CSANS -2551POLIENAS MARCEL 11962 419870319860310791 9502.4942CCOMPT -7760DANG YVES 11962121982011993091949415051.2742MSANS -2116CEZEROU PHILIPPE 11962 71983051992022529918968.4642CMICRO -8052PECH CHRISTIAN 11962 31986021993091839014314.4942MSANS -0931SALSIBURY ANNE MARIE 21962 31982071981071326611018.0142MSANS -8826SAUCERRE ELODIE 21962 81986041985041288210743.9942CSANS -0716BEAU IRMGARD 21962 5198607198507 9085 8417.9142MANGL -1742VERSEAU MICHELINE 21962 71982111981111527112373.3542MALLEM -8835EXPERT FRANCOISE 21962 11983041982041608112917.0042MALLEM -4580TIGNES GHISLAINE 21962 619921019920711389 9851.6442MINFOR -7561SCIEZ MICHEL 11963 71991111990111467711986.1942MANGL -4437OEILLETS JEAN FRANCOIS 11963 619930219920210024 8999.8142CTECHN -9877LIEUDIT RICHARD 11963 51984101993071527112374.6742MSANS -9511KERNEVEL VINCENT 11963 91985051995101450311831.2142MALLEM -7509TARN ERIC 11963 619890219930110407 9271.8242MANGL -1089BERE CHRISTOPHE ALEXANDRE11963 51985071992011288210745.8442CSANS -7426MONTIGNY CHANTAL 21964 11985021984021527112373.3742MSANS -6738BLOC FRANCOIS 11964 61989071993071381911365.6242MANGL -4323RIAS CHRISTIAN PAUL 11964 91985091990111949415051.8942MALLEM -1244CAMBEIRON JEAN RICHARD 11964 41985051993011693613498.3742MSANS -5905CHISSEAUX HUGUES 11964 119910719920710024 8998.6442MSANS -5258LAMBROSCHINI OLIVIER MAURICE 11964121989051995082256617145.0642MSANS -1452IMAM CHRISTIAN 11964 51993111993011723313653.5142CSANS -6093DEVAUX FARID 11964 91988061994011249910473.0242CSANS -3662MIDI JEAN MICHEL 11964 71985021992091616712994.0842MANGL -6965PENNE ERIC 11964 619850419840410791 9503.7242MSANS -0024FLEURS VALERIE 21965 81986101992121450311832.2042CSANS -3927PARC CORINNE 21965 81993111992011202810240.9542MALLEM -9121NAUSSANNES JEAN FRANCIS 11965 81988051992071616712994.4542MANGL -6670GENIE PIERRE 11965101994051993051420611638.9242MESP -9153DESMOULINS PATRICE 11965 11989111994092401918074.6042MSANS -2680CHOUETTES JEAN LOUIS 11965 519891219921211302 9776.1742CANGL -5006ESPERANCE CORINNE 21966 619940919930411389 9852.3842MCOMPT -9852ADOUE DIDIER 1196611199401199301 7590 7564.3542CSANS -4760MURAT CHRISTOPHE BERNARD 11966 81991041992061381911365.1342MALLEM -4744LESCAR ERIC CLAUDE 11966 31989021988021450311830.8542MSANS -9188HULOT MAURICE 11966 11990021991101249910472.7942MANGL -3718SOU ANDRE 11966111991111994011249910472.9642MANGL -1189GROSSO XAVIER 11966111995081994081868714506.1342CSANS -7659METRA MARYSE 21966 91989051988051450311832.4142MALLEM -1281CRIPE GISELE 21966 91987021986021527112374.7042MSANS -7796AMIRAL ELIANE 21966 21994011992011202810239.9642CSANS -6977NOHANT MONIQUE 21966 91986061990111949415051.2242MSANS -7731VERGERS MARIE GENEVIEVE 21966 219941219930411389 9851.6442CSANS -4652LAFAYETTE MICHELINE 21967 31987061988031450311831.8742MSANS -7993CHILPERIC BRIGITTE 21967 619940519920111389 9851.0742CTECHN -2195VELASQUEZ DENISE 219671219940519920111389 9852.2042MSANS -5536TIFFANY CATHERINE 21967 81988051987051450311832.2042MSANS -9529CLAIREFONTAINE CLAUDINE 21967 81991081992061267210588.8542MSANS -1639VILLENEUVE GUY 11967 41994101993041202810241.8542CANGL -1238BOURBESNEUR DIDIER 11967 41991091990092611219510.6742CSANS -9384CORALLINES PATRICK 11967 31990011993031249910471.9242CSANS -4464PICHI PIERRE 11967 2199507199407 7464 7525.8642CANGL -6931VOL MICHEL 11967 61994051993041360611211.0642CANGL -0488DOREE DOMINIQUE 21967 21991111990111723313653.8442MSANS -0529RELUYEN JOELLE 21967101987101988051467711986.0142MSANS -9178PART CHRISTIAN 11967101993061993091267210588.8942CANGL -8565KENNEDY JOCELYNE 21968 11991011990011381911366.3442CSANS -2088ROUSSEL LILIANE 21968 719930819920811389 9850.8342CSANS -6684BRUN CHRISTIAN 11968 11987051992091839014313.2142CANGL -7111VENIZY JACQUES 11968 519940319930310363 9232.9842MANGL -9217POUTIS ALAIN 11968 21989041995071249910473.5942DMICRO -4714MARINA FREDERIQUE 21968 21988121992011249910471.8942MSANS -8715AULDE BRIGITTE 21968 71994051992011202810240.9142CSANS -9713ESCUDIER PIERRE 11968 61988121993041467711986.5342MTECHN -6341SELLEBIED MICHEL 11968 81988011994011249910473.4242MSANS -8663JASSERON ANDRE 11968 21995081994081450311832.7242CESP -5734ODENAS SYLVIE 21969 81991041990041381911366.0742CESP -2288CENSIER MARTINE DANIELLE 21969 4199408199308 8359 7952.9642CINFOR -4540PERS RENE 11969 71991111990111949415051.9742MANGL -5166VERAN BRUNO 11969 319930719920711389 9852.3642CINFOR -3740CLOSEAUX PHILIPPE 11969 6199312199212 9597 8729.9742CESP -5076BELLONTE JOSIANE 2196910199312199212 7590 7562.4942.SANS -6280MAGENTA LAURENCE ANNE 219691019930519920511389 9852.2442MSANS -4916MONTMERLE NELLY 21969121991101992061330611017.1642MESP -1013SEILLAN MIREILLE 21970101994021993021360611211.0942CALLEM -3949GRUN PATRICK 11970 41993111992111330611017.1942MANGL -0280RICHELIEU ROLAND 11970121991111992061202810241.0942MSANS -7899FRERES CHRISTIANE 21970 71994031992011202810239.8342MESP -5404VIARMES ROBERT 11970 41993051994011202810240.0842MINFOR -6508CALEU FREDERIC 11970101992111991111420611637.7842CSANS -6706VILLEMER GERARD YVES 11970 91992051991051202810240.0142CSANS -9352WAUTHIER CHRISTIANE 21970 919921019911010668 9426.2742MSANS -7483ARAGO REGINE 21970 11993061992101420611637.1242CTECHN -8430BRUEYS ROSELYNE 21970 5199302199202 8359 7952.7942MSANS -2207CAMBEFERRIS MARIE ODILE 21970 919940719930411389 9852.0642MANGL -7014CATHERINE ANNE MARIE 21970 519930519920511389 9851.3442CSANS -2499MONTALEMBERT FRANCOISE 219701119921219911211389 9852.4742MANGL -0607CORBERES ISABELLE REGINE 2197011199511199411 9894 8922.7742MSANS -8631MOUSTERIAN MICHEL 11970 519940619930511389 9852.7242CVENTE -4299PAIX MICHEL 11970 31994011993011420611637.1142MSANS -1722ALBERT GEORGES 11970 71990061992091202810240.8242MSANS -7839LORRAINE DANIEL 11970 81993121992121420611639.2242MTECHN -2390VENISE JEROME 11970 6199406199306 9597 8728.5342CSANS -4622BOUTON SERGE 11970 71992111991111420611638.5042MALLEM -8468MONTALEIGNE FRANCK 11970 61993031992031420611637.8042CSANS -4926LEZARDIERE JEAN CHRISTIAN 11970 819930119920111389 9852.3842MSANS -0318MISSIONNAI FRANCOIS 11970101994021993021420611639.2442MSANS -2478CENAC ANNE MARIE 21971 11992071991071420611637.4442MESP -9531FLEURIES PATRICIA ODILE 21971 6199612199512 9894 8921.9442CSANS -2370ARTOIS MARIE MADELEINE 21971 919930219920211389 9851.2442CSANS -9824CLAOU JANINE 219711019941019931010668 9425.7342CANGL -0436BUISSON JOELLE 21971 519950119940110668 9426.4142CSANS -6968RABELAIS CHANTAL 21971 619951219940110668 9426.3242CSANS -6232CASE CHRISTIANE 21971 61994051993051267210588.8542MANGL -5473GERANIUMS JEAN 11971 11990051994011249910472.9242CSANS -1033ISLE JEAN PIERRE 11971 51992081994011249910473.6342CTECHN -6691MONTAGN PIERRE 11971 91991091994011249910472.5942CSANS -3613TRONGET FREDERIC 11971 219940419940110363 9232.4642MSANS -5033GENELLES PASCAL 11971 81991121993061330611018.0142CSANS -5241KENNEDY PHILIPPE ANDRE 11971 219930619920611389 9850.5642CSANS -2276MESANGES JEAN PIERRE 11971 11991081991091202810241.0342MCOMPT -4273HOLLYWOOD THOMAS 11971 41993021992021420611639.1042MANGL -9172PITCHOUM JEAN CLAUDE 11971 119921019930410876 9502.9942CSANS -2512GACHE JEAN CLAUDE 11971 81994091994011202810240.6442CSANS -4896CHILHAC GUY 11971 219930119920111389 9850.7642CANGL -3539MAS JEAN FRANCOIS 11971101992071991071420611637.6042CSANS -4359GAULLE LOIC 11971 419930219920211389 9852.0542CSANS -0794SOCLATE ALAIN 11972101994051993041360611211.0542CSANS -6685CONSOLAT JEAN PAUL 1197211199503199304 9597 8729.5842CSANS -3658BACON STEPHEN 119721119930219920210363 9231.8642MSANS -5829RAINIER YVES HENRI 119721219930119920110363 9231.9642MTECHN -5038ROSE JOCELYN 11972 41994011993011420611638.5042CTECHN -1479NOEL JEAN PIERRE 11972 219931119921111389 9850.8342CSANS -3997RICARD SYLVAIN 11972 61992051991051420611637.5642CANGL -6600LOUP KAZUKO 21972 519931019920811389 9852.2042CSANS -9876VOUZON CHRISTINE 21972 11993101992101723313654.7242CINFOR -2373RAPAILLOU THIERRY 11972101992121994011202810240.0542CSANS -1153RIBERA FRANCOIS 11972 3199406199306 7590 7563.9942CANGL -0976AIR FREDERIC 119721119940219930211389 9850.6242MSANS -1075COLOMBIER JACK 11972 6199401199301 7590 7562.5442CINFOR -3036SOISSONS THIERRY 11972 71992021991091420611637.7442CSANS -7541HIER MONIQUE 21972 11993101994111288210743.9942CSANS -8819RHIN JOSIANNE 2197212199407199307 7803 7679.9442CANGL -4699LENTISQUES FLORENCE 21972 6199501199401 9894 8923.2942CSANS -5011CIGOGNES MARIE FRANCOISE 21972 3199605199505 7803 7681.0242CSANS -7216FARRERE CHRISTIANE 2197212199408199308 8359 7953.2942CSANS -9971SALVADOR REMY 119731219951219941210668 9425.9942CSANS -6878BIGUET YVES 119731219940219930210668 9425.5842CANGL -9980LACHAMP CHANTAL 2197312199306199206 8359 7953.7242MSANS -3279ROITELET CHRISTINE 21973 819941219930411389 9851.8742CESP -9903PROVENCE VINCIANNE 21973 2199411199311 8359 7953.6342CVENTE -6941MAT SYLVIE 21973 919930719920711389 9850.7042CMARKT -2424PLAINE ELIZABETH 21973 419950419940110668 9427.4942MANGL -4221SOLOGNE ERIC 11973 619940619930610668 9427.2442CTECHN -8519ERABLES DANIELLE 21973 419931019921011389 9852.6742MANGL -7323SAUME ISABELLE ANNE 21973 919950319940310668 9426.6242CANGL -2143CUQUES HELENE 21973 6199612199512 9894 8922.0042MESP -5163SOULELHAT CORINNE THERESE 21973 9199407199307 8359 7953.0642CANGL -9032PETILLAT PIERRE 11973 41992091994011249910471.7442CSANS -9059DARONNE JACQUES 11973 419940619930610668 9426.4142CANGL -6626DEVESSOUS JEAN CHARLES 11973 91994071993071206910241.5842CSANS -7108BUISSONNETS HENRI 11973 419930419920711389 9851.6142CSANS -0443FONTAINE YAN 11973 9199406199306 7464 7524.2142CESP -3078CHARBONNIERE JEAN PIERRE 119741019931019920711389 9852.2942CSANS -5301REYNAL JEAN LUC 11974 6199401199212 9597 8729.6742MINFOR -7425RAFFAELLI PHILIPPE 11974 319940719940111389 9851.8842MINFOR -9638SYLPHES PAUL 1197410199407199307 9894 8922.5742CMICRO -9287ROSSAYS MARIE CHRISTINE 219741019960419950411389 9851.3443MANGL -9554PILGRIMS JEAN PIERRE 11974 219931219921111389 9852.0242MSANS -0960BOCAGE JACQUES 11974121993091994011202810240.9442CSANS -7246PEYRIERE MARIE CARMEN 21974 419940719930710668 9426.2242CANGL -3039COMBRAY MARC 11975 4199607199507 7803 7680.7542CSANS -5779SAENS ANNIE 2197510199608199508 7803 7680.8942CANGL -8044FERRY ROSINE 21975 9199507199407 7803 7679.8742CCOMPT -0191KER MARIE HELENE 21975 3199611199511 9256 8533.0242MSANS -6974MANCINI JEANNINE 2197511199408199308 7803 7679.7642CANGL -0518VICTOIRE PATRICIA 21975 3199608199508 7803 7680.8042CSANS -1262TRAUD JACQUES 11975 819940519930510668 9425.9642CMARKT -7772MOZART SOLANGE THERESE 2197610199608199508 7803 7679.4142CALLEM -9670GRESSETS LAUREEN 21977 8199607199507 7803 7681.0442CSANS -8996ADRET CELINE 21977 3199608199508 7803 7680.6242CANGL -3676MENEZ MARC MAXIMILIEN 11933 91966071994011932314935.3843MALLEM -9549BOURGOGNE ANNICK 21936 41968051991102137316331.4643MSANS -9677BROQUERIE CLAUDY 219381219780719910611131 9658.3743VSANS -4456LAC PATRICIA 21938 81962041985062470018542.2243MANGL -6693FENELON VALERIE 21939 61959121986012273717261.0743MTECHN -0887NASTRINGUES BERNARD 11939 81962091992032137316331.2443MESP -7338AMBROISE RENE 11940 91968041995011557012566.9943MSANS -0858TURNEGOUET DIDIER 11942 71982011993011249910473.0043MSANS -8537VERT PATRICK 11942 61976121993011578112722.9343MSANS -3521HOUEL PATRICK 11942111970091995011557012568.2243MSANS -2105ROCAL JEANINE 21944 51970071991071578112723.3343MANGL -6696PLAIDEURS JEAN PIERRE 11945 91972121990011403411520.4243MANGL -1309BELLE MARIE MARTINE 21945 31965011988042470018541.9743MSANS -9127PENFOULIC EMMANUEL 11946 5198901198801 9894 8921.9943MESP -2831CHAMAS MIREILLE 21947 21969031993031834514274.8443MINFOR -1888BONJOUR GUY 11947 91980101993101471512024.6243MANGL -1642POURTEL FRANCOISE 21948121974111994041471512026.1543MANGL -5118QUINTANA NADINE 21948 6199406199304 9126 8457.3343MSANS -7220LANDON JACQUELINE 21948 91970071994092529918967.9843CSANS -5846ROI PATRICIA 21948 11971051991102043315669.5743MINFOR -6443JUIN DAVID 11948 11975061991012137316331.7043MSANS -1072BELLY THIERRY 11949 91979041992011249910472.6143MANGL -3513GAMA VALERIA 21949121969021990071578112722.3343MANGL -8936MARGUERITE MICHELE 21951 41973021993012017815516.0843MSANS -9731GILLES NICOLE 21951 319961119951110668 9426.2743MSANS -3374ROBESPIERRE CORINE 21952121973021991012781920675.1943MSANS -9500EDELWEISS GERARD 11952 21978011992111684813422.4443MANGL -9602PARADOU MICHELE 21952 51975051981091684813422.6843MSANS -4313BERNEDE AGNES 21954111975041991071578112723.7243MANGL -9347LAUZES MICHELE FRANCOISE 21956 91978061992051471512025.7043MANGL -9922BELLA MARIE THERESE 21956 61982041981041326611018.1043MINFOR -9508ROBERT PATRICIA 21957121979071994121911114778.0643MSANS -9342GALLERANDS PAULETTE 21957 419950219930411389 9850.7043MTECHN -8765ELANCOURT BERNARD 11957 71980081993061369311286.1743MSANS -8497RIBOT JOELLE JACQUELINE 21957 21977071992121527112373.0443MSANS -6373RENE CLAUDINE 21958121978041992021471512024.3543MANGL -1513FRANLAINE BLANDINE 21958 91984101985041527112373.9543MSANS -1684CHALEIL MICHELINE 21958 31978061993101471512025.3243MANGL -2983LAVIE JACQUES 11959111988031994011249910471.9743LALLEM -3412CORTIJO AGNES 21959 31983011982011608112915.7843MSANS -4467VADEL JEAN MARIE 11959 51991041994011202810241.3943MSANS -9453CAVILLON MAURICE 11960 61985111992071288210744.4643MALLEM -7623MALESHERBES BRUNO 11961 81984081991061326611016.7443MTECHN -1600BLANCHES MARIE CHARLOTTE 21961121990031993061249910472.0143MALLEM -7714POMMIERS VALERIE 21962 41993081992011249910471.6143MESP -7193CAMBARRAS PHILIPPE 119621119930119920110876 9503.2743MALLEM -0639TANQUEUX FREDERIQUE 21962 61982081989112090215980.8243CSANS -8276LACROIX DIDIER 11962 61991101993041467711986.8943MSANS -5057CINO GERARD 11963 61983111995091693613498.3143MINFOR -0238SARRAZINE MARC 11963 619941119931010363 9233.5743MSANS -7129NIVERT THIERRY MICHEL 11963 519910419940111302 9775.7943MSANS -8602PYRENEES DANIELLE 21964121993091992011202810240.5943DESP -6662PUERTO SYLVIE 21964121985101984101249910473.5643MSANS -7625SCHWEITZER LAURENCE 21964111991091990091202810240.4643DANGL -7052CARREAUX SYLVIE 21964 61985021984021288210744.6743MALLEM -9218SALIS ARMELLE 21965 3198801198601 8656 8146.6143.SANS -3260JABLINES JEAN JACQUES 11965 41990091995092256617145.3043MSANS -9721LAVOIR YVES 11965 619930119921011389 9852.1443DALLEM -3429CAM BERNARD 11965 61987021993051839014313.5743MSANS -1856FLAUBERT PASCAL 11965101985061994111693613498.5543MSANS -0790JARDIN SERGE 11966101987091992101539912453.0643MSANS -2445VIESCAMPS YANNICK 11966 11991111991101381911365.5343MSANS -5684SARRASIN PATRICK 11966 51994101993101267210589.3943CSANS -4794DIAZ PHILIPPE PIERRE 11966 21987111993111693613499.4543MSANS -5479THIREUIL GILLES 11966 31992041992011202810241.0343CSANS -6199HELEN MARTIAL 11967 91987081995011373711326.7043MSANS -9298FOUQUET RAYMOND 11967 419960619950611389 9852.2943DINFOR -7535COURTELINE PHILIPPE 11967 11991021994011249910471.6143MTECHN -4595PANSEROT JEAN JACQUES 11967121989091989061539912452.5143MINFOR -4584SANGUI PHILIPPE 11968 219950119950110363 9231.9543MSANS -1356BERTIN MARYVONNE 21968 41993061992061267210589.6943MMICRO -3761GARD HENRI 11968101989071993091723313654.6543MSANS -6649GUILLAUMET LAURENCE 21968 71994021992011202810240.3543CSANS -2548LYCEE ALAIN 11968 51993121994011202810240.1743CSANS -0307ABBAYE ANNICK 21968 919920919910911389 9850.7443MSANS -0524PEYRILLES YOLANDE 21969 119940719930411389 9852.5943MSANS -3086FABRE JEAN YVES 11969 71989121994041249910473.2443MSANS -2273BREUIL SERGE 11970 719891119920811302 9774.3843MALLEM -5532NIRVANA FRANCIS 11970 419920219920810876 9502.1443MTECHN -0282TOURISSE BERNARD 11970 41994081993081360611211.4743CANGL -8554BOUVIER OLIVIER 11970 81993061992061267210590.5443CANGL -3126PONTAROUX JOCELYNE 21970 619930619930411389 9851.1943MSANS -0208ENCLOS DIDIER 11970 219941019950110363 9233.5443CSANS -5629VENEUX JEAN 11970 319930919920911389 9851.7443CINFOR -9569CASCADES MARYVONNE 21970 91991101990101202810239.7843CSANS -4663DAUBERIE DOMINIQUE 21970 919941019930411389 9851.1543MSANS -3912FOURNAS MARIE 21970 119930819920711389 9850.8343CTECHN -2317CALDANA ODILE 219711019940519920111389 9850.7943MANGL -4841MARIDOR CLAUDIA 21971 4198907199101 8656 8146.1643.SANS -3038FERRARI FRANCOISE 21971 2199206199106 7803 7681.2543.ANGL -3547KERA MICHEL 11971101994101993101360611209.9243CSANS -8801ORRES JEAN JACQUES 11972 91994061993061420611638.1043CINFOR -8995CRUCITA PHILIPPE 11972 11993041994011249910472.5743CINFOR -1636NORVIL BERNARD 119721119930919920911389 9850.9243CSANS -7758AURES JACK 11972 5199309199209 9597 8728.6443CSANS -9063SATIE OLIVIER 11972111994061993061420611639.0643CSANS -9116BREVIAIRES LAURENCE 21972 119930419920411389 9852.3343CINFOR -3743SORALY ALAIN 11972 4199407199307 9126 8455.8443CANGL -9641ASTARAC CATHERINE MONIQUE 219721019940619920111389 9851.6943CALLEM -1350RAMBUTEAU RENEE 21972 61993091992091360611209.6543CSANS -0615ROBERT REMI 11973 51994011993071267210589.9343CTECHN -2872KERPETIT ALAIN 11973121994041993041420611637.8043CSANS -9594BENEDICTINES JACQUES 119731219931119921111389 9851.1543LSANS -5147TERRESROUGES DIDIER 119731119930319930311389 9852.2443CSANS -3464CASTERAN EVELYNE 21973 519950219940210668 9426.1843MSANS -1330INFERIEUR CHRISTIAN 1197411199607199507 7803 7680.0543CSANS -0129DEGANNE WILLIAM 11974 91994071993071206910241.9743CMARKT -9626STENDHAL CLAUDE 11974 51994081994121202810240.0543CSANS -8520COUPERIN JEAN 119741119940519930510668 9425.5843CSANS -7404PERGOLESE RICHARD 11974 31994051993041360611211.5143CANGL -2352ECLUSE BEATRICE 2197411199608199508 7803 7680.6243CCOMPT -6779PERRONET PASCAL 11974 91994061993061360611210.9143CANGL -9456REVOIRS MARC 1197512199507199407 7803 7680.9943CINFOR -9467CONCORDE CLAUDE 11975 919941019931010668 9427.4443CSANS -7348GENOUILLY FREDERIQUE 21975 7199407199307 7803 7680.4443CANGL -8390CEILA DOMINIQUE 11975 9199409199309 9894 8922.7243CSANS -3308BOULANGER RENE 11975 6199410199310 9894 8922.0043CALLEM -8061DENFERT VALERIE FRANCOISE 21975 11995041994041206910241.1243MSANS -9867ROCHOPT MARIE PIERRE 21976 8199609199509 7803 7680.2343CCOMPT -0466MIMOSAS CHRISTIAN 11976 1199408199308 7803 7679.3143CSANS -6069BATIGNOLLES MARTINE 2197710199608199508 7803 7679.2843CSANS -7049CRENON DANIEL 11947 81973041994011621213032.3044MSANS -1304PERI VERONIQUE 2194912199310199210 9597 8729.0944MSANS -3258DARMONT VERONIQUE 21961 21986061992021168610047.0344MSANS -1840COQUART LUCILE 21964 41984101993051381911365.0544MANGL -2897PERCHE ALAIN 11967101990061995011318010939.1344LSANS -6181BIZET MIYUKI 21968 2199302199202 9597 8727.9944MSANS -6750EDGAR HERVE 11971 21992011991011202810240.5844LSANS -0175MARQUIS COLETTE 21974 5199606199506 7803 7680.2744CSANS -1275FRIGOULET YVES 1197410199506199406 9894 8921.6944CSANS -8305BEZENAC FRANCOISE 21953 2199404199304 9126 8455.7045MSANS -4858DUPLEIX MARC RENE 11954111978121982102470018541.8845MANGL -6314ABERDEN EVELYNE 21958 61979111978111684813423.0845MSANS -0464PETIGNONS DOMINIQUE 11961 91984061993031527112374.9745MSANS -3847GUICHARD PHILIPPE 11961 11983081988112090215980.9745MTECHN -8173HOPITAL ANSENIA 21964 319950419940110668 9425.3645MSANS -4339VILLE DOMINIQUE 11971 91994111993111267210589.1245CSANS -1142SPITALIERI FREDERIC 11933111953121993014121428007.2246MALLEM -6086SOEUR JEAN JACQUES 11935 91955061991053417325097.9646MSANS -0246OREE PATRICK 11937 71965101986012470018541.1946MANGL -7398MOUNET CLAUDE 11937 919960119950510024 8999.3946MSANS -2438VISITATION CLAUDE 11938 31964111986012470018542.2446MSANS -3413ETIENNE JEAN MARIE 11940121969051986072470018541.1146MSANS -9044GUEN PAUL 11941 11973051993011518612335.2846MINFOR -4544MONEGLIA ABDELKAD 11941121965101989072947921838.8046MINFOR -5661BELLON PHILIPPE 11943 91965111994013200223584.4346MSANS -4296VENDARGUES YVES 11943 31964111991012273717260.1446MSANS -2281TRIMARAN OLIVIER 11944 81973051990011403411521.4646MINFOR -9015IRIS YVES 11945121973011990011403411522.1346MESP -7856BELLEVILLE GERARD 11946 31965101986012470018540.2946MSANS -9041SADI PIERRE 11946 61977121995062000715437.9146CINFOR -2976BLANQUI GIANCARLO 11946 51968091986072273717261.9446DSANS -4370GROUPE PHILIPPE 11947 21974071990011403411522.0946MTECHN -7697SEYSSINS BERNARD 11948 51968071991012470018541.8646MALLEM -9305SEINE GUY 11949 91970041987012273717259.9046MANGL -5926BOILEAU BERNARD 11951 61972051989012273717261.9046MALLEM -3592PETIT GILLES 11951101974011995032547019085.7046MANGL -7590PLAYA JEAN YVES 11954101977091982102470018541.4746MSANS -8144DARIE JEAN PIERRE 11954 21995011994011420611638.9246MSANS -8637GUILDFORD PHILIPPE 11955 21974061995082547019085.8646MINFOR -7809CEYRESTE FRANCIS 11955 31975021993081608112916.2546MSANS -9226MONDONVILLE MICHEL 11956 51979011992011471512025.1146MTECHN -8675BLANCHISSEURS ANNIE 21958 11979071993041471512024.3346MSANS -0338BARBUSSE ROSELYNE 21958 1198902199209 9597 8729.2546MSANS -4849SANZILLON MARIE NOELLE 21958 81979101978101288210743.8346MSANS -7791PRA BRIGITTE 21958 81981041980041684813422.0846MSANS -3255LENOTRE BERTRAND MARIE 11959 81980111991012022115555.6246MESP -3148EOLIENNE GUILLAUME 11959 11983031991011868714507.9446MSANS -1942CAUSSES MICHEL 11960121987081991061288210745.4746MSANS -8983RAYMOND JEAN LOUIS 11961 11985031991011868714506.7246MSANS -5296BRETAGNE PHILIPPE 11961 41983081991011868714507.7246MSANS -0323QUONIAM GILLES 11961121983051993091450311831.5746MSANS -3231MOULIN HUGUES MARIE 11961111985091995011373711328.2246CSANS -9926PIN PATRICIA 21962 41984051983051288210745.7546MSANS -0400HARAS PHILIPPE 1196312199407199411 9597 8728.1746MANGL -8313ROUILLAC BERNARD 11964 31991021991022529918968.4746MSANS -1947CORNEILLE DOMINIQUE 11965111987021994091693613499.4346MANGL -1364KERSAUX JACQUES 11965 41987091986092090215981.4746CANGL -4571CAILLOU ERIC 11965 91985041992071616712995.9946CSANS -5043BAC MONIQUE 21965 61988081987081539912452.4646CSANS -5037CALLE PHILIPPE ROGER 11966 81994091993091839014312.4546LSANS -3072PONTHION ALAIN 11966 21990091989091467711987.1346MANGL -3441ARMAINVILLIERS YANNICK 11966 11987021994091693613498.8546MANGL -2298PLESSIER ANNE MARIE 21967 2199004199111 8656 8146.6146.ANGL -3281ALBAN ELIANE 21967 21986111992011288210744.0846MSANS -1984ROCH GERARD 11968111992031992041467711986.7246MSANS -6981TROQUEREAU JEAN JACQUES 11968 91992081991081467711986.2646MALLEM -4384LAMORLAYE MICHELE 21968 31993121992011202810240.1746MSANS -4391JUGE BERTRAND 11969101992091993072397418036.9346MSANS -4122CAULAINCOURT YVES 11969101988081987081539912452.1646MINFOR -5356LACAPELLE ALAIN 119691119930419920411389 9852.0246MTECHN -8278CHANTEMERLE GERARD 11969 919920619940710876 9503.4546MSANS -2596DESSUS GUILLAUME 11969 11991091990091467711986.4946MSANS -7596MEYERBEER EDOUARD 11970 11992111992111330611018.1046CMARKT -5724HOCQUETTES AUDE 21971 31991071990071467711986.3146MSANS -1372AUBEPINS CHRISTIAN 11971 21994101993101360611209.8846MALLEM -8783BAUDOIN JEAN FRANCOIS 11971121993081994011202810240.4146CSANS -3416MIREFLEURS NORIKO 21972121994021993021360611211.5646MCOMPT -0948TIERRAINE MARC CAMILLE 11972 319930719920711389 9851.5946MTECHN -0904FOUGERES JEAN MARIE 11972 919920119920311389 9850.8946CTECHN -4010QUARTRAVEL CATHERINE 2197211199501199401 9894 8921.7246MSANS -1528FARMINGTON RENEE 21973 119940419940111389 9851.0346MSANS -8402TREZEE GILLES 11973 919930719920711389 9850.8846CSANS -7279CORNE GUY 11973 71994011993011360611210.3746CSANS -0232PIN JEAN CLAUDE 11973 519960619940110668 9425.4546CTECHN -9635MAGALI CHRISTIAN 11974 4199607199507 8656 8147.2246CALLEM -7035ANGLAS LUCIENNE 21932 21963011988102273717260.1448VSANS -7818HERZOG DOMINIQUE 21937121972101993041557012567.0848DSANS -6478MAREYE JEAN PHILIPPE 11940 21959101983102273717260.8048MSANS -1661VAN EDITH 21940 81974091990012137316330.9748MSANS -1597MATRAT CATHERINE 21940 61967071992121834514275.5948MTECHN -1046MAUNY JEAN CHRISTOPHE 11941 81979021994011471512025.4748MSANS -8249FILLES MICHEL 11942 51962081993093417325097.1948MSANS -0711PICCINI JEAN JACQUES 11943 81963041995072470018542.0048MSANS -0378HALLIERS JEAN PHILIPPE 11943 3199501199401 9597 8729.3648CALLEM -9597VOLTE MARIE THERESE 21946 71968041990012273717260.9448MCOMPT -4768PICAUD BRIGITTE 21947101973101995102043315670.9248DSANS -0554ROLAND ANNE 219471019920719910710024 8998.7748DSANS -3349SERRE PIERRE MARC 11948 61969021991012470018542.1048MALLEM -3355KURFURSTEN PAULE MARIE ODILE 21948 7199501199301 8656 8145.6648MSANS -6449IRUENA DOMINIQUE 11949 71969031990051932314934.2748MESP -3922LAVERSINE YVES 11949 81975101986103634926571.4148CSANS -7286JOUVENET HENRI 11951121981021994011621213032.6548MANGL -2199CABOTS CHRISTIAN 11953121988121995011373711326.7148MINFOR -8300CHARPENTIER CHANTAL 21955 61992011993041249910472.4148MSANS -2397FAMILIAL JANY 11955 61982101994041471512024.3348MANGL -9021BIED CLAUDE 11957 51980061992111911114779.6848MSANS -4703COZ JEAN 11957 41979081993121911114779.7748MSANS -3297STALINGRAD BERTRAND 11959 31981081992102090215980.9748MANGL -2319FRANCOEUR HENRI FELIX 11959 11980081993121804514081.0148MSANS -8833MONTLHERY ELIANE 21960111983041989041527112373.6848MANGL -1084MAGNARD JEAN PIERRE 11960 91984021992012022115556.0248MSANS -4562HAUTE ANNIE 21961 61984061983061249910472.8748MTECHN -4907FRANC BERTRAND 11964 21984081986072090215980.5648CSANS -2492ETANG PASCAL VINCENT 11968121990111989111467711986.6248MANGL -3754RAOUL FRANCOISE 21968 91994031993091450311831.8448MTECHN -7902CELARD BERNARD 11969 31990041989041467711987.9048MANGL -0316FLORENTIN TYRONE 11969111989081989021450311832.4148MANGL -1981DEPARTEMENTALE PIERRE 11970111993041992041420611639.0148CSANS -4735BEL SKEVOS 11970 61991021994011249910473.5448MSANS -0999CONNE DENIS 11971101993041992041420611638.8848CSANS -3832BEACH SERGE 11973 41994121994011202810241.1248MTECHN -4697PURPAN FRANCK 11935 51976041994011578112723.1550MTECHN -1565NEMOURS ANDRE BERTIN 11939101967071990091932314934.3150MANGL -8977MAHATMA HERVE 11942 41981051994011621213032.0650MANGL -8738ZILINA JEAN LOUIS 11942101980061990031249910473.4750MTECHN -6415ECUREUILS ERIC WILLIAM 11942 61969081994011932314934.7050MSANS -9332FRIRION GEORGES 11945 5199409199309 9597 8729.4950MSANS -5001YVES PHILIPPE 11945 41975111988071578112722.8750MSANS -2290ENSOLEIADO JEAN MICHEL 11946 21988051994011288210745.5250MSANS -8492LAGRIVE LAURENT 11947 81982011993011369311287.2950MANGL -3609GUESDE ERIC 11949 11989061992031249910472.1950MSANS -8482TOUT ANDRE 11949 71980041995011621213034.2250MANGL -8866PERCENEIGE PASCAL 11950 41976071995011578112723.7450MSANS -3195VIVE CLAUDE 11950 21981081995011621213032.2050MSANS -2538AICARD SABINE 21954121976061993031608112915.5150MTECHN -5185LUTHEZIEU PATRICK 11955 51988021994011288210744.2650MANGL -3135EDER DIDIER 11957 819880119930310791 9502.9150MTECHN -9006MAURETTES JACQUES 11958 11985041993011369311286.6950MINFOR -8049COLLIERES CHANTAL 21961 11984031983031288210745.2250MTECHN -8766TERROIR GILLES 11963101987121989091450311832.4150CALLEM -2924LAC BRUNO 11963121989051988052090215981.1450MSANS -5549DUMONT MICHEL 11964 51988051991081450311832.4250MALLEM -8382MONSEIGNEUR CHRISTIAN 11964111992011994011249910471.8950MSANS -8129STATION BRUNO 11966 41994051993051202810239.8750MANGL -3420EMERIAU JOSE 1196711199306199206 9597 8729.8450MANGL -9831CLAMOUR YVES 11967 819950919940910668 9427.4950MANGL -9072MENDON GUY 11968 1199605199505 8656 8146.8850MSANS -4669FAURE ERIC 11968 3199505199405 9126 8455.8850CTECHN -4319MOURISCOT PATRICK 11970 9199306199206 9597 8729.2750LSANS -1731FRANKLIN MICHEL 11970 4199401199301 9597 8729.4050CSANS -0510PILOT DANIEL 11972 519961219951211389 9851.5250CSANS -5973LECLERC MAURICE 11974 3199606199506 8656 8146.3750CSANS -9358MONBEL HENRI 11933 91959031993011557012567.1251MVENTE -7641BRETONNE CHANTAL 21936 51962081990012273717260.9451CSANS -7048CASTELNAU LAURENCE 21937 91962031991042273717259.7851CMICRO -5481PASCAL GILLES EMILE 11937101958051979013327724476.1651MSANS -6723SARRAZA FRANCOIS 11938 21962031989082572519240.3551MSANS -6355REPOS JEAN MARC 11938 41960011980013327724476.5251MSANS -1644ACARDIE BEATE 21939 31963091991072273717260.2251CTECHN -5030LOGELBACH ASTRIDE 21940 11962031991042137316332.4551MVENTE -5298GARDE MARIE FRANCE 21940 91969011989011621213034.1951MALLEM -6400SIONIE CATHERINE 21941 3196206196106 4894 6128.0051MTECHN -5537CAPEOU LUCE 21942 519931219920110024 8999.7951DINFOR -7143DEO NOBUKO 21942 41969091991102137316331.9751MSANS -9555CAMBRONNE DANIELE 21943111962051984122572519240.2851CSANS -3792EAUX JEAN 11944 81966031995072137316330.9751MSANS -6932PAULIN ISABELLE 21945 41972041989011621213033.2851MALLEM -1308CHRISTOL MARTINE 21945111968121993061834514274.8451MSANS -2877DANIELLE GERARD 11946111970051992011471512025.1151MSANS -5367ILE FRANCOISE 2194712199010198910 8656 8146.1451.SANS -3253VERG BIRGIT AGNES 21948101969071985042470018540.3951DANGL -5806FRED CATHERINE 21948 41968041990042572519239.8251MANGL -6174BANQUIER CATHERINE 21950111971061989011621213033.7051MSANS -8732FOUNSUT PIERRE ANDRE 11950 11978071995041249910472.1051MCOMPT -4803ALASSEUR AGNES 21950 71974051992091471512026.1051MSANS -9024CHATARDS CAROLINE SOPHIE 21951 31972081987052334017609.4651MALLEM -1259SOUFFLOT FRANCOISE 21952 81981011983091326611017.2551CSANS -7009PARADIS LUDWIKA 21952 71974011973011215710279.1951MSANS -9186LESPIAT EVELYNE 21952111973041990101578112722.1551MSANS -6834FLEMING JOCELYNE 21953 41973021993012017815517.2851MMARKT -5164BEAUVILLAGE COLETTE 21953 91986081985081684813421.4051MSANS -4947ESCALUS CHANTAL 21954 219810519800510024 8998.4151MSANS -8461MARGUERITES CATHERINE 21955111976061994051471512025.0151DSANS -5391FOURCAULT ANITA 21956 61978061992091471512024.4451MSANS -2777ALMUNECAR CHRISTINE 21958 41993071992011249910471.6251MINFOR -9747DROPT MONIQUE 21958 31979031993041471512024.0851MANGL -2758CRAYS KIM LEE TAMARA 21959 11992031991011202810240.1951MSANS -8238SERGENT ISABELLE 21959111983061982061326611016.0351CSANS -4402DIVISION SABINE 21959 71979101993071471512025.1651MALLEM -1231FACE HUBERT 11959 319950319940111389 9852.6751LTECHN -3907ESBLY GUNDA 21960 81980071979071288210745.3451MANGL -4821TAMEYE MERCEDES 21960 119820919810910668 9426.6651MANGL -1175CRESY CHRISTIANE 21961 21990111989111249910471.6651SSANS -6825FEUILLES DENISE 21961 51982051981051326611016.0651MANGL -5368FLANDRE SUZANNE 21962 71983111982111249910472.3351MANGL -0947LORRAINS CHRISTINE 21962101985041984041288210745.1651MALLEM -5318CLAMART ANNE 21962 51982081981081326611018.0051MSANS -8693FILLIETTE JEANNINE 21962 31982091981091194310201.7051MANGL -5069GRAVELLE ILSE BERTI 21962 81992061991011202810241.9051CSANS -5908VERTS CATHERINE MARIE 21962121984111983111608112915.9651MSANS -3068DUNKERQUE ELIANE 21962 31986101985101202810240.4051MSANS -5894CARESTIER MARYSE 21963 41985091984091288210745.1351MALLEM -1739HILARION LAURENCE 21963 61982091981091497412179.3651MSANS -8326MASSAY MARTINE 21963 41984091983091608112915.6951CANGL -6923GUYONNE NATHALIE 21963 81983101982101608112915.7551CVENTE -3533SAVIGNAC SERGE 11963 319890319880310407 9271.2351MSANS -9590GARIBALDI FLORENCE 21963 519940619920111389 9852.0051CANGL -5287HORIZONS MARIE ODILE 21963 21983021982021249910471.5651MSANS -9152PARRERE PHILIPPE ANDRE 11963 61992021991021381911366.2151CSANS -4730CROISETTE MARC 11963 61987111992012529918968.2051MANGL -7896LONGUE MARTINE 21964 91986041985041288210745.7251MSANS -0156CHTANOU YVES 11964 71993011992011839014314.0851MANGL -3013CELLIER REGINE SYLVIANE 21964 719870619860610668 9426.4151MANGL -1040HAUTI MARTINE 21964 11984101983101288210745.3951MINFOR -0730COURBET CHRISTINE 21964101984101983101202810241.7051MSANS -2393ROTONDE ELISABETH 21964 71984071983071202810241.8451MANGL -6940LELIEVRE RYOKO 21964 21985051984051527112373.2351CSANS -5571MARCEAUX ANDREE 21965 31993091992011202810240.2251MSANS -9937MANDARINE GHISLAINE 21965 11994031992011202810240.9151MANGL -6185HERMITTE FRANCOIS 11965 91990051989051949415051.5051CSANS -5405ARTZAMENDI MICHELE 21965 71989081988111949415050.6751MANGL -4260MIROMESNIL MARTINE 21965 71988031987031450311830.5351CSANS -9396BARBUSSE MICHELLE 21966 91986061993011839014313.0951MSANS -8592PLANTIERS MARTINE 21966 71994031993031267210589.5751CSANS -6905HAVRE PATRICK 11967 61988111987112090215981.2251MSANS -0499BEAUMARCHES JEAN PIERRE 11967111990021994051839014313.9551MSANS -9812PECHERIE FLORENCE 21967 219940419920111389 9852.2251CESP -6177RIQUET JANINE 21968 51994031993031267210589.6651CTECHN -1459FRANCE ANNE MARIE 21968 21988091993011381911366.4951CTECHN -9340EPINE RENAUD 11969 11994081993081206910239.8651MSANS -7293OBERKAMPF JEAN JACQUES 11969 81989041993041249910471.7051CCOMPT -0852GUERARD MARIE SOPHIE 2196911199308199208 9894 8923.1651MESP -8275DELZONS MICHELE 219691119930319920311389 9852.7251CALLEM -5873MARCHE MARIE LAURENCE CHRIS2197011199205199105 9597 8729.3051MSANS -8465BERNASSE ISABELLE 219701119920319910311389 9852.6551MANGL -2444BOUGNON MARIE JEANNE 21970 81993111992111267210590.7451CSANS -3440BAZOCHES MICHELE 21970111993101995041206910240.4151MSANS -2864GOAS SERGE 11970 51992101993081267210590.4151CESP -5499CLOHARS GERARD 11970 819900819890810024 8998.8451CSANS -6120MARVIVO EVELYNE 21971 519950219940210668 9426.5351MSANS -5419BEZANLEU CATHERINE 21971 51994031993031267210590.2951MTECHN -0309TUILERIE SOPHIE 21971 21994051993051267210590.6951CSANS -6131CAGNES NICOLE 21971 519940619930610668 9426.5351CCOMPT -8518VILLOUE JOELLE 21971 61992041993051267210590.0951CSANS -8453JONCHERE DOMINIQUE 11971 319940619920110024 8998.7651MSANS -5604NEUILLY AGNES 21972 119920419910410668 9425.8151MSANS -7047ALOUETTES MARIE ANDREE 21972 419920119910111389 9850.9451CSANS -5306BOPENIAN MONIQUE 219721019920919910911389 9851.9151MSANS -9169FLEURIS LILIANE 21972 71993121992121267210588.9251CANGL -8308BUZENVAL VERONIQUE THERESE 21972 5199607199507 7803 7679.4151CALLEM -1210NAUGAIRE MARIE ANTOINETTE 21973 61993081993091267210589.5252MSANS -5105HUGO CATHERINE 2197311199607199507 9894 8921.4651CANGL -3726LIVRYS BRIGITTE 21973121995071995051288210745.4751CSANS -5859MUZY PASCALE 21973 619930719920711389 9850.6151CVENTE -1436SAUVE DOMINIQUE 21973 61994101994121206910241.1351MSANS -2239CHALIGNY KYOKO 21973 31994091993091206910239.8651CSANS -0183LAURIERS PAULE 21974 81995111994121206910241.2551CSANS -9366PINET LAURENCE 21974 819940819930810668 9425.3651MESP -6833VIGNY EVELYNE 21974 51994081995121206910239.9952CVENTE -1571SEINE GUY 11974 3199609199509 7803 7680.8951CANGL -8078LAMARCK JOSIANE 21974 3199602199502 9894 8922.4151CTECHN -0018LOUVERSEY CATHERINE GINETTE 2197510199611199511 9894 8922.1451CSANS -7419VEROCE MICHELLE 21975 3199406199306 7803 7680.1451CSANS -8512ASSOMPTION CHRISTIANE 21975 3199608199508 7803 7680.5951CVENTE -6365EDENFLORE BRIGITTE 21975 1199308199208 7803 7681.4251.ALLEM -2274LOTUS ISABELLE 21975 7199612199512 9894 8923.1351CSANS -5674MAUBLANC NICOLE 21975 9199602199502 9894 8922.8051CSANS -0762GIORDAN ANNE MARIE 21975 1199607199507 9894 8921.3151MINFOR -0696PICAUD JEANNINE 21976 2199607199507 7464 7525.7451CSANS -6681MARCEL FRANCOISE 21976 3199608199508 7803 7680.6251CSANS -0740CHESNAIE PHILIPPE 11977 1199507199407 7803 7681.2551CINFOR -4654CANNES FRANCIS 11977 3199609199509 7803 7679.5851CANGL -7430MULLERON FRANCOIS 11978 5199607199507 7803 7680.8451CSANS -3935LISSAND ISABELLE 21978 4199607199507 7803 7680.6351CSANS -5586SCHUMAN NANCIE 21931111974111991071578112723.0552VSANS -1401RENAUDOT MARYSE 21933 51968071990071621213033.8152MSANS -1061AMBOISE DENIS 11934 11964041993011663613344.2752MSANS -9799GUILLEMETTE JEAN CLAUDE 11935 31955021991082470018540.7552MSANS -3145SABLES PHILIPPE 11936 11959021993073417325098.3651MANGL -3589FOURMONT PASCAL 11936 71959031982063327724477.0651MSANS -2996PAUL MARIE PIERRE 21936 51972121989011621213033.9152MSANS -2578PISY YVES 11938 71962111981102470018542.2252MSANS -1257LAMARK PATRICK 11939 71963121992052470018541.5052MINFOR -6677BRETHENCOURT NOEL 11939 21972111991011578112722.7052MSANS -9734FIGOURNAS DENIS 11940111971041989101932314934.7252MANGL -6502POMMERY ROBERT 11941 81963121993011663613344.0552MSANS -2718CHENES HAFID 11941 11964081994011557012567.3952MSANS -4104LANCY LIONEL 11942121988011995013587826261.1652.SANS -8284MERY PAUL EMILE 11942 61968021994012137316331.8752MCOMPT -3992BOUTICOURT EUGENIO GIOVANNI 11943 51964071987042273717261.8452MALLEM -9819LATTRE GUY 11945 31974071992071369311286.1252MESP -1150CAILLOUX JOSIANE 21945 11965021985042470018541.4752CANGL -6760HAUTINS BRIGITTE 21945 719781219900711131 9659.0652MSANS -2900FOS BERNARD GUY 11946 91974051993091168610046.6952CINFOR -3096CASTELLAR JACQUES 11946 71972041991112137316331.0352MINFOR -3983FLEURIE ISABELLE 11948111973111994011663613343.3052MANGL -9627CITROEN SILVIE 21948 31970041991012990722150.2852CALLEM -2626BUFFON BRUNO PIERRE 11948 51974051993011621213032.8352MANGL -1995GRENELLE PASCAL 11949 81975041991071578112721.7152MSANS -6675EMAN BERNARD 11950 71973081991012739020403.1152VSANS -1203JACOB JEAN PIERRE 11950 619790819780811389 9852.0052MSANS -1502COUBERTIN MICHEL 11951121979031992121608112916.4752MCOMPT -9762APPOLINAIRE JEAN CLAUDE 11951 51971101992112175716600.9252MANGL -6014MAURICE JOEL 11952 419910319900310024 8999.7952CSANS -8272BESANCON CHRISTIANE 21953 2199304199204 9597 8728.9452SSANS -4121VOLTAIRE PHILIPPE 11953 51972071995122043315671.2452CALLEM -3385CARNOT HENERE 11953121978061993051864214469.1452MANGL -9459SAUVETERRE OLIVIER MICHEL LOUIS11954101982061990011608112916.2352MANGL -0260MOURILLON JOELLE 21955 21984011992011249910473.0952MSANS -6808ROBERT PIERRE 11956 61979061992021471512025.3752DVENTE -1754CITADELLE PHILIPPE 119561019830619910311131 9658.9152MANGL -3114PINCES FREDERIC 11956 61976031988011684813422.5952CSANS -2401PAPE MARIE ANNE 21956 31978061992121471512025.9552MSANS -3724AGNOS ERIC 11956 71976041993111578112721.7052CSANS -1438KERLIBOUZEC EVELYNE 21956 71981111980111527112373.3252MINFOR -8247VERSAILLES LAURENT 11956 61980081995091249910472.5552MSANS -0939FLAMBERTINS ALAIN 11957 819950619920110024 8999.0752CSANS -5765FOCH ROBERT 11957 11981031993031608112916.3252MALLEM -9301GARDETTES DOMINIQUE 21957 1199505199405 9126 8456.6952MSANS -8571TIRE ROBERT 11958 11984051992041326611017.9752MSANS -7487THORNTON JEAN LOUIS 11958 31981041994051804514081.0752MANGL -3406AVEL PAULE 21958 419780619770611515 9930.5352MSANS -0124DESPORTES STEPHANE 11959 21979021995091471512025.7252MSANS -6928ASSIER PIERRETTE 21959111993101992011202810241.1352CTECHN -0989FEROLLES WILLIAM 11959 81983041982041326611016.3052MSANS -9802ORGE JEAN CLAUDE 11959 11980081987112256617145.8752MSANS -8376FOUQUE ERIC 11959 2198801198502 8656 8145.6552.SANS -8925COURBET YVES 11960 71987031989112090215980.8752MALLEM -3897ANDELU ALAIN 11960 81991011994011249910471.7452DSANS -3323BOSQUETS CLAUDE 11960 41983031995121433211715.6952CANGL -7089COULOUBRIER DENIS 11960 7199303199203 9126 8455.6552CVENTE -3026AGUILLON LUC 11961 2199601199501 8656 8145.6652MANGL -9585EGLISE ANDRE ROGER 11961101988111993092401918076.1152MSANS -0634MAINE JOSEPH 11961111986011992121288210745.7052CSANS -7284FORTES ANDREE 21961 51991111990111949415051.2152MSANS -3518VIELLE GEORGES 11961101988091992121249910473.6752MSANS -3969FERIGOULAS SYLVIE 21962 71983011982011288210743.9052MALLEM -1749ARCADIA PASCAL 1196210199305199209 9597 8727.8352CANGL -5023PAVIS YVON 11962 4199512199501 9126 8455.5352MALLEM -6853PLAGNE ROBERT 11962 819840619830611131 9657.1252CINFOR -0421HARAVILLIERS MAX 11962 819850819840810791 9502.9852CINFOR -8436PLEIN ROGER 11962 51984081989112090215981.3652CESP -2433SARTRE SERGE 119621219850719920910791 9502.6652CSANS -4413WALDTEUFEL FRANCINE 21962121982051988051608112916.0252MANGL -2214MONTEZE FRANCOISE 21962 3199302199202 9597 8728.3752MALLEM -0233COMMUNE ANNE 21963 2199312199212 9085 8419.4452STECHN -0441SOLARIUM ELISABETH MARIE PIER21963 21993071992011202810240.9952MTECHN -4510LETELLIER HUBERT 11963 31986111986031527112374.5852CSANS -1778EVEQUE BERNARD 11963 51986111992011949415051.3952MSANS -1339SEGUR SERGE 11963 91985091992121527112374.1252MTECHN -4092HEURSAULT AGNES 21963 51982031981031326611016.7552MSANS -9379GOJA MARIE THERESE 21963 71983041982041288210744.2652MINFOR -1533BODIN ISABELLE 21963 419831219821210024 8998.9152MSANS -9862FOSSE BETTINA 21963 91990111989111949415051.9552MSANS -6255VIGNE NICOLE 21963101984111983111608112916.9152MSANS -6101VAUGRENIER CATHERINE 21963101984051989041527112374.9452MINFOR -8653SEQUOIA HENRI 11964 51988031994011249910473.2052MSANS -9919BILY PATRICK GUY 11964 91985091992091949415050.6352MSANS -7059VALLEROY BEATRIX 21964 2199204199104 9597 8729.0752MSANS -5440PORS ANNE MARIE 21965 21986061985061527112373.1752MSANS -2587VICOMTE PATRICIA 21965 11991111992011202810239.8652CESP -9598SULLY CHRISTIAN 11965 91994051992011202810240.1452MANGL -0899MANU JEAN PAUL 11965 519880519870510407 9270.2952MTECHN -0493POET JEAN PAUL 11965 119891219881210407 9270.5652MINFOR -7853LILAS JEAN CLAUDE 11966 31986051985051288210744.5052MANGL -4637LONGCHAMP CATHERINE 21966 91988051993091839014313.0952MSANS -5141LINDFIELD GERARD 119661119870119860110407 9272.2452MANGL -3945PESSOT VERONIQUE 21966 119910719900710024 8998.8952MINFOR -6408PUJOLS CHRISTINE 21966 71987061986061249910473.0952MSANS -5883AUREA JEAN 11966101988061991011249910471.9452CESP -6385CHAILLY LAURENCE 21967 419910719900710024 8998.4152MANGL -8609CEINTURE ANNE MARIE 21967 21991121995071202810240.1452MANGL -1367NOIRES ANNIE 21967 61991101990101330611017.1952MSANS -6827NOISY FRANCIS 11967101988011987011450311831.9752CESP -3823RESISTANCE CHRISTIAN HENRI 119671119890319880610407 9270.8452MSANS -5716CYRAN PATRICK 11967 11987071994111450311832.6852MANGL -2307ARBELLARA NADINE 21967 61988091990111839014313.9352CSANS -0224VEBRET VIRGINIE 21967 9199406199305 9126 8456.1652CANGL -3639BERGERON CHRISTINE 21967 619951219940110668 9426.1852DSANS -5292CREGY MAURICE 11967 719940819930411389 9852.4952MANGL -8369BRENS COLETTE 21968 81991101990101330611017.4152CANGL -2447REBEYROLIE ANNIE 21968 619900319900911389 9851.0352MALLEM -0478MES CHRISTINE 21968 4199309199209 9597 8728.7152CSANS -2875CLION MARIE FRANCE 21968 319930519920511389 9852.4552CSANS -8148CROS FRANCOIS 11968 41988111987111249910472.7352MSANS -9990VERCINGETORIX CHRISTINE 21968 119950419930411389 9851.2852MSANS -2796BLONC JEAN PIERRE 11968 4199301199511 9597 8727.8152MSANS -9996GUIS LUCIEN 119681219931119920110024 8998.5352CSANS -7769NERVAL MICHELE 21968 41990051994011330611017.8352CSANS -6262RACINE ALAIN 11969 719890419880410407 9271.9552CSANS -9102SAUGES BENOIT 11969 11989071993081381911364.8152MSANS -4448NARON PASCAL LOUIS 11969 2199605199505 8656 8145.6952LSANS -3197CHAUMES GUY 11969 819930619920610024 8998.9452MSANS -2201LUYNES SOPHIE JOELLE 21969 5199311199211 9597 8728.2352CANGL -3000PLAINES JEAN MARC 1196910199204199312 7677 7604.9052CINFOR -7547BREGUIERES THERESE 21969 719920419910411389 9851.3352MANGL -9804CADOT MARIE JOSE 21969 81991101990101330611018.2252MSANS -5321JAUNAC SOPHIE 219691019910719900710024 8998.5852MSANS -3824LAVISSE DANIELLE 2196912199405199305 8359 7952.9252CSANS -6505LOUISE PIERRE 11969 419910119900110024 8999.8152CSANS -9873BOULOURI JEAN MICHEL 11969 71990021992091202810241.3652MSANS -9771BREUILHSUD THIERRY 11969 419910719900710024 8997.9652CCOMPT -8931ELVARD CLAUDE 11970 81994031993032107316096.9852MANGL -2755GEROME MAURICE 11970 8199311199212 9597 8728.9552MTECHN -8557CYRNOS BERNARD 11970 5199404199201 9597 8729.9052MSANS -3651COCTEAU GABRIEL 11970 41994011993011267210588.5352CSANS -4459VITALIS ALAIN 1197010199612199512 9894 8921.9152LSANS -9388COURTENAY JEAN JACQUES 11970 91990031995071202810241.1252MVENTE -1310CAILLADE ADRIEN 11970101996111995111616712994.7752CALLEM -5461GOMETZ CHRISTIANE 21970 61994071993071407611559.6252CSANS -0669MAUVALAT DANIELE 21970 6199209199109 9597 8728.7652MSANS -0103TAILLEFER MICHELINE 2197010199608199508 7803 7680.0552CSANS -5577MOUGINS CHANTAL 21970 619940919930411389 9852.6952CSANS -0340LAMBESC MARIE CHRISTINE 21970 3199607199507 7803 7680.6252CSANS -1328PIERRE PATRICE PAUL 1197111199106199006 8656 8145.0352.SANS -3172DENOUVAL DANIEL 11971 419940319920110024 8999.1652MSANS -9639ESPAON MARC 11971 7199407199307 9597 8727.7852CTECHN -6612FONTMERLE JOELLE 21971 919930419920411389 9850.8452CSANS -1855MAILLOL PIERRE 1197110199303199203 9597 8728.0452MSANS -8791RASTINES PHILIP 11971 81993011992011267210589.2852CSANS -2880FLORALIES MARIE THERESE 219711219930919920911389 9852.3352CINFOR -9921SERPENTINE FRANCOISE 21971 419920219910211389 9851.1652CVENTE -6761KING JACQUES 11971 5199606199401 9597 8729.9952CALLEM -8677BREANCON VERONIQUE 21971 919940819930810668 9425.7252MANGL -0030SUVERET PATRICK 1197110199501199304 9597 8728.6652MSANS -4284REGNAULT JEAN MARC 11971 719900619890610024 8999.3652CSANS -3275POMPIDOU DIDIER 11971 6199610199510 8656 8145.3352MSANS -7270BONNEUIL MARC 1197110199107199007 8656 8145.3052.SANS -2988DEREURE BRIGITTE 21971 8199606199506 8656 8145.8752CINFOR -0334GRAVESONN JEAN 119711119911019901010024 8997.7852CANGL -5425PONT FRANCOIS 11971111995041994041267210588.8852CSANS -7132MIDI JEAN PIERRE 11971 5199608199509 8656 8145.4852CANGL -5172BLOMET JEAN PIERRE 11971 81993061992061267210589.5252CSANS -1753QUIETA DOMINIQUE 11971 41991061995101202810241.7652MSANS -8062DOMINO MARC 11971 719910819900810024 8999.4052MSANS -8636ECLUZELLES MICHELE 21971 9199609199509 9894 8921.5952CSANS -5812REPUBLIQUE VERONIQUE 21972 31995101994101206910240.4052CSANS -0712TEYSSIERES MARTINE 21972 6199607199507 7803 7680.8952CSANS -3543DUNETTE LAURENCE 21972 4199608199508 8656 8145.9152MSANS -7967FOUCANCOURT ASTRID 21972 219930619951011389 9850.8852CSANS -6876THERESE MISAKO 21972 719940819930710668 9427.2652MSANS -9406GALLIEN MICHEL 11972 219910719900710024 8997.9052MSANS -7605BAUMES ALEXANDRA 11972 7199501199304 9597 8728.1952MALLEM -1625ARTHUISIERE JACQUES 11972 61995011994011206910240.6652CSANS -6717DOUMER PHILIPPE 1197212199611199401 9597 8728.8052CESP -1677CHABRIER LAURENT JEAN CLAUDE 1197211199504199404 9126 8456.3952CSANS -8299PUY JEAN 119721119931219940111389 9852.6352CANGL -8443COUSTERES MICHEL 11972 2199107199012 8656 8145.4452.SANS -7741NANT FREDERIC 11972 31991061994111202810240.7652MSANS -0657TAUDE FABRICE HENRI 11972 319940219930211389 9851.3752CANGL -9630GOELETTE JEAN LOUIS THIERRY 11972 4199407199307 9597 8728.1352CSANS -1127EXUPERY SIMONE 21972 5199602199502 9894 8921.4152CTECHN -6944LIBERTE CORINNE MARIE 21972 41993071993051267210589.5253CSANS -3755ARNAUD MARIE PIERRE 21972 6199307199207 9597 8729.3052MALLEM -2437CLAUSONNES MARTINE 2197212199411199311 9126 8457.1152MSANS -2896LUNA NADINE MARIE 21972 8199308199208 9597 8728.3252CTECHN -1758KARU LILIANE 21972 3199207199107 9597 8729.7452CINFOR -5392FER RADHIA 21972 3199210199106 8359 7952.9152.SANS -9857EGLISE CLAIRE 21972 7199402199302 9126 8457.1152CSANS -6707INKERMANN GERARD 119731219951119941110668 9426.5952CSANS -4728ESTANISLAO ERIC 11973 1199608199508 7803 7680.7752CSANS -6566GOULAIN BRIGITTE 21973121994121993121206910240.7753CESP -0727PUY THERESE 2197311199610199510 8656 8145.6552LTECHN -0980ARGENTIERE GILLES 1197311199406199306 9126 8456.1552CANGL -4718DOMOY MICHEL 11973 219940819930811389 9852.0052CSANS -0216CALAIS FREDERIQUE 21973 219930919920911389 9850.6152MVENTE -2997FOIRAIL COLAS JEAN LOUP 11973 1199604199504 8656 8145.4852CINFOR -5877EPI LUC 11973 5199308199208 9597 8729.3052CANGL -0287CARTIER JEAN LUC 11973 7199511199411 9894 8923.3852CTECHN -7891MOUSTRAN PAUL 11973 2199303199203 9597 8729.8452CSANS -3815ELYSEE LOUIS 1197311199304199204 9597 8728.6652CSANS -0959REPUBLIQUE ERICK 11973 619930719951111389 9852.2752CESP -2490GLENANS PHILIPPE 11973 41995101994101206910241.8452CSANS -6935PAYRAC JEAN JACQUES 11973 9199310199210 9597 8729.2252MSANS -8784JACQUET FREDERICK 11973 319930919920911389 9852.2452CINFOR -7986COUCHANT YOLANDE 2197312199608199508 7803 7679.4652CALLEM -1549DRYADES PIERRE G 11973 9199408199307 9126 8456.7052CSANS -0968OPIO SYLVIE 21974 6199606199506 8656 8145.3852CSANS -0353DELATTRE FREDERIQUE 21974 9199603199503 8656 8145.8052CINFOR -1122ACACIAS SERGE 11974101995101994101206910240.9452CTECHN -9008MANOIR DANIEL R 11974 9199606199506 9894 8921.4052CSANS -3650AIRES FERNANDO 11974 7199407199307 8656 8146.2552CSANS -7799TOUR JEAN PIERRE 11974 3199508199408 9126 8456.3752CSANS -4614VILLERS CHRISTIAN 11974 119951119941110668 9427.4752CSANS -6384SEURAT JEAN JACQUES 11974 1199504199404 9126 8457.4952CSANS -0504MEYRIN MICHEL 11974 8199607199507 7803 7679.3752CTECHN -3076TAMARIS THIERRY 1197411199405199305 9126 8457.7452CALLEM -5273CAYES PHILIPPE NICOLAS 11974 2199308199208 9597 8729.3452CALLEM -9558BATOUCH PAUL 11974 6199606199506 8656 8145.2452CSANS -6082PEDRO GERARD 11974 6199607199507 7803 7680.3252CSANS -4712CIDEX NICOLE 21974 9199607199507 7803 7680.0052CALLEM -7982VILAR MICHELINE 21974 9199604199504 9894 8921.4052CALLEM -0377RIBE MARTINE 2197411199609199509 8656 8146.6152CVENTE -1910AUBE DOMINIQUE 21974 3199610199510 8656 8146.0152CANGL -1632COURTAU MARIE JOSEE 21974 8199609199509 7803 7679.6352CSANS -0616HIIS BEATRICE 21974 919930919920911389 9850.9852MSANS -5825TIREUSES MARIE FRANCOISE 2197512199609199509 7803 7680.7152CANGL -8598SAND CHRISTIANE 2197511199607199507 9894 8922.0552CSANS -9425VISA GILLES 11975 319951119950211389 9851.7452CALLEM -8440EYGAUX LAURENT 11975 6199603199507 9894 8922.1652CSANS -3240BARBUSSE JEAN PIERRE 11975 6199510199410 8656 8146.2552CANGL -7022LOUPS DOMINIQUE 11975 3199605199505 8656 8146.7752CSANS -3687SULTZER MARYLINE 21975 8199607199507 7803 7681.1752CTECHN -3649TROIS ANGELICA 2197511199608199508 8656 8147.0652CSANS -8797BELHAITRE RENE 11975 4199409199309 9126 8455.7652CSANS -3401SOURCE PAUL 11975 2199612199512 9894 8921.4152CANGL -0533JOUFFROY LUCIENNE 2197511199608199508 9894 8922.0052CTECHN -4412CAPEAU MONIQUE 21976 1199607199507 7803 7680.6252CINFOR -9518COCULOT HELENE 21976 8199508199408 7803 7681.2952CSANS -1220VALLOIS ALAIN 11976 7199607199507 7803 7680.1852CANGL -7054DANGALYS MARTINE 2197712199607199507 7803 7680.7752CSANS -5515MARNE GHISLAINE 21977 6199607199507 7803 7680.0552CSANS -2958CLAIR GISELE 21977 8199608199508 7803 7680.6352CANGL -5379CONCHES DOMINIQUE 21977 6199607199507 7803 7679.4652CANGL -9250DECHAMBRE MICHEL 11977 8199607199507 7803 7679.4552CSANS -7969SALEON ALAIN 11977 8199607199507 7803 7679.3652CANGL -0131EOLE ROXANE RENEE 2197710199607199507 7803 7679.2852CANGL -9710OUEST HENRIE MARCEL 11979 2199607199507 7464 7525.1452CINFOR -0487PRIEUR JEAN FRANCOIS 11956 81983041982041684813423.3153MSANS -7696BELVEDERE XAVIER 11962 81982071995091450311830.6753MINFOR -2063LIOURA PASCAL JEAN 11964 41986111995082256617145.7853MANGL -7927TRAVERSIERE JEAN PIERRE 11965111986081995091450311832.1553MCOMPT -2549VASCO DANIEL 11968 51990091995111450311832.1453MANGL -2675RESIDENCE JEAN MARC 11969 21995111994111450311831.3453CANGL -8649VIGIER OLIVIER 11969 8199612199512 4638 5819.0153MSANS -7524BEDOK STEPHANE AUGUSTE 11969 51995121994121450311832.5653CSANS -3056FRANCE MARION 21971 61996091995091450311831.7553CSANS -9905CORNICHE DANIEL 11972 31996091995091450311832.2057CSANS -4894PORTE RONAN JEAN PIERRE 11972121993091992091450311831.9353CSANS -6471SUCCURSALE LAURE MARIE 21972 71996091995091450311832.1854CALLEM -8530TOURS ANNE YVONNE 21973 31995121994121450311832.3854CSANS -4004MORTON JEAN CLAUDE 11965 81992031991031965617846.6854CANGL -4099MONTELIER DENIS 11971 519940819930811389 9851.1257MSANS -9423CHATEAU CARL 11956 51980091992121471512024.3958MSANS -2026BERT CLAUDE 21957 51979031986021497412181.1158MALLEM -0951MERAY MARIE HELENE 21964 61990051989051249910472.7058MTECHN -5282PINEL LILIANE 21948 71977031992011471512024.4859MINFOR -5545DOM ANNIE 21960121982091995061638413150.2959DSANS -4161BOIS ANNICK 21960 81983021982021326611016.2459MSANS -1624LORRAINE CHRISTIAN 11961 41983081991012781920674.8359MSANS -0982VEYANS MICHEL 11961 21982091991092529918968.7059MINFOR -0123LOCARNO ANNE MARIE 2197411199402199302 8359 7953.1159MSANS -7957AVAUX PHILIPPE 11942 51963041991072273717261.4960CCOMPT -0611SAUVAN JEAN FRANCOIS 11946 71980111994011471512025.0260MTECHN -8634MONTGAZIN ANDRE 11950121974061991012137316331.7560MALLEM -3872AZUR JEAN CLAUDE 11951101970101990101932314935.1760MMICRO -7401PARC PIERRE 11952 91989011994011288210745.9360MSANS -8111STADE BERNARD 11953 21983021984051249910473.4960MANGL -8795MOTU JEAN LUC 11959 81979101994011578112722.8260MSANS -2118BAUDETS MARIE CHRISTINE 21961 31983011982011608112915.3560MTECHN -8422WIEHN BRUNO 11963121988061992021249910472.6660MANGL -3871SOLE MARTINE 219661019910919950510876 9503.4760MINFOR -6169CUOQ CORINNE BRIGITTE 21967 21989121995071249910472.2560MANGL -2571BARAT MARTINE 21968 81994061996012303517377.3560CSANS -4114HOURTINS DOMINIQUE 11977 1199608199508 7803 7680.5960CANGL -1079GUEN HELENE 219391219820419810411131 9657.7561MSANS -0830EGLY DANIELLE 21950 1199406199306 9126 8457.4261MSANS -1903GENEVIEVE HARDY 11953 91978111989112256617146.1661MINFOR -9550INGERSHEIM PHILIPPE 11961 61982041987041608112917.1961MANGL -3284BELLETRUD JEAN 11950 61977101993121369311287.2363MALLEM -2911SOUBISE IVAN 11958 71982031992112529918967.7663MTECHN -5851CREACH FRANCOIS 21963 9199608199508 7803 7680.0863MSANS -6333DUPARCHY LILIANE 21973 3199406199306 9894 8921.6763CSANS -1729CURAT ROBERT 11935 91958051994123417325098.2464MSANS -7436CHALLONNIERE VALERIE 21941 41962041989012137316332.3664MSANS -6301BLUM CHANTAL 21943 71969071991051932314935.2664MSANS -7026SARRETTE MICHEL 11946 21991011990013200223583.2364.ANGL -0646MARIE BRIGITTE 21950111971011992061834514275.6164DMANAG -1101ENFANTS ANTOINETTE 21955 61981011995011527112373.9164MANGL -8770RACHERET LAURENCE 21956 71978061993051608112916.8864MANGL -4751LIONS DAVID 11958 91980071993092090215981.1464MANGL -9291SOULEYAS DOMINIQUE 11958 11980011992101911114779.7764MANGL -2505LUCHON JACQUELINE 21958 21989011993041249910473.4964MSANS -8607VOLVESTRE ELISABETH 21958 11991111990111249910472.9764SALLEM -1586PESSAC JEAN YVES 11961 21989051988051949415050.2864CSANS -5341RIOU ROBERT 11962 61985091993011949415052.4365MCOMPT -8946MOULINET ANNE 21962 81983041982041608112915.6064MSANS -5619MARCQ MONIQUE 21963101995101994101206910241.3064MSANS -8989JUZAN CLAUDE 11965101990091994092401918075.4464CANGL -0763PERAULT CHANTAL 21965 21986041985041527112373.5364MSANS -1526JEREZ NICOLE 21967 519911219920111389 9851.6164.ALLEM -2211KELLERMANN FREDERIQUE 21967 91991111990111202810241.9764MSANS -4302KERCADORET DOMINIQUE 11971 81994071993071206910240.2364CSANS -1236PALETTE ROSE MAY 21971 91994031993031267210588.9264CSANS -8225SEROT MARTINE 21972 11992061992031330611017.7065CALLEM -5326DRAGUIGNAN FRANCOISE 21972 519930619920611389 9852.0564MTECHN -5970DANUBE PHILIPPE 11974 11994071993071206910240.4965CSANS -6556BROUILLET ANTOINE 11937 11986101986012687820055.0565.SANS -1186AOUT JEAN JACQUES 11937 21987011986012431618272.0165.COMPT -7999PIERREFONDS STEPHANE 11938 31964051994011663613342.7665MINFOR -1312GRENOUILLERE PHILIPPE 11939 71964101987016400345693.2465MALLEM -0460MARRONNIERS GERARD 11942 41961061994113587826261.7965MINFOR -4154LOUIS PHILIPPE 11942121965101993012739020403.3065MVENTE -3603MUETTE GEORGES CHARLES 11942 41968071992013844228044.8465MANGL -8992COUDREE PASCAL 11943 91968031988072273717260.3265MSANS -9382CONSTANCE MADELEINE 21944 519830619860211131 9657.1265VSANS -0255MARTINIQUE GERARD 11946 31994121993123882428316.7365MSANS -8195EXELMANS BERNARD 11946 91984051984111215710278.1665MVENTE -3879GOUT JACQUES 11947 51968121992122470018540.5765MSANS -9678HETRES VIANNEY 11947 91968091994094121428006.1765MALLEM -6027STRASBOURD JEAN CLAUDE 11951 21972101987052470018540.1565MALLEM -7805BESSIERES JEAN 11952 51973031988112334017609.4265MSANS -7152REUILLY ANNE 21953 91974071993121471512024.5665MINFOR -4995BERCHET FRANCOISE 2195412199306199206 8656 8145.6065MMANAG -1933ERMITAGE JEAN CLAUDE 11955 11991031994021249910471.6165MSANS -0728VOISEMBERT ISABELLE 21955 61976011991011471512024.2165MSANS -0718CERNAY MARC JEAN MARIE 11959 11988011987013669126843.7365.SANS -2726ORDENER MARIE FRANCOISE 21959 21980071991101369311287.9765MSANS -0225PLELO PHILIPPE 119591119800319790311389 9851.3365MSANS -0630GOBELINS BERNARD 11959 71981031991012781920674.6165MTECHN -1138ISARDS ELIANE 21960 21988101990042581519316.5865.SANS -8716TOURELLES JOSETTE 21961 81983041989112090215980.4365DANGL -3837CONTAMINES ANNIE 21961 81984121992061527112373.2265MANGL -0223FOUSSEAU DOMINIQUE 21961 21996071995082005015476.6165DINFOR -8553OUSTALADO PIERRE 11962 61984011993121326611017.7265MSANS -1723HIGH MURIEL 21962 71983011982011608112917.1865MSANS -2779PLAT MICHEL 11963121984051993102401918074.6765CANGL -7160BOILEAU DENIS 11964111985031990111949415051.9565MANGL -1054MARINET CRISTOFORO 11964101985091993092401918076.4465MALLEM -0034ANGELY JEAN PIERRE 11965 31988081991121249910473.3265MINFOR -0684DIEUDONNE CORINNE 21965101988121987121249910473.7465MSANS -4943SICARD DOMINIQUE 21966 919931019921010363 9233.2765MINFOR -8211CARLE PATRICK 11966 31994011993011621213033.5665MALLEM -1276GREFFIER SERGE 11967 119930619940110024 8999.1365CSANS -5313BIARRITZ CHRISTINE 21967 91990111991012602319433.9065.ALLEM -5161DUBOC NICOLE 219671219880119870111302 9774.4865MANGL -1515SABLEAUX REGINE 21969 71993011992011839014313.2665MSANS -7518LANORVILLE JEAN DAVID ALBERT 119701219960519950511389 9851.7065CSANS -6488CATALAGNE PHILIPPE 11970 71996101995101706413577.4365CSANS -8039LAURENS PATRICIA 21971111993031995011557012567.4165.SANS -7894PEPINIERE MARIE ANNE 21971 41991111991111723313653.7565MSANS -9988MEN JACQUES 11972 71994061993061420611638.1665CANGL -0742TOUTES JEAN FRANCOIS 11972 71993031992031420611637.6665CANGL -3618FREDISANE BRUNO 119751019960619950611389 9852.5465CANGL -7403AUGUSTINES ERICK 11937 61988031987024330331419.2172.ALLEM -7418PATRICIA JEAN CLAUDE 11944 71990071993011369311286.2072.SANS -9902CORSE MARIE JOSE 21958 41988101983101326611018.1872.INFOR -1972FLANDRIN CATHERINE 21963121988101983101288210744.3772.SANS -6223BEAR MICHELINE 21963 51989061992031450311831.6972.SANS -1899CHEVILLY ISABELLE 21963 71989011992061450311832.7272MTECHN -1131BLAISE MIHOKO 21963101990011991061450311831.0372.SANS -7170AIGUEBONNE MARIE 21971 11995101994101206910241.9972CSANS -0384LAMBESC ALBERT 11973 119901019920110024 8999.7672.TECHN -4786VIGEN EVELYNE 21939121962121990102273717261.1873MINFOR -5969COTE MIDORI 21946121994101993102334017610.5973MSANS -6378MYOSOTIS YVES 11949 31992011994113844228045.8873.SANS -3664MAREUIL NADINE 21966 21989061989111288210744.8673.SANS -8858EANOLIAS JACQUELINE 21949 51977071991121911114778.7075CSANS -1090LORETTE YVES ANDRE 11950 61971081995013587826261.5875MSANS -3800KOUTIO ALAIN 11961 91982121989052090215980.3975MINFOR -5591PALALDA MARC 11965 81995061994061267210590.3275MSANS +5745ESCOURCHE BENEDICTE 21935 71962121994051834514275.50 0MTECHN +9692VICENTE LAURENCE 21941 81967101989011621213032.80 0MANGL +9146NICOLAS ROGER 11941 61964071995023417325098.65 0MSANS +2985TESSEREAU MARIE HELENE 21941 91967011990011932314933.78 0VSANS +3368MOGADOR ALAIN 11941 11961091993114330331420.55 0CSANS +7394CHAUSSEE ERIC DENIS 11944 91965111983123200223583.86 0MANGL +4655MAILLOT GEORGES 11945 51970091986122470018541.64 0CANGL +2825CAMILLE NADINE 21956 91994011993011949415050.45 0MSANS +1460BRUYERES JEAN MARC 11958 81984081988052090215980.07 0MSANS +4974LONES GERARD 11959101979011994121608112916.70 0MSANS +8811CROISILLES DOMINIQUE 11961101983051991011868714507.13 0MSANS +4682MUY CHRISTINE 21962101986051985051288210745.30 0MANGL +2974SEYSSAUD GERARD 11963 91984101989051949415050.55 0MALLEM +3185QUINET OLIVIER 11966 71985061993111868714507.94 0MSANS +9543KOMITAS YVES 11967 21993011992011330611017.70 0MTECHN +3493COUDET ERIC CHRISTIAN 11935101955041992063417325097.97 1MTECHN +9039CHAMBOURCY JEAN PAUL 11936 21965031995033417325098.51 1MALLEM +3731CLERE BRIGITTE 21936111963091995082666519900.77 1CSANS +2935BONVIN ROBERT 11937 71960121985042273717261.66 1MANGL +4278VALBOSQUET VERONIQUE SIMONE 21939 21972071992021932314933.54 1MSANS +1653LIEGE LAURENCE 2193912198901198605 8656 8145.57 1.SANS +4477LECOURBE DIDIER 11939121965051993011663613342.67 1MSANS +1400AVENE ANDRE 11940111969121993041557012568.44 1MALLEM +9742YZENGREMER MICHEL 11941121968011995042201216756.19 1MVENTE +7255PEYRESTORTES MARIE CHRISTINE 21941 11962041988072470018541.83 1MANGL +1725EPEND MARIE AGNES 21941 41973071989011621213033.65 1VSANS +4647PERADONNERIE JACQUES 11941121974071992071369311287.41 1MSANS +7633SCHEFFER CLAUDE 11944 11969031991011433211714.46 1MSANS +9793SABLONS MARIE FRANCE 21945 5199408199308 9126 8456.87 1VSANS +6057EAU BRUNO 11947 91972041991071433211715.33 1MSANS +6465JADES CATHERINE 21947121970011995042137316331.60 1MINFOR +8298BERGERS BERNARD 11947101975091993011369311287.29 1MSANS +9254LEGROS SUZANNE 21947 41971111995111684813422.57 1MESP +7761KAMAL ALAIN 11948 91977041993111471512024.08 1MCOMPT +5772GAUTHIER SABINE 21948 61977071994041471512025.34 1MTECHN +9643BARTHELEMY DOMINIQUE 11949 519871019901111131 9657.16 1LSANS +3906ROUYRE LAURE 21949 31973071972071326611016.21 1MSANS +8707SICILE JEAN PIERRE 11950 11976071993011369311286.56 1MANGL +0091THIVERNAL DIDIER JEAN 11951101980051991101471512024.71 1MSANS +5757CLOPERIE FABIENNE 21951 71972051995071684813423.26 1MSANS +7795LATOUR CATHERINE 21952 4199406199306 8359 7953.72 1MSANS +4879EGUILLES GILLES 11952 61972121990071621213032.51 1MANGL +8311VINS JEAN PIERRE 11952 119930919920910407 9272.06 1MTECHN +5964JUST STEPHANE BERNARD 11952 51974061993011369311286.48 1MSANS +2822NEMAN ELISABETH 21952 7199304199204 9597 8728.14 1MSANS +1340ABBE MICHELE 21953101973071991041578112722.60 1MSANS +5357ZOLA BERNARD 11954 41980061992011471512024.35 1MSANS +8456DHUYS CORINNE ANNE 21954 71979031993041471512025.50 1MINFOR +4618FERRY BRUNO 11954 41977041995011578112722.24 1MSANS +8212CIRCLE BERNARD 11955111975041991071578112722.42 1MSANS +8015BACHELET DOMINIQUE 11956121977031994072644919744.10 1MTECHN +4320SUPERI MONIQUE 21956 319940519920111389 9852.00 1MSANS +0442CONTOUR ALAIN 11957 91977031995062201216757.70 1MSANS +1034PROLONGEE MICHELINE 21957 61980051994071471512024.15 1MSANS +2106BARDE JEAN CLAUDE 11958 219840719830711131 9659.17 1MANGL +1977FOCH BERNADETTE 21958 3199202199102 8656 8145.03 1.SANS +3620BAGNOLET ANDRE 11958 11978061992051471512024.33 1MSANS +3344PEUPLIERS JOSIANE 21959 8199207199201 8656 8146.16 1DSANS +9038MALVILLE ETHEL LINKA 21959 31993091992011202810240.59 1MTECHN +0475PIERREFONTAINE BERNARD 11959 61984081987112090215979.62 1MSANS +4077MONTMELIAN NOELLE 21960 21984031983031288210743.92 1MSANS +1421FONTCHANDON PATRICE 11961 71984081989052090215980.97 1MALLEM +7043MOULERON MARTINE 21962 5199303199203 8656 8145.83 1.SANS +7239EPARGNE PASCALE 21962 91983011982011608112915.57 1MSANS +0361BRUANT LAURENCE 21962 31983041994091894014661.48 1CSANS +1988MIGNARD ANNE 21962 51993081992011249910473.36 1MSANS +8159GOLFE JEAN CLAUDE 11963 81985101992071288210745.49 1MANGL +7227BLEU MICHELE 21963 21994071992011249910472.61 1MTECHN +2721SATGE SOPHIE JULIE 21963 6199503199403 8656 8146.07 1MESP +1514PANNES JOEL ETIENNE 11964 11984101983101288210743.81 1MSANS +1595SEPTEMBRE PATRICE 11964 11988031987031527112373.40 1MSANS +5702CONCORDE PAUL 11965 71994051994011288210744.94 1MMARKT +3500DRIONNE JEAN XAVIER 119651119860119850110791 9501.81 1MSANS +3597PIERAM DOMINIQUE 11966 31991101990101381911366.72 1MINFOR +3537JEAN ANNE MARIE 2196610199610199510 9894 8921.90 1MSANS +0036CHATEAUBRIAND FRANCOISE 21967 8199307199207 7803 7681.42 1.SANS +2501GASTA PIERRE 11967101987091988071949415051.95 1CESP +5621KERGUILLE PASCAL 11967 71988071994061381911364.83 1MALLEM +5823BRIAC MONIQUE 21968 51994011993011360611210.93 1MSANS +3717FRADINIERE DANIEL 11968 51988041991041249910472.01 1MTECHN +2374PETITS SYLVIE FRANCOISE 21969 91992091991091330611018.24 1MSANS +8139POMPE ERIC 11969 21989041995031249910472.21 1MESP +3293GUSTAVIA MICHEL 11969 11993021992021420611637.74 1CINFOR +6848IMPASSE CLIVE 11969 71988071994011249910471.88 1MSANS +2857ERMITE DOMINIQUE 11969 319910719900710407 9271.86 1MTECHN +9167PARENT JEAN CLAUDE 11969 919930419920411389 9850.61 1CTECHN +6582OR MARYSE 21970 419920719910710024 8998.62 1MSANS +3685ANNEAU CORINNE JEANNE 21970 919920819910811389 9852.27 1MSANS +4890CIMIEZ PHILIPPE 11971121994101993101360611209.89 1MSANS +7740MARCEAU AGNES 21971 119920919910911389 9852.45 1MANGL +5934RANCHO DOMINIQUE 11971 91992071991071420611637.60 1CANGL +6784WEST JEAN LOUIS 11971 71995011994031202810241.57 1CSANS +0502ARRALLES GILLES 11971121993121994011249910473.27 1CSANS +5900LESIGNY OLIVIER 11972 6199606199506 8656 8145.74 1CVENTE +9357EGLISE ROGER 11972 5199207199312 9597 8728.89 1CINFOR +2647MONASTERE PHILIPPE JEAN 11972 919940619930610363 9233.31 1CSANS +7752RANCE GERARD 11973 2199607199507 7803 7680.14 1CINFOR +2565AQUITAINE GENEVIEVE 21973 119940619920111389 9852.22 1CALLEM +6946ORBAY CHRISTIANE 2197311199207199101 8656 8146.88 1MSANS +3358SALONINA ETIENNE 11973 419930919920911389 9852.36 1CANGL +7527BOULEYGUE PATRICK PIERRE 119741219940419930410668 9426.72 1CSANS +4780VALMORE ALBERT 11974 81995011994011206910241.16 1CSANS +6139PALMAROLE BERNADETTE 21975 1199504199404 8359 7952.78 1CSANS +2461CHAFFARD FREDERIC 11975 1199408199308 7803 7680.62 1CANGL +4422KAZ ELISABETH 2197612199607199507 7803 7681.11 1CSANS +3477CABRINE SYLVIE 21978 7199608199508 7803 7679.51 1CTECHN +6323FABIA RENE 11935 31960121990082273717260.44 2MSANS +5986ANNA DANIEL 11935 41970041991011433211714.88 2DSANS +1512FONTAIN HENRY 1193511198901198801 9894 8922.57 2VESP +6902BLANCS BRUNO 11935 61958071993052470018541.64 2MSANS +1158CORNEBARRIEU JEAN FRANCOIS MARCEL11936121964011994011557012566.45 2CTECHN +8277PRIEURE CORINNE 21936 51963011991072273717260.26 2CANGL +3981TERME FREDERIC 11937 71959021989013844228044.89 2MSANS +1713DANVILLE DANIEL 11937 51961101985022470018540.87 2MANGL +9871CAZALIS THIERRY 11938 61966121989062947921840.15 2MANGL +0383CRESSELY JOELLE 21938111962091990012273717260.55 2VANGL +3742PYRENEES CHRISTIAN 11938121971101995011663613342.85 2MESP +6595BAGUIERE FRANCOIS 11938121964081983102022115556.35 2MALLEM +6543PIERRON PATRICK 11939 7198901198801 9894 8921.33 2CSANS +8167CLAUX MARTINE 21939 21967011992021932314934.48 2CSANS +4406LESBACHES COLETTE 21940111973071994041894014662.43 2MSANS +8258HARTMANN MARC 11940 31968061995011663613343.06 2MVENTE +3848BARAUDIERE JEAN CLAUDE 11940 11964101990042739020404.83 2MANGL +1529PICOURENC ANNY 21940 71967011989062470018541.86 2DVENTE +3069PERIER MICHELE 2194010199601199501 7803 7681.25 2MSANS +8473COLONIE PIERRETTE 21941 31968041991041932314933.58 2MINFOR +0084NIEMEN ODILE 21941 51970071991101932314933.73 2CSANS +6401ALLERAY ARLETTE 21941 21972121993071894014662.64 2CSANS +8343LEDION FRANCOIS RENE 11941 71972031991071663613344.41 2MALLEM +9940LAUNES LILIANE 2194210199005198606 8656 8145.83 2.SANS +7584MARSAT SERGE 11942101964081994011557012567.26 2MSANS +1051ROSAN STEPHANE 11942 51962041991072273717261.13 2MANGL +8928POINCARE ANNE MARIE 21942 41965021994051834514275.50 2MANGL +0874FRANCS KATHERIN 21942 61968031992021932314934.00 2MSANS +3411CORDELIERS ELISABETH 219421119931119921110152 9116.90 2MSANS +8736PERTUADE DIDIER 11943 31973071992041403411520.93 2MANGL +5553OLIVIER CHANTAL 21943 71964071992102137316331.97 2MTECHN +8502AUGUSTE JOCELYNE 21943101962121991072273717261.16 2CTECHN +7314DRAIO TOMOKO 21943111969111991072273717260.71 2MSANS +7892HAUTIL MARIE AGNES NICOLE 2194312199201199101 7803 7681.35 2.SANS +1146RUES LAURENT 11943 51970041990032022115556.13 2MSANS +5013POURNAY STEPHANE 11943 71969101991011433211714.01 2MMARKT +1970SARREBOURG CHRISTOPHE 11943 91962121988122470018540.20 2MTECHN +2665SAVOIE HELENE 21944 91968091986062470018540.53 2MSANS +9470KALISTE SUZANNE 21944 31970071991041578112722.12 2DSANS +7109PEREIRA JOSIANE 21944 71965011982102470018541.72 2CSANS +0293COURDIMANCHE JEAN CLAUDE 11944 41967011991012273717260.50 2MSANS +6308BASQUES ERIC WILLEM 11944 71970051988042273717261.30 2MSANS +9758ROSSA ROBERT 11944 21976051991101369311286.71 2MSANS +0368GEROFOSSE JOELLE 21944 5198810198306 8656 8146.34 2.ANGL +3899SALIVE JACQUES 11945 81971051991071433211713.67 2MTECHN +4807RONDINELLE NOELLE 21945 81968091993062470018540.42 2MSANS +1251CAP CLAUDE 1194510198907198903 8656 8146.20 2.ANGL +8624FREVILLE ALAIN 119451119820119810111389 9852.74 2MSANS +2995ROI JEAN 11946 91972011990101433211715.50 2MANGL +2130POMPE JEAN MARIE 11946 11972081991071578112722.03 2MSANS +1524ANTARES CHRISTIAN 11946 41972011990011433211714.43 2MTECHN +2651AUBE YVES 11946 71971071987041932314934.48 2MALLEM +5389YVON CAROLE 21946101969031993031834514275.34 2CSANS +5055BERTHIER CAROLE SIMONE 21947 319931019921010024 8999.31 2MINFOR +9623LAGER NORMA 21947 61982071992121471512024.51 2MSANS +9198CAGEAC MICHEL 11947101971031991011433211715.45 2MTECHN +1117MONS JOELLE 21948 41970081986052334017609.84 2MSANS +3883BELFORT FLORENCE 21948 2199503199403 8359 7952.96 2MINFOR +1886CHERCHE CHRISTIANE 21948 3199412199312 9597 8729.72 2MSANS +9452MORGANE ISABELLE HELENE 21948 61971061989011621213032.70 2MVENTE +1240POSTEL JOHN 11948111974071992011403411520.33 2MTECHN +2793DALHIAS EUGENE 11948 71974041992031518612336.02 2MSANS +1264TRESSERVE EVELYNE 21948 71969081991012990722149.03 2MTECHN +2964PUJADE ROBERT 11949 81974071992041403411521.74 2MANGL +9832COUTURIER PATRICK 11949 11972031988102273717260.76 2MSANS +7619ETIGNY FLORENCE 21949 21970111995042137316332.59 2DVENTE +3262FABRONITA ANNE 21949 11969091993061834514274.66 2MSANS +2312SENONCHES ERIK 11949111977041993041369311287.23 2MALLEM +8743GALLA DANIEL 11949 31970081991012137316331.79 2MALLEM +0857RAYNOUARD JEAN PIERRE 11950 91982061993111369311287.65 2MSANS +2136DEROISIN JEAN MARIE 11950 11979061992011608112916.74 2CSANS +4603LEPURDIE PHILIPPE 11950 91977101990101684813422.12 2MSANS +2694JOSEPH ERIC 11950 31979021992011249910471.62 2SANGL +0601SAOUVES PATRICIA 21950 51971021990101834514275.83 2MTECHN +7409RENE DANIEL 11950 11973051990122470018541.83 2MANGL +0950SENNELY JEAN PIERRE 11950 51977081986091621213033.28 2MANGL +1214LOTHIERS ALAIN 11951 51976101993011608112915.65 2MSANS +6388LAGRANGE ANDRE 11951 81976031984112470018541.20 2MSANS +2773MORGON ALBAN 11951 91974051988122334017610.33 2MANGL +7718PIEDS PASCAL BRUNO 11951 61981061993011471512025.91 2CSANS +8483MEDITERRANEE FREDERIC 11951101970101991112334017610.56 2MSANS +6772TRARIEUX GUY 11952 91976041992121932314933.54 2MTECHN +3860MONTABO GHYSLAIN 21952121972041979101684813421.64 2MMICRO +4868SEVRIER BERNARD 11952 31981041992121369311287.50 2MANGL +5715CHEVREUSE CATHERINE 21953 11974081991092175716600.56 2MSANS +3702CALIFO BEATRICE 21953 21973021993012017815517.91 2MESP +4778LABORDE SHOKO 21953 61973041990101578112723.50 2MSANS +4134GABONNAISE GHISLAINE 21953 61980071979071202810241.30 2DESP +4174GAGNEUR JEAN FRANCIS 11953 81979011991101369311288.22 2CSANS +6892NOLET JEAN LOUIS 11953 81982051992041369311287.41 2MSANS +5817SERPENTINE CLAUDE 11954 11973111989122175716601.28 2MSANS +9960GASSIN PASCAL 11954 81974121991012334017610.60 2MSANS +4935ANNE EVELYNE 21954101975021986101684813423.38 2CANGL +7050LUBECK MARIE CHRISTINE 21954 81975101993091608112915.33 2DESP +4537ANNECY ROBERT 11954 91974061992011578112721.89 2MANGL +1403CHAUVETS CHRISTINE 21954 31977031992011471512025.55 2MINFOR +3733JAUSSERANNE MASAYO 21955 41978011981091834514274.29 2MSANS +3799VAILLANT ANNE MARIE 2195558199606199506 7803 7679.58 2MSANS +1112CHAUMINE RUTH 21956 71985091984091288210745.99 2MSANS +8102AUSSOU MARCELINE 21956 91985061984061288210744.53 2MMICRO +3321GABRIE JEAN LOUIS 11956101976031993041471512024.75 2MSANS +6037SENART JEAN PIERRE 11956 419810319921011389 9852.47 2MSANS +2073CHAUFOURNIERS FRANCOIS 11956 61976111994041471512026.24 2MSANS +3246LAMANON VERONIQUE 21956111980041995101527112374.97 2MTECHN +5182MA PIERRE 11957 41978121994071911114779.14 2MALLEM +1023GIONO PATRICK 11957 91989011995011249910472.21 2MSANS +6811GENERAL ALAIN 11957 219930719940111302 9775.56 2MSANS +9879FOUJU PATRICK 11958 91983051987052090215979.70 2MSANS +9605ATLANTIQUE CATHERINE 21958 4199510199410 7803 7681.20 2MSANS +4610COLMAR YVES 11958111982021981021608112916.50 2MSANS +1905INGRANDES GILLES 11958 11978061993041471512024.03 2MSANS +6585VERON PHILIPPE 11958 41990091989111450311831.69 2MINFOR +1508DOBROPOL ERIC JEAN 11958 71978071995041249910473.33 2MTECHN +9616AIGUELONGUE JEAN PIERRE 11958 71979101994051783213884.92 2MTECHN +5207GANDOUX PATRICK 11958 11980081985112256617145.24 2MSANS +5107FABRON CLAUDE 21959101982021981021326611016.48 2MTECHN +6821ARCADIE RAPHAEL 11959 519810119800111389 9851.34 2MSANS +9011TUTELLE CLAUDINE 21959 3199201199101 7803 7680.57 2.INFOR +9117TOURISTIQUE AGNES 21959 31983111982111326611016.24 2MSANS +2719CRECH DOMINIQUE 11959 81983101991012781920673.39 2MSANS +9688BAUME BRIAC 11960 1198901198801 9894 8921.36 2MVENTE +0734CIPRES DOMINIQUE MAURICE 11960 21984111993041527112374.40 2MSANS +2402VALBOIS DOMINIQUE 11960 419880419870410407 9271.77 2MSANS +4887ARBAUD JACQUES 11961 61985101993011168610047.18 2MSANS +3196ARCADES YVES 11961 619910819900810024 8999.88 2MSANS +0090SENLIS COLETTE 21961 7199610199510 8656 8147.17 2MSANS +1096BOULOGNE AIME 11961111982061981061326611016.53 2MTECHN +2728ABOUT CATHERINE MARIE 21961 219841019831011389 9851.55 2DSANS +9891EXELMANS PATRICK 11961 61992061991061249910472.97 2DSANS +4344SANTA MARYLENE 21962 91993081992011249910472.41 2DSANS +6050PROSPER JOELLE 21962 41982051981051326611018.19 2MESP +1207CAUSSADE MONIQUE ESTELLE 21962 91982111995011450311831.07 2DTECHN +0864MIOLLIS FRANCOISE 21962 6199501199401 8656 8146.41 2MANGL +0149MONVALLON BRIGITTE 21962 41983011982011326611016.29 2CSANS +2375ALIZE CAROLE 21962 91983011982011215710280.24 2MANGL +8618RESID CHRISTIANE 21962101996111995111202810241.90 2MSANS +2736PAPIN GERARD 11962 51982051993091949415052.11 2MSANS +3073JONCS PATRICK FRANCOIS 11962 919890519880510407 9270.62 2MANGL +6231ENFER PHILIPPE 11962 61988031993041288210744.28 2CALLEM +5886CHANAZ RENE CHARLES 11962 41992091991091839014312.94 2MSANS +7276ORGEMONT DANIEL 11962 119830719910711131 9658.28 2MINFOR +8307GUILLAUME BRIGITTE 21963 21986051985051288210744.10 2MALLEM +6242ESCLIMONT MARC 11963121986071993051288210745.94 2MMARKT +2593CARNOT JEROME HENRI 11963 719890619880610407 9271.23 2MSANS +9494TAILLANDERIE JOSETTE 21963 41985101984101249910472.84 2MANGL +6039BOURRIER ODILE 21963121984051992011288210745.88 2DSANS +8408MARINE JEAN PHILIPPE 11963 419850619840610791 9502.46 2MSANS +3121DOMAINES MICHEL 11963121983061983081326611016.74 2CALLEM +3716LANDES DANIEL 11963 919851019841010791 9503.30 2MCOMPT +7915LAMBALLE CHRISTIAN 11963 7199009199510 8656 8145.48 2.SANS +9027RUGBY NICOLAS PHILIPPE 11964111993051992051249910472.12 2MSANS +2392MAXIME FRANCIS 119641219850419840410791 9501.95 2MCOMPT +3798BORNEL PATRICE 11964 51984061993071527112374.31 2MANGL +8092DOURNAZAC MARIE CLAUDE 21964 71988031995091450311831.39 2DTECHN +9707FEUILLANTS STEPHANE 11964 91985041984041288210744.95 2MSANS +1926ESCLAPON JEAN PIERRE 11964101987071990011288210744.14 2MSANS +9268DOCKS CATHERINE 21965 81985101984101288210745.97 2MALLEM +6133MOULYN JEAN NOEL 11965 519950119940110024 8999.58 2MANGL +2064GABRIELLE CLAUDE 119651119940419940110363 9232.71 2MANGL +3515ARZENS JEAN MICHEL 11966121987061994101249910473.45 2CSANS +1327LEVALLOIS CHRISTIAN HENRI 11966 419870119860110407 9270.96 2MALLEM +4538VALLEE PATRICK 11966111987091986091527112373.35 2MSANS +3705TOLLARE GUY 11966 319900219890210407 9271.28 2MANGL +2150SUD FREDERIC 11966 819891119881110407 9271.41 2MANGL +0295WEBER PATRICK 11966121989041994071249910471.94 2MANGL +8904ARMAGNAC BRIGITTE 21966 21993011992011839014312.78 2MSANS +0895ABORD CHANTAL 21966 31992021991011202810241.94 2MINFOR +3361MONTMORENCY LUC 11967 119891219890411302 9775.47 2MANGL +5793CHANEZ OLIVIER 11967 61989021988021539912452.16 2MTECHN +9149AUBEPINES JEAN CLAUDE 11967 919950619920110024 8999.72 2MSANS +6376MYANS DIDIER 11967 419900919890910024 8998.71 2CINFOR +7437KERILIS CHRISTINE LUCIENNE 21967 219950519940510668 9426.77 2MMARKT +5688TALLOIRES DOMINIQUE LOUISETTE 21968 81992121991121949415052.16 2MINFOR +3037GRANADOS BRIGITTE 219681119921119911111389 9851.33 2MSANS +0075CROUESTY PIERRE G 119681119900619890610407 9271.65 2MTECHN +7531UCHA GERARD 11968 319880619870610407 9270.24 2MALLEM +7464MORLET CHARLES 11968 319890419880410024 8999.79 2CVENTE +0214BLAZY CECILE MARIE NOELLE 2196812199405199305 9894 8922.34 2MMARKT +4596BONHEUR PHILIPPE 11969 81990011992061202810240.46 2MTECHN +3345ERESTE ERIC 119691219900919890910024 8999.72 2CSANS +2283MONTS PIERRE 11969 3199606199506 7803 7681.34 2CALLEM +5377ROGER FRANCK ANTOINE 1196912199306199206 8656 8147.19 2.SANS +2310PANORAMA JEAN PIERRE 11969 1199407199307 8656 8146.86 2MSANS +5201LINCON ALAIN 11969 11990101989101202810240.66 2MSANS +0199ROLAND ERIC JOSE 11969 119890719880710407 9270.29 2MSANS +9200FABREGAS LIONEL 11970 419940219940310024 8999.90 2MTECHN +7648PEPINIERES JEAN PAUL 11970 119920419910410024 8999.90 2MANGL +0531FALAISE PATRICK 11970111993101994051450311831.87 2MTECHN +0234TERTRE GILLES 11970 419940419930510363 9233.63 2CALLEM +4680FREIGNEAUX TORBEN 119711119910519931110024 8999.31 2MANGL +6897BRIGAND MAGGUY 21972 719910719900710024 8998.62 2MSANS +3962VIMANEY DOMINIQUE 219721119940719930411389 9852.18 2MSANS +3186VALLAURIS STEPHANE DENIS 119721119931219921211389 9851.57 2CSANS +8810GRENELLE BERTRAND 11972 219931219921211389 9851.21 2CSANS +4405ROBIAC FLORENT 11972 41992121993021420611638.14 2CTECHN +1562PORTO DENIS 11972 31992021994011249910471.76 2CSANS +9401VIEILLE DOMINIQUE PIERRE 11972 119940619930610363 9232.37 2CSANS +6240ROMARINS MAURICE 11973 61993031994011202810241.12 2CTECHN +7717INDRE GEORGES 11973 7199306199201 9597 8728.41 2CTECHN +4476AUGUSTIN CHRISTIAN 11974 419941119931110668 9425.55 2CSANS +1784LOIN MARTINE 21975 3199607199507 7803 7680.09 2CSANS +3218FLORENCE PIERRE 11977 1199606199506 7803 7681.25 2CESP +2085HEOL GUY PAUL 11977 5199410199502 8359 7951.66 2CSANS +0871BOUCHE MICHELE 21934 9199201199409 7803 7680.72 3.SANS +6519INGRES CLOTILDE 2193511199202199102 8656 8146.47 3.ALLEM +4038ADAM JANICK 21936111960061980062470018542.10 3MSANS +5872MURES MARYSE 2193610199210199110 9085 8417.54 3VSANS +1672LECOIN MIREILLE 21938 7199505199405 7590 7562.85 3MANGL +7357DETRIE MARIE PIERRE 21939 61962071983032470018540.96 3MSANS +6152LAVA MICHEL 11939 71962111991013844228045.78 3MSANS +3943SOUPANE MARIE HELENE 21940 31967011990011932314934.18 3MANGL +3325REVIREE ALAIN 11941 21973071992011403411521.25 3MANGL +2673HENNER LILIANE 21942 6199501199401 8656 8145.91 3CSANS +1755THEBAIDE MICHELE 21942 71966061995011834514275.86 3CSANS +7360DUCHEMIN VALERIE 21942 61970051991091932314933.73 3MANGL +1599CHALETS ALAIN 11943121988031993011215710279.23 3MSANS +9946AULNAY LAURENT 11945111972061995072470018540.87 3MVENTE +2412GILLES ANNE 21946101969081990012137316330.83 3MSANS +0843EPICEAS COLETTE 21947111971011994051834514274.26 3MANGL +6293TERRAS ERIC 11949 41976021992012470018542.13 3MSANS +0336AMOUR MARC 11949 31978081993121471512024.17 3MSANS +5125BASTIDES GUY 11949 91975091990011684813422.12 3DESP +7428LEGENDRE ELISABETH 21950 91979121978121249910472.15 3MSANS +5015GERARD VALERIE 2195112199307199207 8656 8146.11 3.ALLEM +4029SUISSE HERVE 11951 41970101990101932314935.08 3MTECHN +3802BARTHELEMY JEAN 11951 11976051994041471512025.77 3MESP +1871FELIX JEAN CLAUDE 11951 419811119870411131 9657.08 3SSANS +0467MALMAISON HENRI 11952 81976041992011578112722.66 3MANGL +4342PEYRE ANDRE 11953 519820419810411389 9851.64 3MESP +4047DORDOGNE GERARD 11954 11984081993011471512025.01 3MANGL +0870CHARBONNIERE HERVE MICHEL 119541219860119850111131 9658.11 3MANGL +5403CLEMENT RICHARD 1195511198103198910 2079 1.27 3MANGL +2799LOUBET HENRI 11955111980051995041249910473.33 3MANGL +8532LEDRU GERARD 11956 41975061992081868714506.76 3MCOMPT +6909NICOLAS SYLVIE MARIE FRANCOI21956 91977041992021471512026.04 3MALLEM +4518CLAUDE BRIGITTE 21956 21978041992021471512025.74 3CSANS +9477MERE MARIE LAURE 2195612199201199101 7803 7679.73 3.SANS +5508BATHIE PAUL 11957 31979051995041249910473.65 3MSANS +8413MARRONIERS ROBERT 11957111979121992011471512025.46 3MANGL +4314MAUGARNY VERONIQUE 21958 11978071992121471512026.22 3MTECHN +4329MAREUIL JEAN PAUL 11958 21981051994011471512025.56 3MVENTE +8123CANADA FRANCOIS 119581219940719930711389 9852.20 3MCOMPT +8870NEUVE JEAN FRANCOIS 11959 81978071992091471512025.02 3MTECHN +8119RAMPART PIERRE 11961121981061993051527112374.76 3MALLEM +7639ASSAS ERIC 119611019850119840111131 9657.96 3MANGL +7720SIFFRET PATRICK 11961 719870319870410791 9502.58 3MVENTE +5003PUYBERNARD DANIEL 119611119930419920410024 8999.03 3MSANS +8713VAGNE FREDERIQUE JOSEE 21961111982021981091608112916.97 3MANGL +1064CASSANYES JACQUES 11962121988061995011373711327.43 3MSANS +6331CORMIER MIREILLE 21962 51985091984091249910472.33 3MSANS +8037FARRERE JEAN LOUIS 11962 91987071992052529918967.97 3MVENTE +2186JOZON CLAUDINE 21963111984091992011949415051.54 3MSANS +6036VERQUIERES YVON 119641119880719911010407 9271.97 3MSANS +7970FOIRAIL MARC 119641119850319840310791 9502.86 3MALLEM +1484VICTORET NICOLE 21965 5199610199510 8359 7952.10 3MANGL +7412FLERS GUY 11965 219880219870210407 9270.06 3MSANS +3857DENIS BRIGITTE 21965 91993091992011202810240.55 3MESP +5856ILIZ THIERRY 119651119860519850510791 9503.61 3CALLEM +0008CESAR ERIC 11966 91987081986081249910472.87 3CANGL +8742MONTANT CATHERINE 21966 91993101992011202810240.28 3MALLEM +9552LACOMBE FRANCK 11966 51989021991121450311832.47 3MSANS +4423ROC CLAUDE 119671019931119930110024 8998.17 3MSANS +2631MORIZET SERGE 11967 51988041992051450311830.88 3CSANS +2963BEAUMONT PASCAL 11968 2199306199301 9597 8728.13 3MINFOR +1467OTTO JEAN 11968111991111990111467711987.67 3MANGL +9461BARREAU PHILIPPE 11968 11990011989011202810240.08 3MSANS +8108ARCANG PATRICK 11969 51990021989021381911365.41 3MSANS +7093HERAULTS DANIEL 1196911199408199308 9597 8728.82 3CSANS +3952LEDOUX VERONIQUE 21969 919910919900911389 9851.84 3MSANS +7563SUPER THI VIET 11971 21990081994011249910473.67 3MSANS +4441MIRAPOL DOMINIQUE 21971 819930619920611389 9851.34 3MSANS +2892LOTS THIERRY 11971 2199303199510 9597 8728.23 3MSANS +5535HOULGATES PASCAL 11971 6199607199507 7803 7681.13 3CSANS +2838PLAGE JEAN LUC ANDRE 11972 11992071991071420611638.68 3MTECHN +9036MERCEDES YVES 11972 51993101992101420611639.01 3CSANS +2537MONTSOURIS PATRICK EMILE 1197211199505199505 9597 8727.87 3MALLEM +0228AUBERTS JACQUES YVES 11972 6199404199201 9597 8729.43 3CVENTE +5626VERNEDE ROGER CL 11973 41994101993091450311831.06 3CSANS +6525AVES SYLVIANE 21973 2199204199104 8656 8145.93 3.TECHN +9781OLLIER ANNE MARIE 21973 619931119921111389 9850.97 3CSANS +1379ROSTAND PIERRE 11974 4199507199504 9126 8457.54 3MSANS +5204CRAVANT DOMINIQUE 11974 1199601199501 7803 7681.40 3CSANS +6619HORIZON JEAN MICHEL 1197410199606199506 7803 7681.44 3CANGL +5826VALBONNE ANTOINE 11974 71993091994081202810240.77 3CMICRO +0256GRANG DOMINIQUE 21974 5199508199408 7590 7563.95 3MTECHN +4230FAISANDERIE ANNE MARIE 21974 819930819920811389 9852.69 3MALLEM +4212ORME HERVE 11976 8199606199506 7803 7681.44 3CSANS +6753PINTADES HERVE 11977 9199608199508 7803 7679.99 3CANGL +7715VAILLANT CHANTAL 2193111198801199302 7677 7603.76 4.ALLEM +8632CLAIRETTES JACQUES 11935 51964081994011557012566.54 4MSANS +3535CASANOVA THIERRY 11936 91963081995112022115555.22 4MESP +1574AVENUE PIERRE ALAIN 11936 719890119920811131 9657.20 4MINFOR +4591VINCIN NICOLE 21939121966071993012137316332.68 4CSANS +3788POTERIE MICHEL 11939 81972061990011403411520.75 4MALLEM +0118BRETHON GUY 11939 419871119950310407 9270.03 4MSANS +2869LIMERGUE BRIGITTE 21939 91963041991072273717260.91 4CANGL +8403BOSQUET FABRICE 11939 81966071990011433211714.79 4MSANS +3617VATA JEAN 119401019930819910110407 9270.62 4MSANS +4772SAENS BERNARD 11940 719900519890510024 8999.04 4MSANS +3869MARIUS MIREILLE 21941 81961101995072137316330.70 4VESP +3900PERDONNET PHILIPPE 11941 119921219911210407 9270.44 4MSANS +7958CARDINALE ROSELYNE 21942 21963101992072137316331.25 4MSANS +9381LOTOS CAROLINE FREDERIQUE 21942 11968011990011932314934.90 4MESP +1020FLORIDE KATIA 21942 71972071993111834514276.10 4DSANS +9843MEON GERARD 11943 41973101991011621213032.20 4MSANS +0204GAILLARD CHRISTIANE 21944 71964071993012137316331.82 4MSANS +1733VUE CATHERINE 21944 61963111992072137316331.78 4MVENTE +6248AYGUESVIVES MICHELE 21944 41970071991071684813421.33 4MANGL +4598FEUILLERAIE JEAN MARIE 11945 219890119910610791 9502.23 4CSANS +3077SAPIAC ALAIN 11945 71971111991012470018542.09 4MANGL +2431RENAUDES NADINE 21946 61968111990012137316330.56 4CSANS +1120SATUR JOSIANE 21946 51969031990012137316331.03 4CSANS +0145ITALIENS EDITH 21946 81968111984062470018540.30 4CSANS +4624COURDIMANCHE JEAN LOUIS 11947 81968121989102273717259.95 4MTECHN +8599LONGCHAMP JOSETTE 21948 7199201199101 7803 7679.49 4.ANGL +3219SERNAGLIA FREDERIQUE 21948 51969031968031326611016.35 4MMICRO +7793ANATOLE ERIC 11948 519910119941010024 8998.50 4MSANS +4753VENT JEAN MARC 11948 61970011988012273717261.76 4MSANS +5892CHARLEROI MARTINE 21949101968111992091834514275.70 4DSANS +8687GOELETTES JEAN LOUIS 11950 91975041995011578112721.71 4MSANS +5669ADRIENNE CATHERINE 21950 61972101991072017815517.59 4CESP +2743CLAIR MARC 11950 11978031994011369311286.26 4MANGL +1234DAMPIERRE MICHELLE 21950111969081995042334017608.88 4MSANS +9403LECLERC CLAIRE 21951 71971071991042137316331.51 4MSANS +0934ENCLAVE JEAN CLAUDE 11951 21981051990041621213033.38 4MALLEM +9416BLEU JEAN CLAUDE 11951 21976051991011369311286.78 4MSANS +9196PYANDIERE MARIE NOELLE 21951 41982021981021326611016.03 4MSANS +3568MOISSAN JEAN PAUL 11952111976071991071578112723.29 4MALLEM +7750TONNELIERS MARIE 21952111973011993071471512024.35 4MINFOR +2095MARS BRIGITTE 21952 81984011992011288210744.49 4DMARKT +4777GORBIO MARIE DENISE 21953 61973061991011578112723.74 4MALLEM +8945VASSY MICHELLE 21953 11973051993041471512025.88 4MSANS +3712MAURUCHES PHILIPPE 11953 819860119850111131 9658.99 4MALLEM +6740EUZKADI JOEL 11953 11973031990071578112722.87 4MANGL +7024BRUSC EVELYNE 21953 71976041991121578112723.36 4MMICRO +8219INFIRMERIE JEAN PAUL 11954 91980051990101608112916.59 4MANGL +5540BRUAND DANIEL 11954 51974031993031684813422.75 4MANGL +7460MATISSE MARGIE 21954 61975041991101578112723.42 4MANGL +2655THEZAN MONIQUE 21954 91975081991091578112722.28 4MSANS +9672BORON ERIC 11955 51975081992102017815516.74 4MSANS +8145BOULETS DOMINIQUE 21956 1199105199005 9894 8921.63 4MSANS +3110CERF VALERIE 21956111993081992011249910472.37 4MTECHN +7652BAY PATRICK 11956 71976071992011578112722.47 4MCOMPT +4074FRANK DANIELLE 21957101992111991011202810241.17 4MSANS +4741ESCOUTADOU FRANCOISE MARIE 21957 2198901198505 8656 8145.06 4.ANGL +0933SOUCARRADE BEATRICE 21957 5199312199212 9894 8922.21 4MALLEM +7852CAILLOTS CLAUDINE 21958 71978091992091471512025.14 4MSANS +5344THEODORE CHRISTINE 2195811199310199210 7803 7680.44 4.SANS +8813MILLIERE BEATRICE FRANCOISE 21959 51981071980071202810241.36 4MSANS +5426NATIONS ISABELLE 21959101981111980111463211946.14 4MSANS +4656TILLET FRANCOISE 21960 71983041982041608112916.59 4CANGL +8524ALLIER ANNE MARIE 21960 1199209199109 8656 8146.28 4.SANS +0380MARAINVILLERS NATHALIE 21961 2199410199310 8656 8147.15 4CSANS +1404FAISANS ERIC 119611219830319830811131 9658.86 4CSANS +6501MERICOURT FRANCOISE 21961 519951119941110668 9426.09 4MANGL +4607CHAPPEL CHANTAL 21961 41982091981091330611017.46 4MANGL +1959PEY JOSIANE 21961111982111981111608112916.95 4MALLEM +8843TIMSIT HUBERT 11961 61982041988011326611017.25 4MSANS +1688BENOITE JEAN CLAUDE 11961 91987071992121249910472.51 4MTECHN +5712FOUENT VINCENT EMILE 11961101983071982071326611016.03 4MSANS +7184FRANCE RAYMOND 11961 419880319870310024 8998.35 4MINFOR +5235HAUTS YANNICK CLAUDE 11961 819871019861010791 9503.90 4MVENTE +6310PEYRIGOUE PATRICK 11962 81982031989071326611016.78 4MALLEM +5397COURCELLES MIREILLE 21962 9198810198505 8656 8145.89 4.SANS +4469PASSELEU CHRISTIANE 21962 41984011983011381911366.72 4MANGL +8234MAIAUX BRIGITTE 21963111991071991011249910473.22 4DANGL +9770JARD MINELLE ODILE 21963 91988111987111249910471.84 4MSANS +5324CERF CLAUDE 11964 419870719920510791 9503.34 4MSANS +9061ROMAGUE MARTINE 21964 71983111982111326611016.12 4CANGL +8920PORQUIER DANIELLE 21964 41987021986021527112374.66 4CALLEM +7098CHATENAY ANDRE 119641119841019831010791 9503.94 4CVENTE +8128PRECONIL YVES 11965 71988021987031527112373.94 4MSANS +6719KEFYSSIA CHANTAL 21965 319940619920111389 9851.03 4MSANS +6244MANGEON MICHELINE 21965 8199402199304 7803 7680.34 4MINFOR +3461LUCIA CHRISTIANE 2196610199308199208 8656 8145.56 4.ANGL +9241ROTOURS PIERRE 119661119900819890810024 8999.13 4CSANS +6268TOURING GENEVIEVE 21966 1199403199303 8359 7952.46 4MSANS +4829COLLES EMILE 11966 419910719900710024 8998.31 4MESP +0750CADET YVES 11966 919860419850410791 9503.79 4MTECHN +0057ESCALE THIERRY 11967 71989021988021450311831.93 4MSANS +9924CHINON BRIGITTE 21968 8199207199107 8656 8146.65 4.SANS +7821AILES CECILE 21968 41991051992111202810239.81 4CSANS +7114LANCIER WILMA 21968111994031992011202810241.07 4CESP +4765TILLEULS JEAN 11969 51992041994011249910472.59 4MINFOR +4429EDOUARD FRANCOIS 11969 319890419921010407 9272.09 4MINFOR +1431GIORDAN SONIA 21970 5199201199101 8656 8145.51 4MANGL +9920BOUIN CATHERINE 21970 919900419890410876 9502.28 4MSANS +5522AURELIA MARIE CHRISTINE 21971 31993031993051267210590.24 4MSANS +7479TRINITE NOEL 11971 3199604199504 7803 7680.36 4MSANS +3516GASPARDES KUMIKO 21971 41993061992061267210590.05 4MSANS +5784BOITE REMY 11972 819910619900610024 8998.26 4CANGL +1143MACORNAY ROGER 11972 6199212199112 9597 8728.58 4MSANS +0244FEUQUIERES CLAUDINE 21972 719921019911011389 9851.57 4MSANS +0161LONGAGES FREDERIC 11973 119920819910811389 9852.02 4MSANS +5206TISSOUS ELIANE 2197311199405199305 8359 7951.97 4CESP +6992FOUGERAIE JEAN YVES 119731119931219921211389 9852.45 4CSANS +3522REST ANNICK 21974 9199306199206 7803 7680.08 4.TECHN +9573FONTAINE CATHERINE JEANNE 21975 2199407199307 7803 7679.87 4CSANS +5048HAUTES JEAN RENE 11975 619961219951211389 9850.74 4CSANS +1152QUARTIER MARTINE 21975 6199408199308 9894 8921.41 4CSANS +0049LAUNAY NOUARA 21976 6199607199507 7803 7679.85 4CSANS +4557ROBARESSES HELENE 2197611199507199407 7803 7680.53 4CANGL +4244GEMEAUX DANIELE 21977 9199608199508 7803 7679.33 4CALLEM +0257PUNAAVIA GUY 11935 219930119920110407 9271.82 5MSANS +4173ALPINS FRANCOIS 1193510198811198505 8827 8263.65 5.SANS +5358CHEVRY JEAN DENIS 11936 9199503199201 9085 8418.03 5MCOMPT +4903WILSON SERGE 119361119890119930210791 9503.49 5CMANAG +2411BINEAU RENE 11937 41970081991011433211713.71 5MSANS +5097OURS MADELEINE 2193910198810198506 8656 8145.20 5.SANS +1099VILLAINE YAN CLAUDE 11939101968061990011433211713.58 5MINFOR +0060ATTAMRK CORINNE 21939 41962061983102470018542.06 5MSANS +7199LECONTE EDMOND 11940 51972061995012201216757.94 5MSANS +7870PIA PHILIPPE 11940 71967071991101433211715.00 5MSANS +4990ROSSAYS SERGE 11940 21963091988012273717260.31 5MSANS +3381BUSSEROLLES ISABELLE 21940 8199505199201 9085 8418.09 5DSANS +0099RAHAL PHILIPPE 11940 11961051984062470018541.16 5MSANS +5909TOURRETTES LILIANE 21940 91961101983102470018540.93 5MTECHN +8941BEZIERS CLAUDE 21941 11961051992102137316332.72 5MSANS +7223CHARMETTES MARCO 11941 41972091991011433211714.06 5MSANS +8980LARMINAT FRANCOISE 21941 4198910198512 8656 8146.16 5.INFOR +1164PROVENCAL NICOLE ALIX 21942 91968101991072273717260.89 5CSANS +7010DELOISON SYLVIA 21942 51968121991101932314934.72 5MSANS +3304ROSES MARIE THERESE 21942 81968091993111834514275.11 5MSANS +7469BUTTE MARIE FRANCE 21943 21962121991072273717261.13 5MSANS +8184VANNES MARC 11943 11971051994011621213032.96 5MSANS +1647CLAIRES CEDRIC 11944121969011991011433211713.67 5MTECHN +0926BEACH CLAUDE 21944 41970041991101932314934.45 5MANGL +3781COULANGES CHRISTINE 21944 61965021992091932314934.21 5VSANS +7004GUILBAUD MARTINE 21944 41966061995042137316330.61 5MSANS +5511CAPUCINS JACQUELINE 21944 41965121990082470018540.74 5MSANS +0535OLLIERES MARIE JOSE 21944111964071993072137316331.95 5DALLEM +6700DOLET FREDERIC 11944 91973041992011403411521.64 5MSANS +9005SUCE LYDIE 21945111977061992011471512025.50 5MTECHN +2933PEGOMAS MONIQUE 21945 81982061981061326611016.62 5VALLEM +1543GATTIERES MICHEL 11945 81970091991041433211715.59 5MSANS +0725AUBIERS PHILIPPE 11945 91976051993011369311286.75 5MANGL +2098ENTREES ANNY 21945101968061994102666519899.56 5MSANS +8761WAGRAM JEAN FRANCOIS 11946 21971101988061932314935.35 5MTECHN +2003PAULINE AGNES 21947 2199303199203 8656 8146.59 5.SANS +1732RELAIS GILLES 11948 31970031993111834514274.96 5MSANS +6970THIERS MICHEL 11948 71970101994071834514274.42 5MALLEM +4216HUGO FRANK 11948 21971031991012990722149.47 5DALLEM +6627ABBAYE GERALD 11948 619810319800311389 9850.65 5MANGL +5230DUNANT PHILIPPE 11948121983101993041326611016.87 5MANGL +2460POINTE DENIS 11949 51975081992011578112722.47 5MANGL +7858ARBONNE FRANCIS 11949 71974081992012470018541.70 5MSANS +3903CHAMPAUBERT PIERRE J 11949 41976101992011369311286.24 5MANGL +8857DIVE MYRIAM 2195012199311199211 8656 8146.88 5.SANS +0497KARINE JEANNINE 21950 5199311199211 7677 7604.39 5.SANS +3876SANGUINAIRES FLORENCE 21950111970021991091834514275.86 5MTECHN +3265PAVILLON PHILIPPE OLIVIER 11950111970041987102470018542.13 5MSANS +2421VERDIER MARTINE 21950 41970071994031834514274.80 5MANGL +8685PROVENCALES JEAN MICHEL 11950 11978061992121471512026.06 5CANGL +6880CHARONNE GISELLE 21950 21971031994071834514275.47 5MCOMPT +3995BELLEVUE CHANTAL 21950101977011992011471512024.48 5MSANS +1936MANHASSET JULES 11951 31970101991021834514276.22 5MVENTE +8771MAURIN JEAN MICHEL 119511119930819910110791 9503.74 5CSANS +8918MORON DANIEL 11951101971031986072470018541.02 5MCOMPT +7486HAUTACAM JEAN PIERRE 11951 11979061992011249910472.78 5MSANS +8979PARE LUCIEN 11952 41973071991041578112723.72 5MSANS +8316MOUSLIM PASCAL 11952 31972051990071621213032.39 5CSANS +0252AUNES CLAUDINE 21952 71972051992111684813421.69 5MALLEM +4525CHAVONNES FRANCOIS 11952 31976111992071578112721.79 5CANGL +2153CROULEBARBE JEAN JACQUES 11952111972121994011684813423.34 5MSANS +4523PITARD JACQUES 11952 91973081990123417325097.24 5MSANS +0877MILLION CLAUDE 11952 31974121992012017815516.65 5MALLEM +0553CRABERE HERVE 11953 91979051992121471512025.97 5DANGL +4593COLLINES FRANCOISE 21953 81973051994031911114779.59 5CSANS +5525MILLY JEAN HUGUES 11953 11976091991012022115555.39 5MSANS +8419CREMIEUX CHRISTIAN 11953 71972071991072137316332.68 5MSANS +5466CHENEY JOSE 11953101977031994011578112723.31 5MALLEM +8647MOTHE DOMINIQUE 11953 21984071992051326611017.10 5MVENTE +7550BORDEAUX GILBERT 11953 8199006198709 8656 8146.61 5.VENTE +5317SIMAREGRE MARION 21954 21975081993071608112916.88 5MSANS +7895BEAULIEU ALAIN 11954 41982031994011471512025.55 5MSANS +7110BRUNES MICHELINE 21954 91977011994011471512024.69 5MSANS +9833MOULINS FLORENCE 21954 3197505197405 8530 8066.58 5MSANS +9346RIVIERE BRIAN 11955 31980081992011249910473.42 5MESP +3155ALAUDA CATHERINE 21955 51977051993071471512025.55 5MSANS +4303MARJORIS PATRICK 11955121980041992121369311286.96 5MSANS +8955LACRETELLE ANNE 21955 419960719950710668 9426.57 5DSANS +0292ENCLOS CHANTAL 21956101977071977041834514275.97 5MVENTE +7044ENGHIEN GERARD 11956 11978061992041369311286.93 5DESP +3352LOZERE SERGE 11957 81983021991092529918968.46 5MANGL +7626HENIN PHILIPPE 11957101986081993011168610046.99 5MALLEM +1198MARTYRS WILLIAM RENE 11957121977031991052043315671.24 5CSANS +4601CEYZERIEU PHILIPPE 11958101979121987111684813421.72 5MSANS +6850BEAUSOLEIL BRIGITTE 21958 81981031986021527112374.79 5MANGL +0505CLAPIERS MARIE CLAUDE 2195810199403199303 9126 8456.57 5MSANS +6127MONTEE CHRISTINE 21958 31980091994071471512024.15 5MSANS +4080FOCH SERGE 11959 319810319810511131 9658.24 5MSANS +8151ECUREUIL OLIVIER 11959 21989071996012815620945.31 5.TECHN +2121BOURDAILLERIE SIMONE 21959 11979071993041471512024.56 5MSANS +5078FERNAND ANNE MARIE 2195912199110198510 8656 8146.61 5.SANS +2667BERGERE PIERRE 11959 51978061985041684813422.48 5MANGL +2407SOLEIL NADIA INGRID 21959 61989061988061249910472.73 5MTECHN +2235VILLEMARECHAL GERARD 11959 61983061989121326611017.72 5CINFOR +0110ANDRE NADIA 21959 319930519920510363 9233.61 5MANGL +4644AVIGNON CHARLES 11959 519830319920611131 9657.56 5MANGL +7070MONGE HONORINE 21960111980051985061608112916.23 5MSANS +8043EGAL LIVIA 21960 11985101984101288210744.85 5CTECHN +5249THEODULE REMY 11960 41987051991041949415052.11 5MALLEM +7737CLUB ISABELLE ANDREE 21960111980061994011471512025.77 5MANGL +3853DZOANH CHRISTOPHE 11960 61988101994041288210744.58 5MANGL +2653MARSACQ CLAUDE 11960 31985111984112256617146.01 5MTECHN +6452POSTFACH ALAIN 11961 31985081984081288210744.98 5MTECHN +0681LOGE PASCAL 11961 11985031991021527112372.86 5MSANS +9537JEAN MICHEL 11961 31988061991121249910471.84 5MVENTE +6327NOUES ANTOINE 11961121982101981101608112916.14 5MSANS +6682VATONNE BRIGITTE 21961 71982011981011608112916.65 5MSANS +9847GAMBADES JOCELYNE 21961101982011981011288210744.17 5MANGL +6375GAUTIER CLAUDUNE 21961101984071994011450311832.63 5CINFOR +6651RIVA PIERRE 11961 919830619820611131 9657.62 5MSANS +1485REUILLY JOSETTE 2196212198901198603 8656 8146.41 5.ALLEM +9501BETHUME MICHEL 11962 81985031993041326611016.65 5MSANS +9435PROVENCE JEAN MARC ROBERT 11962 919940919920110024 8999.30 5CSANS +6492VENDELAIS DANIEL 11963 119830419820411131 9657.66 5CINFOR +9242REVELLATA BRUNO 11963111987071993041288210744.41 5MSANS +4454ETANG BEATRICE 21963 31983081982081326611017.61 5MESP +7265AMPHYTRION JOEL 11963 31990091993041249910472.78 5CSANS +2299ADRIAN ALAIN 11963121988101987101288210745.70 5MESP +8642ALE MYRIAM 219631219940719930411389 9851.34 5MALLEM +9850BOULOURIS CHARLY BERTRAND 11963121987091986092090215980.25 5MINFOR +3445COLOMBE SYLVIE 21964 319870619860611389 9850.74 5MSANS +1844GUY PAUL 11964121985121994011433211715.27 5MANGL +7102QUINQUENAIS MICHEL 11964101984091994041574112685.17 5MSANS +1584KERVENEL JEAN CLAUDE 11964 71984061987121288210745.76 5MANGL +2604LIBERATION FRANCOIS DANIEL 11964 819841019840810791 9503.36 5MSANS +0403HERMITTE PHILIPPE 11964 61983051993051527112374.04 5MSANS +5722CHATAIGNERAIE LIONEL 11964 91983121992061527112373.67 5MSANS +3237HUYMANS MICHEL 11964 21984021990011527112372.81 5MALLEM +5398TASSIGNY CHANTAL 21964 51988111987112090215981.24 5MSANS +1027VRAUX PHILIPPE CLAUDE 11965 91993091993031202810240.76 5MSANS +3198BERIN DENIS 11965 81987011994091693613499.07 5MANGL +1036MADAME EDOUARD 11965 81986091985091288210744.77 5CSANS +6124ABELIAS DELIA 21965 519940919930411389 9850.65 5MSANS +1462BLANCHE MARIE FRANCE 219651219940319930311389 9852.60 5MTECHN +0587ORMEAU GENEVIEVE 21965 51990011989011249910471.76 5CSANS +8260BROSSAY JEAN PIERRE 11965 319931119911010407 9270.24 5MESP +8146BROC ANDRE PAUL 11966 319940219920110024 8998.37 5MANGL +8310HOTTINGUER ISABELLE MADELEINE 21966 1198906198512 8656 8145.98 5.INFOR +6654TAHITI MARIE LOUISE 21966 6199501199401 9597 8729.13 5MSANS +5470LAGARDELLE XAVIER 119661119900719890710407 9271.97 5MSANS +8823ROUCHERETS EVELYNE 21966 61985101984101249910472.06 5MTECHN +8327BARRELLET PASCAL 11966 41987021993121288210743.92 5MTECHN +8879GROULT ANNE MARIE 21966 41993011991011202810241.70 5CANGL +5928DREZERY ALAIN 11966 91989081988081539912453.11 5MSANS +3229THOMAS SABINE DOMINIQUE 219671019940519920111389 9852.59 5MTECHN +1136BRECHE MARIE AGNE 21967 3199601199501 9126 8456.70 5MANGL +5446POMMERAIE GUY 11967 8199606199506 8656 8145.80 5MSANS +0654CARAVELLES ROBERT AH 11967 81989071989021450311831.55 5MANGL +0015TAVANNES LOAN 21967 419930619920610024 8999.72 5MINFOR +8197NETTER GILBERT 11967 61987051994041249910472.06 5MSANS +5236PASSERO MARC 11967 8199309199209 9085 8418.26 5CSANS +3054WILSON GERARD 11967 119870919860910407 9272.09 5MSANS +9725GUILHEM DANIEL 11967111990021989021539912451.67 5MSANS +6092CLEME MARIE CHANTAL 21968 3199201199101 8656 8146.46 5.SANS +2456HOLBERN FREDERIC 11968 2198902198802 7207 7448.96 5.ANGL +6716VILLERSEXEL TANGI FRANCOIS 11968 2199306199206 9597 8727.78 5MSANS +6119RAVAS ANNE MARIE 21968 6199502199402 8656 8146.19 5MSANS +2294VILLAGE SYLVAINE 21968 91992041991041202810240.68 5MINFOR +8140CAMIN JEAN MARCEL 11968 51988121993121249910473.45 5CANGL +7302MERIDIEN MAURICE 11968 219880519910210407 9271.32 5MANGL +7914JOLI MAURICE 11969 31989041992121249910472.06 5MANGL +2148ESPAGNE BRUNO 11969 819920319910310024 8999.36 5MSANS +1823BOUCICAULT NICOLE 21969 519941019930411389 9851.82 5MSANS +9657MAGESCQ EMMANUEL 119691119920519941010024 8999.97 5CSANS +9896MIO JEAN 11969 11991101990101330611017.19 5MTECHN +8478SOURCE SIDNEY 11969 61989041988101249910473.49 5LSANS +6336HASARD ERIC 11969 4199305199205 9597 8729.63 5CANGL +5471LEVAINVILLE LAURENT 1197011199301199201 9597 8729.97 5MVENTE +5314HALLES JACQUES 11970121991101990101467711985.86 5MSANS +1685NORMANDIE MICHEL 11970 319900719890710024 8999.40 5CANGL +6830LAOUADIE GWENAELLE 21970 2199608199508 8359 7953.65 5MTECHN +1727CAUVETS MARTIAL 11970 7199311199409 9597 8728.99 5CSANS +5830BRIOLLAY JEAN PAUL 11970 21991011994011249910473.24 5MINFOR +8526CAMPION FRANCOISE 21970101991111990111202810240.91 5MANGL +6622TANANARIVE GILBERT 11971 51992071992091330611016.75 5CSANS +7788JOCELYN CHRISTIAN 11971 6199302199202 9597 8728.05 5CESP +2781SAFRENIER PIERRE 11971 8199301199201 9597 8729.63 5CSANS +6277PAULEL HERVE 1197112199403199201 9597 8729.54 5MANGL +6618NOTRE PIERRE 11972 519930919920910363 9232.44 5MSANS +6648SAKAKINI BERNARD 11972 319920419910911389 9851.24 5MANGL +8593JULLIEN JEAN PIERRE 11972 8199604199504 9894 8922.45 5CVENTE +8229CHANTELOUP CHANTAL 21972 11992101991101420611637.21 5MSANS +8361OUCHES FRANOISE 21972 4199508199408 7803 7680.80 5CSANS +3075LUMIO JEAN LUC 11972 41991111994011249910472.52 5LSANS +5865FERROLLES MARIE CECILE 2197210199403199303 7803 7680.27 5MCOMPT +0134SEVRES DOMINIQUE 11973 5199507199407 7803 7679.72 5CTECHN +4254HENIN SERGE 11973 3199409199510 9597 8728.17 5CSANS +8695AMBASSADE MARIE BEATRICE 21973 8199605199505 7803 7680.62 5CALLEM +4411DAVOUST FRANCIS ALAIN 11973 719930419940711389 9851.73 5CCOMPT +3332COUST JEAN PIERRE FLORENT 11973 2199507199407 7803 7679.46 5CSANS +4946SAUVAGE PATRICIA 21974 5199604199504 7803 7680.77 5MSANS +1918BABY DOMINIQUE 21974 519941019950810668 9425.45 5MINFOR +6316CORENTIN MARTINE RENEE 21974 119930919920911389 9851.84 5CANGL +3700PROSPER MARTINE 21974 4199508199408 7464 7524.42 5CANGL +2405COUDUN WALID 1197411199605199505 7803 7679.55 5CALLEM +7545DELEY MARTINE 21975 2199606199506 7803 7679.91 5MSANS +3372HARRETCHEVERRIA FRANCISCO 11975 3199506199406 9894 8921.49 5CALLEM +4733SIMON CATHERINE 21975 9199608199508 7464 7525.73 5CESP +3419LAVIROTTE MICHELE 2197510199507199407 7803 7679.76 5CALLEM +3469VASNIER CORINNE 21976 6199607199507 7803 7679.73 5CSANS +7472VERLAI JEAN MARIE 11977 3199606199506 7803 7680.84 5CSANS +5601PEYNIBLOU ROBERT 11977 1199606199506 7803 7680.44 5CANGL +3668NARCISSES MARIE FRANCE 21977 9199606199506 7803 7681.07 5CSANS +9202GARE BRIGITTE MARIE MADEL21977 3199507199407 7803 7679.58 5CTECHN +4110KEROUAL FABRICE 1197711199607199507 7803 7679.54 5CSANS +3531OUCHE ALAIN 11935 31965081995011557012568.13 6MSANS +3428DAUPHINS NOUNA 21935 81967011990071578112723.50 6MSANS +8594BAIE JACQUES 11936 51962021994033844228045.97 6MALLEM +1267ORGE GERARD 11938 41964041994011557012567.81 6MSANS +7513PINSONS PATRICK 11938 41963071995082947921839.78 6MSANS +4234DORMANT CHANTAL 21939 71970011991011932314934.66 6CINFOR +4904PANORAMIC LAURENCE 21940 9198901198610 8656 8146.50 6.SANS +3727GUYNEMER VERONIQUE 21940 51972051989101621213032.21 6CSANS +8364COUDERC ANNICK 21941111973101990071621213033.61 6CANGL +1743VALLEES GERARD 11941 71970041995062470018540.61 6MANGL +5058LIBERATION THIERRY 11941111973101991011403411521.37 6MSANS +8875BRAILLE CLAUDE 11941 71974041989101834514274.74 6MSANS +5325HESPERIDES JACQUES 11942 81963041991072273717260.64 6MANGL +9083PONS JEANNE 21942111972101994041894014662.64 6MSANS +3082SIROIS JEAN 11942 11965111989071663613342.67 6MANGL +0164ENCRABE DOMINIQUE MARIE 21942 8198810198410 8656 8145.03 6.ANGL +5264PARLY MARIE HELENE 21943 61963031993032922321685.16 6MANGL +3102GRDE GERARD 11943 11966061991012470018540.24 6MANGL +6225GRAVAS GILBERT 119431219750819881211389 9852.47 6MINFOR +0486TOCQUEVILLE MICHEL 11943 71965061990012470018541.72 6MSANS +6103DAUDIN MICHEL 11943 31971081991071433211713.97 6MANGL +9562JULES MARYSE 21943 71962091984062470018540.75 6VANGL +1659EVANS MARIE NOELLE 21944 21963121994072137316331.91 6MSANS +5753SAXE BERNARD 11944 51964111985063200223582.85 6MSANS +5551AMBROISE GILES 11944 21972081991012470018541.97 6MSANS +2734FELICE PHILIPPE 11945 91970051991011433211715.24 6MSANS +2627SAVIGNY ANDRE AUGUSTE 11945 71964121990052470018542.04 6MSANS +2707VAUGIRARD HELENE 21945 8199407199307 7590 7562.63 6MSANS +0420DARDOUNELLES DANIEL 11945 21971021990011433211714.52 6MINFOR +0574JAURES MARC 11946101972081994011663613343.70 6MANGL +4658BORA JEAN PIERRE 11946 31973091992011403411520.69 6MMARKT +2852BERLIOZ PASCAL ALAIN 11946121969111991012273717260.45 6MSANS +9183STATION BERNARD 11947 61976101991011283810705.62 6MSANS +7225BONSECOURS ANNE 21947 51976071993111471512024.74 6DSANS +5915ANTILLES ISABELLE 21948 61969081995101433211714.47 6MSANS +7173GIOTERAIE ROBERT 11948 61967111986042470018541.91 6MANGL +7940NICOT ERIC 11949121974041992011403411520.15 6MSANS +6066CLEMENCEAU YVES 11949 31971041995012201216756.31 6MSANS +8113VITRY DOMINIQUE 21949 7199311199211 9597 8728.28 6DVENTE +6047TASSIGNY THIERRY 11950 41973081994122470018541.72 6MTECHN +9002BERRAT BRUNO 11950 51977051993041369311286.29 6CANGL +8038AUDIBERT PATRICK 11950 719770119931211389 9850.58 6MINFOR +4759BLANCHE MAYAKO 21950 51970101991071578112723.11 6MSANS +6982CYRANO DANIELLE 21950 51974111991071578112723.74 6CANGL +9782BARRAGE CLAUDINE 21950 3199109198902 8656 8146.01 6.ANGL +4552ABBADIE MONIQUE 21950 61976011991101578112722.87 6MANGL +3112AGENT DANIELLE 21950 11993121992011202810240.31 6MESP +4893GRANDE ISABELLE 2195012199507199301 7677 7604.70 6MINFOR +6863FERTE MARIE JOSE 21950 71970101991012137316330.65 6MINFOR +3487TALARIC MICHELINE 21950 21973101991071578112722.51 6MANGL +7125FERRAYONN JEAN MICHEL SERGE 11951101977101994041249910473.47 6MVENTE +5445RON DOMINIQUE 11951121971101991013200223582.31 6MSANS +0070PLASCASSIER DANIEL 11951121975051991011369311286.30 6MSANS +0688PARGAMINIERE JEAN 11951101976061993011369311286.15 6MSANS +0032FOUR CLAUDE 11951 61975111991011684813421.95 6MCOMPT +2442BOULOC MARIE FRANCOISE 21951 31974051986052334017609.66 6MALLEM +3898KENNEDY YVES 11951121977101991011369311287.25 6MANGL +8228LEFRANC JEAN LOUIS 119521219931119910110791 9502.26 6MSANS +7142LEGER VINCENT 11952 81976051991011684813421.99 6MANGL +0571DOMINICAINES JERZY 11952 31971101991013200223582.94 6MSANS +0382KERHAM CATHERINE 21952 21974041991071578112722.07 6MSANS +8150BEARN FRANCK 11952 21982091993011527112372.87 6MSANS +7995BAUDIN DANIEL 11953 91975051994011369311287.19 6MSANS +4159CHASSENARD JEAN BERNARD 11953 519870619860610791 9503.21 6MSANS +3964FAREMOUTIERS LAURENCE 21953 6199311199211 8656 8145.08 6MSANS +0454CHERBOURG ISABELLE 21953 6199610199510 7803 7679.81 6MVENTE +5111CROIZAT CHRISTOPHE 11953111973031990071578112722.69 6MALLEM +2014LISIERE XAVIER 11953 8198911199501 9894 8923.22 6MSANS +9741PARIS PASCAL ELIE 11954101978081991012022115555.53 6MTECHN +0737YERRES GERARD 11954 61976091995042529918968.84 6MTECHN +3053TORRE PAULE 21955 91976061995101881314585.97 6MVENTE +2120CORMEILLE JEAN LUC 11955 5199610199510 8656 8146.74 6MSANS +1540PIJOUNIE ANGELE 21956 51977021981091834514274.87 6MANGL +6259VICQ CATHERINE COLETTE 21956 219780719770710668 9425.82 6MSANS +8345DAGOBERT DJARN 11956 719820919871111131 9658.24 6MINFOR +3734GARNIER PASCAL FRANCOIS 11956101977081994042201216756.71 6MSANS +4365ESSO ANTOINE 11956121976061994011369311288.10 6MSANS +0262ROLLAT HERVE 11956111979081991012175716601.93 6MSANS +7989RHONE YVES 11956 71977051994041249910472.06 6MANGL +4035ISLIP ANNIE CLAUDE 21957 41993101992011249910472.06 6MINFOR +8638DUNOIS JACQUES 11957 51981031995062273717260.50 6MINFOR +6417ALBI RENE 11957111980091993121369311288.04 6MANGL +7559MARIENTHAL MONIQUE 21958 319940919930411389 9852.59 6MSANS +1621CAMBRIDGE ALAIN 11958 8199312199212 9597 8729.04 6MINFOR +3476CREPY ALICE 2195811198711198611 9511 8688.22 6MSANS +2482CHORON EVELYNE 21958 7199110199409 8656 8145.42 6.SANS +4165BALZAC MICHEL 11958 71985121995011433211713.76 6MSANS +9040FERDINAND CHARLES 119581219781019771011389 9852.24 6MANGL +6858CUVRAY MARTINE 21959 71980041994011471512025.82 6MMARKT +2723PAPARA FRANCOISE 21959 61980051994011471512025.70 6MTECHN +1222FOSSES MONIQUE 21959 21980041993121804514081.78 6MTECHN +8741BOULEVARD MICHEL JACQUES 11959 91979021993041471512024.62 6MTECHN +5441ZOLA BRIGITTE 21959111979081993071471512025.82 6MINFOR +9947ERMITA CATHERINE 21959 81982081981081326611017.38 6MSANS +2563FLORISSANT PHILIPPE 11959 51981071989052256617145.21 6MMANAG +3583MOLLAY JEROME 11959 81981031993051608112916.41 6MALLEM +6466ORMES ANNIE 21961 21981081995071433211713.85 6MALLEM +1432AGRIANT ROBERT 11961 31984031991091527112372.83 6MCOMPT +3657NOVEMBRE SERGE 11961 51986071992101527112374.36 6MSANS +5054FRANCK HUGUES 11961111984031983031608112915.87 6MALLEM +7313CRESTET JEAN PIERRE 11961 41984091994091326611017.55 6MSANS +1383ORIOL ANNE 21961 61983021982021288210744.01 6DSANS +9235DANTE JEAN MARIE 11962 71984031993081527112374.13 6MANGL +1924MALVEZIN MARTINE 21962111984071983071608112915.47 6MSANS +0722MUSSE JOELLE 21962101982081981081608112916.65 6MMICRO +2536BEAUSOLEIL DOMINIQUE 11962 219830419851210791 9502.17 6MSANS +3286DEEPFIELD GERALD 11962 319930819921210876 9502.09 6CSANS +9760CHAMPET MARTINE 21962121988101987101202810241.67 6DTECHN +0459FERRAILLONS NICOLAS 11962 819850919840910791 9501.95 6MSANS +9070ROUGUETS JEAN RENAUD 11962 919920519910510024 8999.54 6MSANS +5609MONNEGER GEORGES 11962 61984101993051527112374.00 6MALLEM +8699COLMAR CATHERINE 21962 21988061987061202810241.09 6MINFOR +0121PARAY JEAN FRANCOIS 11963 219830419920311131 9658.07 6MVENTE +9033TIMBAL FRANCOIS 11963 91991021991022529918969.60 6MSANS +0477HORTENSE ALAIN 11963 51984021992101527112374.84 6CSANS +9565CARRETIER JOSE 11963 81986121992121450311830.53 6MINFOR +5210BARTHOU PASCAL 11963 319850419850511131 9657.21 6MANGL +7365GALLAIS PATRICE 11963101984031983081288210745.79 6MSANS +3436TADJOURAH PATRICK 11964 51984061991011288210744.35 6MTECHN +0043HILLS JEAN MARC 11964 719840619830610791 9503.67 6SSANS +6646ROOSEVELT FLORENCE ANNICK 21964 51989111988111249910472.39 6MESP +5680PORSMORIC MARIE MADELEINE 21964 31983041982041326611017.97 6MANGL +6503MONCEY JEAN PAUL 11964 319940219930110024 8998.77 6MALLEM +9162BROSSOLETTE MARYVONNE 21964 91984111983111288210744.28 6MSANS +5895QUATRE DANIEL 11964 31984101993011616712994.89 6MSANS +3689ETOILE ALAIN 11965 31985051992011527112374.54 6MSANS +6754MAXIMIN JEROME 119651119930819920811389 9851.10 6MANGL +1818BOYARDVILLE KINEO 11965 919850519840510791 9501.83 6MALLEM +6998HONORE PATRICIA 21965 31989051994011381911366.18 6DSANS +0086COLLETTE SERGE 11965 41985091991121288210744.14 6MALLEM +2914ESPAGNET ERWAN 11965 21984051983051288210744.17 6MSANS +9284COLIBRIS JEAN JACQUES 11965 41993101992101330611018.00 6MTECHN +5732LEUTHREAU ALAIN CHRISTIAN 11965 11987081992011450311831.39 6MSANS +7234MARDELLE ROGER 11965 81986041993051450311832.14 6MALLEM +2688TILLEUL FREDERIC 11965 619930719940110876 9503.04 6MSANS +6325MIGNEAUX FRANCOIS 11965 419940119920110407 9270.44 6MANGL +0520PIBRAC STEPHANE 11965 219850819840810791 9503.76 6MSANS +5142HUBIES BRIGITTE NOELLE 21966 41991071990071202810241.79 6MCOMPT +2662PEYLONG GHISLAINE 21966 9199201199101 7803 7680.36 6.SANS +5787PRADIER PHILIPPE 11966 11987051994091693613499.34 6MALLEM +0594PARK GILLES 11967 11989101988101249910472.52 6MSANS +9155VIADIEU DIDIER 119671219940419920110024 8998.50 6MSANS +9944STRASBOURG ROBERT 11967121993061992061267210590.24 6MALLEM +0751MONTDAUPHIN CLAUDE 11967 819910319950610024 8998.80 6CANGL +6596INFROIT STEPHEN 11967 41990011994011249910473.45 6MSANS +2539CARTHY ANNICK 21967 41994071992011202810241.09 6MSANS +9966ENFERT BRIGITTE 21967 919930719920711389 9851.37 6MALLEM +8934REGNIER ANNICK 219671019950319930411389 9851.96 6MALLEM +1654LEADER MICHEL 11967101995101994101839014312.60 6CANGL +7794ANEMONES EVELYNE FRANCOISE 21968 11993031991011202810241.66 6MTECHN +5095BLAIRE MARIE JOSE 21968111989101988101539912453.06 6CSANS +3446RICHOIN JEAN PIERRE 11968121990091994121450311832.51 6MINFOR +0591FERON CHRISTINE 21968101994031992011202810240.76 6CSANS +6142SORBIERS ROSWITHA 21968 81993061992061267210589.60 6CSANS +4698JEAN GERARD 11969 51989101991091249910472.96 6MTECHN +9192SAVIGNE ALAIN 11969 31991011990011202810240.26 6MESP +0014NANTAUX ETIENNE 11969121994061992011202810240.46 6MANGL +6632JULLIAN FREDERIC 11969 9199102199002 8656 8145.20 6.SANS +1053MORTIER GUY 11969111992121991121330611016.35 6CALLEM +3261SUCHET MARIE THERESE 21969111994031992011202810239.91 6MSANS +4711BLANCHE ALAIN 11969121992121993031267210589.55 6MCOMPT +5942FLOREAL JEAN PAUL 11969 11990111989111381911366.49 6CVENTE +1744ESPAGNE JEAN PAUL 11969 119900219890210024 8998.41 6MESP +7503TOUCHARD ANNE MARIE 21970 21990111989111202810241.57 6MSANS +2585ESTIENNES JEAN 11970111993111992111330611018.18 6MANGL +8805CHENIER ROBERT 11970 71992071991071420611638.05 6MSANS +7438ROSELINES SYLVIE 21970101994031992011202810240.72 6CSANS +6724POTHONNIER MARIE JEANNE 2197011199206199106 8656 8146.42 6.SANS +5056POINCARRE KARINE 21970111994031992011202810241.45 6MINFOR +2915REILLE MICHEL 11970 7199602199502 9256 8533.59 6CANGL +3988ATALANTE BRUNO YVES 1197012199402199302 9597 8728.68 6CANGL +3548JOURDAN GUY 11970101994061992011202810240.35 6CALLEM +1071CHAROLLES JACQUES 11970 1199306199206 9597 8728.82 6CINFOR +7830BOCH BERNARD 11970 3199304199308 9597 8729.09 6CINFOR +7543REIN PIERRE 11970 9199501199401 8656 8146.05 6MSANS +0754ELANS EVELYNE 21970 5199010198910 8656 8146.07 6.SANS +0414CHARDON HERVE 119711019931019921011389 9852.65 6MESP +3628VILLACOUBLAY PHILIPPE 11971 919930319920311389 9851.12 6MALLEM +0150ADDAX MICHEL 119711219940719920110024 8999.70 6CVENTE +9176CAHEN HUGUES JEAN LUC 11971 219921019911011389 9852.24 6CSANS +2846COOLE SERGE 11971 1199403199201 9597 8729.70 6CSANS +2967LANCIERS KLAUS 11972 819930319920311389 9851.59 6CANGL +5218EXELMANS JEAN JACQUES 11972 1199210199101 9597 8727.83 6MMICRO +5276ALLEE JEAN JACQUES 11972 519931219921210363 9233.79 6MALLEM +7650FARLED DANIEL 119721119941219931210363 9232.28 6MTECHN +1760COURTILLE FLORENCE CLAUDE 21972 419940819920111389 9851.61 6MSANS +0061FLORIDA CLAUDE 21972 719930519920511389 9851.24 6CANGL +4799DUBAN REMY 11973121993011994011202810240.82 6CSANS +5516LUZAC BERNARD 11973 5199606199506 7803 7680.27 6CMICRO +2886KERINEL PATRICK 1197311199309199209 9126 8456.47 6CALLEM +2318BURNOL MICHEL 11973 6199310199210 9597 8729.58 6CALLEM +2243BASCH GEORGETTE 21973 319930919920911389 9852.41 6MSANS +9674JAUNE SANDRINE 219731219951219941210668 9426.66 6MVENTE +3507CAMPANULES GERALDINE 21973111994031993031267210590.14 6CTECHN +8457ROAD MARTINE 21974 719940619930610668 9426.03 6MSANS +5644PERROQUETS PHILIPPE ANDRE 11974 3199407199307 9126 8455.98 6MANGL +5222PASTEUR CLAUDE 11974 3199606199304 9126 8456.34 6CTECHN +2362GORBELLA ANNIE 21974 21994091994071450311830.61 6CANGL +3214NELSON JEAN YVES 11974 2199412199312 8359 7953.60 6CINFOR +2883CHEIRON MICHEL 1197511199611199511 9256 8532.96 6CSANS +3892LENNON NICOLE 21975 3199207199307 7803 7681.02 6.INFOR +2980ROASSAL JEAN MARC 11975 7199507199407 7803 7680.67 6CTECHN +3954BARONNETTE FRANCOISE 2197612199610199510 7803 7680.59 6CANGL +8734MARGUERITE ANNIE 21977 6199606199506 7803 7679.49 6CSANS +2986ROURE CLAUDE 11977 8199608199508 7803 7679.40 6CSANS +2812FABIEN CATHERINE SYLVIE 21930 1198905199501 8827 8264.04 7.SANS +4059LECOURBE FREDERIQUE 21935 41961101982052470018540.38 7VSANS +3810LACS ELIANE 21935 51961111987012273717261.07 7MANGL +1179VIES FRANCOISE 21935 1199306199501 8656 8146.82 7.TECHN +4536CAPUCINS JEAN PIERRE 11936 61958121993103200223584.44 7MSANS +5665CAMOIN MARIE CLAUDE 21936 8198910198511 8656 8145.15 7.SANS +5858BONODIERE MARIE CECILE 21937 41962071985102273717261.25 7MALLEM +3737MAREY ANDRE 11937101973071992011403411520.80 7MALLEM +3343ECLUSE SERGE 11939 21970081995062201216755.92 7MMARKT +7410MONNETIER MARIE JOSEPH GEORGE 21939 51963051991072273717260.50 7MANGL +9145ULI MARC 11940 31969061991011433211714.60 7MALLEM +4704MANOLA MICHELLE 21941 11961081987032572519241.16 7CALLEM +6915PLERGUER JOSE 11941 81973071992041403411521.34 7MSANS +1437DIGUE GEORGES 11942 11973071992011403411521.70 7DSANS +7658DOYENNES PATRICIA 21942 51964101992072273717261.07 7MSANS +3938DOMINE OLIVIER 11943 51971041991011433211714.10 7MALLEM +4424CORBEIL JEAN PIERRE 11943 81974051993011369311287.59 7MSANS +7614PHILIPPE MICHEL 11943 31963091986012273717260.13 7MSANS +3959RONCIERE MARIE CLAUDE 21943 21973071990041621213033.19 7MSANS +9296THABAS ANITA 21944 51964071990102273717261.39 7CALLEM +9017DELAPORTE ANNE PATRICIA 2194511199201199101 7803 7679.64 7.SANS +3629RAMBUTEAU JEAN PIERRE 11945121972061991071433211715.51 7MANGL +3070ETIOLLES MICHEL 11946 21975031994121471512025.95 7MANGL +3212CYCLADES BEATRICE 21946 31966121995072017815517.38 7MSANS +8064ARCANGUES MARIE CHRISTINE 21946 71969031984062470018542.19 7CSANS +4281GAURBETS CHRISTIAN 11946 319890119941110791 9502.01 7MANGL +0562BLANQUET ANNE 21946 6198810198511 8656 8145.21 7.SANS +2853MESTE MARYSE 21946 1199301199201 9085 8417.91 7MTECHN +4550CHEVRY CLAIRE 21947 71968041993111834514275.06 7MVENTE +2513EUDES SABINE 21948 11970041993121834514276.18 7MTECHN +2928HEYRAULT FRANCOIS 11948 21972041991012137316331.56 7MESP +8846LIGNIERES JEAN CLAUDE 11948 41975061991011369311287.77 7MSANS +0470POTEL PHILIPPE 11949 21974051991112043315669.51 7MCOMPT +7926OUSTAOU CATHERINE 21949 31970111988042334017610.69 7CVENTE +1398NOUVEAU MARIE PIERRE 21949111969101990012137316331.39 7CSANS +7196THIERS PASCAL 119501019800619790611389 9852.33 7MSANS +8076DELANNE COLETTE EMMANUELLE 21951 71971061990011621213033.43 7MSANS +8525VOISIN PIERRE 11951 61976051991071578112723.68 7MTECHN +7965DELESTRAINT MARIE CLAIRE 21952111973021992102017815517.91 7MALLEM +2553CONVENTION MONIQUE 21952 91978061992121471512025.64 7MTECHN +3819SOLEMAR ANNE 21952 81979061979021684813422.18 7CTECHN +3540SAISSY DANIEL 11953 81980081989041684813422.77 7MALLEM +1880GOUFFE JEAN CLAUDE 11953 71983061995011578112722.61 7MSANS +7620MOIRAX REINE 2195310199307199207 9894 8923.11 7MSANS +2953TOMBE PATRICIA GABRIELLE 21953 41975101991091578112723.06 7MTECHN +5507ALEXIS JOCELYNE 21954 41975011974011288210745.40 7MSANS +4941FONVAL MAX 11954 41978051994011369311286.83 7MSANS +4394BRIAND JOSETTE 21954 71975051995011881314584.61 7MALLEM +6207FOINS CLARISSE 21954121976071992011578112723.18 7CSANS +9748CHARVE MARIE CLAUDE 21954 1199103198801 9894 8921.67 7MSANS +9682TIPHAINE JEAN CLAUDE 11955101978091994041471512026.06 7MINFOR +1788NAJY ALAIN 11955 11975031991071578112721.89 7MINFOR +7956NOTAIRE FRANCOISE MADELEINE 21955 31977011981041684813422.41 7MSANS +3415PRAIRIE PASCALE 21956 719911219901210024 8999.63 7MSANS +9208ESCADENIERES JEAN FRANCOIS 11956 61984081993011471512026.22 7MSANS +0945MAISON HEIKE 21956121977021992011471512024.30 7MSANS +2271LANDE MICHEL 11957 41982021994011471512025.56 7MSANS +3201BANGKOKNOI CATHERINE MONIQUE 21957 41978081977081834514275.41 7MANGL +6914BANCHEREAUX JOSETTE 21957 31981051995041433211714.15 7MANGL +8957LAFFON BENOIT 11958111977091994011621213033.05 7MSANS +4169FOUBERT AUGUST 11959 819820519871011131 9658.59 7MANGL +7880DIV JOELLE 21959111982041981041330611017.86 7MMICRO +7448ORSAY SYLVIE 21959 11984111983111608112917.15 7MSANS +6126SAUVEUR ANNICK 21961 21981051980051288210745.75 7MSANS +7782PETRO CHRISTIANE 21961 4199004198706 8656 8145.57 7.SANS +3730PEREIRE FABIENNE 21962 51982091981091608112916.37 7MTECHN +4013TROUIN ETIENNE 11962 21987061993091839014312.81 7MTECHN +1602VINCENT MICHEL 11963 51986111985112090215979.83 7MSANS +1113AVENYE PASCALE 21963 8199407199307 7803 7680.81 7MSANS +5901GIORDAN JACK 119641119840219830210791 9503.99 7MTECHN +5007CASTEBELLE PATRICE 11964 41984061993121288210745.40 7MVENTE +5706QUIOU SUMIYO 21965121986091985091288210745.79 7MSANS +8009COULOMMIERES FRANCIS 11965 119880819870810407 9271.16 7CSANS +4505VERGNE IRENE 21966 61991031990031381911366.63 7MSANS +2764BALAN GABRIEL 11967 21988051992121249910472.84 7MSANS +5527CHAMIER BLAISE 11968 81992011991011381911366.84 7MSANS +9559OUSTALET JACQUES 11970 2199207199402 8656 8146.28 7.ANGL +9156GUILHERMY YUKO 21972 8199208199108 7803 7679.37 7.SANS +2342LAJARRIGE MARIE JOSE 219721219920719910710363 9233.39 7.SANS +0358MERINDOL JEAN PIERRE 11974 81995051994071288210745.57 7CALLEM +7473MERMOZ JACQUELINE 21931 7198810199501 8656 8147.15 8.SANS +7635DERAIN NATHALIE 21933 4198903199501 8656 8145.62 8.COMPT +2535TREVISE PHILIPPE 11935 61963081994122666519901.15 8MSANS +4757GERMINY MARIE LOUISE 21935 81954091982072273717260.53 8MANGL +5975FAVORITE MICHEL SERGE 11935121963041981052470018541.88 8MSANS +3758CALANDRELLES YVES 11935 51968021993011663613344.05 8MVENTE +3094TARN ANNICK 21935 61959081982052470018541.01 8MSANS +7689COURONNE MICHEL 11936 91958091995012666519900.32 8MSANS +0853COLLEDEBOEUF PIERRE 11936 71973031992041403411520.30 8MSANS +5252COSSIGNY PASCAL PAUL 11936 21964121989072947921839.52 8VSANS +2084HARET COLETTE 21937 5199605199505 7803 7680.09 8MSANS +8285MASSENET MARIE FRANCE 21937 81963091991072273717260.26 8CANGL +7176ROBESPIERRE PATRICK 11938111962121985072273717260.68 8MANGL +1151QUERCIOLO ABDELAZIZ 11938 31965111995011834514274.24 8CSANS +1464SANE CLAUDE 11938 9198801198604 8656 8145.80 8.INFOR +6980MARTIN CHRISTIAN 11938 71972101990011433211714.42 8MSANS +7189CUERS JEAN BAPTISTE 11939 81966071993011663613344.45 8MSANS +7123BOISSIER MARIE JOSEE 21939 61962121990102273717260.22 8CINFOR +7519VACHET CATHERINE 21939 11983081992011326611016.12 8MANGL +2640BARBERAZ MARYSE 21939 61967011989091932314933.85 8MSANS +1630GRACAY ISABELLE 21939 71966071991101932314933.67 8MSANS +6303DOUBLE YVELINE 21939 51964071994102666519901.01 8DANGL +8547BEAU SOPHIE 21939 71967071990071578112722.87 8VSANS +7642ROCHEREAU ANNICK 21939 41966061994072137316330.94 8MSANS +4913LAURICESQUE JEAN FRANCOIS 11939 619900719920710407 9271.92 8MSANS +0289CARIBOU ELISABETH 21940 21959051992091932314934.03 8MSANS +5838MAUPERTHUIS CLAUDE 11940111961061994053417325097.60 8MVENTE +1874GRANGES CATHERINE 21940 819940919920110024 8999.72 8MSANS +1504FONTENAY GERARD 11940 51963121988113200223582.58 8MSANS +9111MONTILS DENIS 11940 31973031992071369311287.46 8MSANS +8171VIVES FRANCOIS 11940101966071989071433211715.65 8MSANS +5585COLLEGE REMY 11941111971121991052022115556.35 8MSANS +6338ANSE FRANCIS 11941 11963071992041557012568.02 8MVENTE +9521ARBOUSIERS ANNY 21941 71963031993122334017609.66 8DSANS +5504HONORE MARC 11941101966071990011433211715.68 8MSANS +0434ROUGET ELIANE 21941 41961051994101684813421.91 8MINFOR +8697ROCHEFORT MARIE CLAIRE 21941 81963031991072273717259.86 8CANGL +5183NID BRIGITTE 21941111969011992121834514274.42 8MANGL +4171LAFFITTE ODILE 21941 6199201199101 7803 7679.41 8.ALLEM +9168OISANS DOMINIQUE 11942 61976101992011578112723.00 8MSANS +0577REDERSKAAI ANNE 21942 41971011994071834514275.68 8VSANS +4455LORREZ ERIC 11942 4198810198604 8656 8146.28 8.ESP +1456ALESIA LIONEL 11942 41963041984102470018541.64 8MANGL +6360QUESSINE PATRICK 11942 51962111993123200223584.16 8MSANS +9206RAVAGERS LUC 11942 71967011994121557012567.18 8MSANS +5506ORA MARCK WITOLD 11942 81964071992012470018540.60 8MANGL +0645MALOUET MYRIAM 21942 81962101991072273717261.18 8MSANS +2325LONGUERAIE GUY 11943 61975031990011433211713.61 8MSANS +6153LUNAIN LINETTE 21943 9198810198604 8656 8147.06 8.SANS +8628ANCIENS PATRICK 11943 21963041992032739020403.89 8MVENTE +7345FLORENT FREDERIQUE 21943 41962121987082470018541.61 8CTECHN +9650GODARD GERARD JEAN 11943121975021993011369311286.71 8CANGL +0047BEUNE YANNICK MARIE 11943 71962121984092470018540.80 8MSANS +9696RAFFET CHRISTOPHE 11943121993041992041642313188.35 8.ESP +2868MONTREAL SABINE PASQUA 2194312199401199301 8656 8146.11 8MSANS +9052ORANGE JACQUES 11943 61972071992011433211714.46 8MANGL +0622GEOFFROY MARTINE 21943111970091991101932314934.93 8VVENTE +5329VILETTE GUY 11944 21967121990041433211714.75 8MSANS +7979BORDS MAEVA 21944121964071993061834514275.97 8MSANS +0046GREENS BRIGITTE 21944 4199009198909 8656 8147.19 8.SANS +7861LAGACHE CAROLINE 21944121963111991072273717260.85 8MSANS +6041MAIRIE MICHEL 11944 61969101989056400345693.48 8MSANS +6790VAUX ARIANE ELIANE 21944 31964071993102137316332.47 8MANGL +7706NICOLE CHRISTIAN 11945 31966041995072137316330.79 8CSANS +3032VOIE CLAUDE 2194510199501199401 7803 7680.95 8CSANS +4678GASCOGNE LYDIA 21945 51966121993011471512025.37 8MTECHN +6211LEFEVRE MIREILLE 21945 61966021995042137316330.58 8MSANS +4373CHENAIE FRANCOIS 11945 419940919930910363 9232.55 8MSANS +6516SABLONS ROBERT 11946 91982011992101249910472.66 8CSANS +3672CORVETTE JOELLE 21946101968111992121834514274.53 8DALLEM +6368ALPES ANNE CLAIRE 21946 31965121993031834514276.15 8DTECHN +9883MATRUT NICOLE 21946121973041993041471512025.11 8MSANS +1004DUNOIS GERARD 11946111973071992121518612335.69 8MSANS +5302REMUSAT ALAIN 11946 11975051991011578112723.33 8MSANS +0673VASES DANIEL 11946 41969051995032666519900.02 8MINFOR +5739COUR CLAUDE 21946 3199512199412 8656 8146.09 8MSANS +0992EVENOS GERARD 11947 819941119920110407 9271.52 8MCOMPT +2791BERTHELOT ANNIE 21947 51977071991101578112723.00 8CSANS +7501GOUBET FRANCOIS PIERRE 11947121972121991071621213032.53 8MTECHN +8208PIERRAILLES MICHELINE 21947 91971011995011834514275.91 8MSANS +2702BLAQUE JEAN JACQUES 11947 11970061991102739020405.01 8MTECHN +8704COLLINE JEAN PIERRE 11947 119890119880110152 9116.67 8MSANS +4666HELLEN PIERRE 11947 61979021993041471512024.60 8MSANS +8568AQUILON ISABELLE 21947 11969011991012137316332.22 8MANGL +7824REVA JOSIANE 21948 6199003198608 8656 8146.61 8.SANS +9576MONTET LIONEL 11948 61969121994072470018541.95 8MSANS +3165HAUTS MYRIAM 21948 51970121991022022115555.81 8MANGL +9783THOMAS MARIE PAULE 21948 51971101990072022115555.44 8CMANAG +0892EPARGNE PIERRE 11948121973051990011684813423.29 8MSANS +8463GIMONT MARIE LAURE 21948111970011991071834514274.30 8MSANS +3612GLENAN ALAIN 11948 11973071990011834514276.06 8MSANS +3989AVENIR HERVE 11948 41979071992011249910472.66 8MSANS +1849GRASSE JEAN MARIE 11948 51974111992041403411521.97 8MSANS +5860GRANGES MARLENE 21949121969031989011621213032.26 8MSANS +0021ECOLES MARTIAL 11949 91981091992011249910472.37 8MSANS +5620BLANC MARIE SABINE 21949 1199107198704 8656 8146.01 8.SANS +9485MONT PHILIPPE 1194911198704198604 8656 8146.68 8.SANS +5814TERMES YVES 11949 41978021993121369311286.03 8MSANS +7863YESILKOY DOMINIQUE 11949 71969031990012137316330.92 8MANGL +0579HILARION ETIENNE 11949 31968121989021932314934.09 8MSANS +4379FORGERONS JEAN FRANCOIS 11949 11977041993011369311287.16 8CANGL +3965BOISGELOUP ANNE ANDREE 21949 81971011984082470018542.24 8MINFOR +8322FLAYAT RICHARD 11949 119800919860911389 9851.64 8MSANS +3220PLASCASSIER CATHERINE 21950 91974051991071578112721.53 8CSANS +2062NOIRAY GUY 11950 31993111992111642313189.25 8.SANS +1017COROT MICHEL 11950 11977021993041369311286.53 8CANGL +5913CITEAUX YVES 11950 61978031995082000715437.49 8MTECHN +4766COLOMBE GUY 11950 81972041989101621213033.97 8CANGL +8829CARCE ANNICK 21950 51970111991071578112723.22 8MSANS +5482ENTREPIERRES DOMINIQUE 21950 81974081991081578112723.00 8MMARKT +6118THEOPHILE PHILIPPE 11950 21970041995102666519900.36 8MSANS +6158PUYGARD PHILIPPE 11950121971041993103916628549.82 8MSANS +7664FRANCOIS HUBERT 11950 41974071993011369311287.46 8MANGL +3674HOP VINATIER ANNE ODETTE 2195010199507199407 8359 7952.07 8MINFOR +8401STADE YVES 11951121972051990011621213032.80 8MINFOR +4992SOLEIL MURIEL NICOLE 21951101972021991072137316330.58 8MANGL +4163FRESNAIE PHILIPPE 11951121977051991011684813423.49 8MALLEM +6140VERTE ICHIKO 21951 51972071993042017815516.20 8MANGL +7521SILLAT JOELLE 21951 71973081991021684813421.81 8MSANS +8682HUYSMANS DANIEL 11951 61977051993011471512025.47 8CSANS +4383JAVELOT CLAIRE 21952 21975041995101881314584.67 8MANGL +3010CARLA ANNE 21952 21972081980102470018540.07 8MSANS +5234BELLEGARDE GHISLAINE 21952 51972021991121608112916.45 8MSANS +4958NAPOULE ANDREE 21952 71974011973011288210743.90 8MSANS +8132ALDE PATRICK 11952 61971121989071621213032.29 8MSANS +6296ALEXANDRIE CATHERINE 21952 11973051994041450311832.36 8MALLEM +2851FEDERATION JACKY BRUNO 11952 419830419820411389 9851.21 8MSANS +2922TRIERE JEAN PIERRE 11952 21972041989101621213032.87 8MESP +4520BARONNETTES MICHEL 11952 51975121993011369311287.43 8MSANS +7884LEPINE YAN MICH 11952 11986061995071288210745.04 8MSANS +2916GRENADIERS LAURENT 11952 71977101991041578112721.89 8CSANS +6995CIVRY MARILYN 21953111975041993041471512025.05 8MVENTE +8042BERTHE DANIEL 11953 11976071993011369311286.57 8MSANS +4389CARPATODE JACQUELINE 21953 31974051993012017815517.95 8MSANS +4164THENIOUX THIERRY MICHEL 11953 31972071992072175716602.09 8DTECHN +9986ARS DOMINIQUE 21953111974051991071578112721.65 8MMARKT +2077VELETA CHRISTIAN 11953 81977121991071684813421.55 8MANGL +7207VICT MICHEL 11954 71979091994041249910472.66 8CSANS +0617ARBOUSIERS MARC 11954111981041991011608112915.62 8MANGL +6266PALOMBES ALEXIS 11954121978061994011578112723.22 8MSANS +3336REPUBLIQUE LOIC PIERRE 11954121986031991121288210745.67 8MTECHN +6034LAMOTHE ROBERT 11955 71976081994011369311286.38 8MSANS +8420COULEUVRE DIDIER BERNARD 11955 21978061994011369311286.30 8MVENTE +7021INVILLE JEAN MICHEL 11955 11975051994012397418037.86 8MSANS +2224EGALITE ISABELLE 21955121978031992021471512025.97 8MALLEM +3309HELENE ISABELLE 21955 41986041992011288210745.22 8MSANS +2341LANGUEDOC ANDRE 11955 61980081979081684813421.33 8MTECHN +5599KOETZINGUE MARTINE 2195512199402199302 7803 7679.49 8MSANS +1570ORB NATHALIE 21955 21976061992072043315669.60 8CTECHN +0095DUNOISE DANIELLE 21955 21977041981011608112915.51 8MTECHN +5288CHELLAH MARIE HELENE 21955 91976071991121578112721.88 8CALLEM +9228CARDINALE PATRICK 11955 81979071994101249910472.03 8MSANS +5668FOY MARC LAURENT 11955 419840319830710791 9503.63 8MSANS +2007NEUVILLE PHILIPPE 11956 31976091991011578112721.79 8MSANS +8560MAI DANIEL 11956121983041995101433211715.69 8MSANS +6777PALAIS ANNE MARIE 21956 21977071976071834514274.96 8MSANS +0514GRENIER MARIE CLAUDE 21956111978061992051471512025.43 8MANGL +2450MEYRAN CHRISTOPHE 11956 91978081990052022115554.36 8MSANS +0738CHATEAU SYLVIE 2195611199310199210 9894 8921.99 8MVENTE +4115MIROIRS LINE 21957 71977071981091834514275.11 8MCOMPT +2843BERRIERE THIERRY 11957 319930819940110876 9503.70 8MSANS +1706KERDANIOU FREDERIQUE YVELINE 21957111979081993051608112916.01 8MTECHN +3794MAL GERARD 11957 71989061993011326611016.03 8CANGL +4102ZOUAVES ALAIN 11957 51980051986112256617145.74 8MMARKT +6349GALLEU LAURENCE 21957101977021992011471512024.60 8MSANS +1461BORGHESE TEVA 11957 91977081995041249910472.91 8MSANS +1587CALIFO ROLAND 11958 6199305199201 9597 8729.39 8MSANS +1182GRANCEY VALERIE 21958 11978031992021471512024.17 8CALLEM +9993VALLON JEAN FRANCOIS 11958 21982031994011471512024.97 8MCOMPT +3559OR CAROLINE 21959111979081993071471512025.77 8MSANS +8859BERENGUIER MARTINE 21959 81980051993071527112373.49 8DSANS +9596SINGER MARIE ODILE 21959111981081980081326611016.26 8MALLEM +1614PIED JOCELYNE 21959101979081993071471512025.56 8MSANS +7872CASTELET CATHERINE 21959 31980101979101684813422.12 8MSANS +3066SCHWEITZER JEAN JACQUES MARIE 11959101984091993121326611016.80 8MSANS +6764EGEOIRES DIDIER PIERRE 11959 519890819880810407 9271.56 8CANGL +0114EGLISE ANDRE 11959121981101992101608112917.19 8MANGL +8832ISOLA ERIC 11959121981061993121471512025.47 8MSANS +0083BRUZETTES JEAN PAUL 11959 31984081991061326611016.78 8MSANS +9690MAUPERTUIS GEORGES 11959 61981011989111608112915.03 8MANGL +5294GIRONNETS MURIEL 21959 31981041980041684813421.54 8CSANS +2982HORACE SATO 21959 7198609198507 9511 8689.07 8MSANS +1765ARGE PHILIPPE 119591019930519920510024 8998.08 8CALLEM +9648MOLENE HEYMAN 11960 21984111991092529918968.43 8MSANS +2260BOULAZAC FRANCOISE 21960 11980101979101684813423.35 8MSANS +0614RENOIR JEAN ADRIEN 11960 31983081993011215710279.72 8MSANS +5022CARTOUCHERIE JACQUES 11960111984121994011578112723.60 8MSANS +7019AULNES BETTY 21960121980091988051527112374.16 8MTECHN +1225GRANIER DIDIER 11960121982091993011527112374.09 8MSANS +0305CANTARON JACQUELINE ANNE 21960 21979111993101471512025.92 8MANGL +9818ULBACH NATHALIE 21960 81982011981011326611018.09 8MALLEM +6769TOURENNE MARIE HELENE 21960 81993081992011249910471.66 8MSANS +4168CAILLE NELLY 21960 11980101979101684813423.35 8MSANS +2371PILATTE PHILIPPE 11960121984071991061326611018.09 8MSANS +1380SALLE BRUNO GEORGES 11960 31982011988112090215980.82 8MSANS +1410REPUBLIQU ROZENN 21960 51983041982041608112915.17 8MSANS +1668VALESCURE GILBERT 11961 619880319930111302 9775.91 8CESP +4486CHANZY GILBERT 11961 81984061988052090215979.76 8MSANS +4667CLAIR ANNICK 21961 51982071981071326611017.91 8MSANS +3248CAMPANELLES MARTINE 21961 51982081989112090215981.29 8CSANS +6422BARBELET THIERRY 11961 319810119800111131 9657.47 8MSANS +5543JUMIN HENRY 1196111199405199201 9597 8729.85 8MANGL +2561SAURSON MICHEL 11961 319820419900111131 9658.72 8MANGL +3290CHARBONNEL PATRICIA 21961 7199607199507 8359 7952.19 8MSANS +4075ORSAY JEAN MARC 11961 919890619950910407 9272.24 8MINFOR +3928DAVID BERNARD 11961 51981091993121326611016.78 8MALLEM +3502MONTGOINS ODILE 21961 91984091983091288210744.01 8CSANS +2628MANET MICHELE 21961 51984091983091288210745.57 8MSANS +3679LAY CAROLE 21961 81982101993071527112374.70 8CTECHN +9476FERREOL PATRICE 11961 51985101993011168610047.54 8CALLEM +6300VALLIER NICOLE 21961 3199207199107 8656 8146.11 8.ANGL +2306RAHO BERNARD 11961 919900319890510407 9270.44 8MSANS +7612VIEUX PASCAL CHRISTOPHE 11961101983051982051326611017.92 8MCOMPT +9056CRAPONNE PHILIPPE 11961121985031989112090215981.60 8MSANS +5891PRESIDENT ROBERT 11961 21992121993122401918074.91 8MSANS +4133AIR PIERRE 11961 71981071991091326611016.35 8MSANS +9028OUSTALET JEAN 11961 819821219811211131 9658.52 8MTECHN +3462MONTEIL JACKY 11962 819820619810611131 9657.15 8MSANS +7126JUSTICE MARIE PIERRE 2196211199504199404 7803 7680.66 8MSANS +2705VILLA MIREILLE 21962 2199201199101 7803 7681.04 8.VENTE +6788EXTE DOMINIQUE 21962101984111991091527112373.05 8MSANS +6035AUMALE SYLVAIN 11962 619840319830311131 9658.70 8MSANS +3359CERNOY PHILIPPE 11962121988061989091527112374.58 8CSANS +8236CANAULET LOIC 11962 919870219870110407 9271.16 8MSANS +2285FAURE NICOLE 21962101982071981071326611016.83 8MSANS +6765PICARD AXEL 11963 61992121991121330611016.03 8CSANS +6602COUDREE LAURENT MARCEL 11963111986051994111693613498.86 8MSANS +6537BOTZARIS MANUEL 11963 91984031991091288210744.23 8MSANS +9865CARDELINO ELISABETH 21963121986061985061288210744.19 8MSANS +7936GAMBARDELLA MONIQUE 21963101984111983111288210743.92 8CSANS +1490PAUTEL PATRICIA 21963 21993091992011202810241.21 8MSANS +8828CAMP JEAN FRANCIS 11963 31983101993011949415050.78 8MSANS +6652SURESNES BRIGITTE 21963121989081988081249910472.82 8DSANS +9991PROF CHANTAL 21963 819950319940311389 9850.74 8MSANS +4136ONDINE LAURENCE 21963 61984111983111608112915.66 8MTECHN +2731DRIVE MICHEL 11963 81983051982051326611017.83 8MSANS +7391SOIE BEATRICE MARIE 21964 11986101985101168610048.22 8CALLEM +7157CEDEX GERARD 11964111991121990121330611016.53 8MSANS +1010ARCES ELISABETH ANNE 2196412198811198606 8656 8145.62 8.ANGL +7723GRATENTOUR FRANCOIS 11964121991051995081202810240.84 8MSANS +7515JARUNSANITWONG PIERRE JEAN 11964 3199612199401 9597 8729.36 8CSANS +7251ISIDRO DANIEL 11964 91988051987052090215980.28 8MSANS +4749AVERTIN CLAUDE 11964101986071993041288210744.26 8MTECHN +2395LOGNES HEDWIGE 21964 61984091983091288210744.23 8MSANS +1171DELMAS DANIEL 11965 11988051992041249910473.45 8MTECHN +8804MAHON FRANCINE 21965 51993061992061202810240.46 8MANGL +0367DANTZIG JEAN 119651219940619930610363 9232.62 8CANGL +4984SOULT ERIC ANDRE 11965 219931119921110024 8999.21 8CANGL +5821POMPIDOU GINETTE 21965 51985061985061347711131.13 8MSANS +6382LABOURD CATHERINE 21965 71989071995091249910472.66 8VTECHN +0635WILLOWCREST JEAN CLAUDE 11965 71985071992121288210745.13 8MSANS +0760PENIL PASCAL 119651019870119860110791 9501.81 8MTECHN +6467HAVRE ANDREE 21965101987051986101527112374.07 8MSANS +9897ONGUI PATRICE 11965 619940119930111389 9851.07 8CSANS +5429HINODE FRANCOISE 21965 2199304199204 9126 8456.10 8MESP +6900MANTEAUX GERARD 11966 719910219930610024 8997.99 8MSANS +0370CASTELL MONIQUE 21966 41989031988031249910473.24 8MALLEM +8517WASHINGTON BERNARD 119661219890119860410407 9272.17 8.ANGL +9967TREMEUR HERVE MARIE 11966 81989081988081249910472.59 8SCOMPT +6163MOLLARD JACQUES 11966 21993021992011249910473.00 8MANGL +7120SOGNES HELENE 21966 31989031988031249910472.73 8MINFOR +6709KERIMEL MICHEL 11966101988011987011539912453.47 8MANGL +5303HETROLLIER MARIE LAURE 21966 119940919930411389 9852.11 8MANGL +7075CEZAIRE JEAN LOUIS 11966 61985041992061527112374.63 8MTECHN +5072SAUVETAT ALAIN 11966 919910519900510024 8999.27 8MANGL +6154CALME MICHEL 11967 91988041991061249910472.82 8MANGL +3329DOME PATRICE 119671219921119931110024 8999.31 8MSANS +6319CALVAIRE YANICK 11967 119920819910810024 8998.01 8MSANS +4968LYCEE MICHEL 11967 31991101990101467711987.34 8CSANS +0009LOS JEROME 11967 2199611199511 8656 8146.86 8CSANS +1878BEAUVILLE ERIK 11967 91990031994011249910473.09 8MSANS +9800DORET CAROLINE LILIANE 21967 719930619920611389 9851.28 8MTECHN +4797PORTOI MIVA 21967 61989111989111839014313.36 8MSANS +7931LABERTRANNE SYLVETTE 21967 81994051992011202810241.97 8MTECHN +8940BARRES MICHAELLE 21967 81990021993071330611016.66 8MSANS +3164CROUY ANDRE 11967 71992091991091839014314.38 8MSANS +1556CAMP VERONIQUE 21967 9199302199202 8656 8145.66 8.SANS +2245FRINGANE VINCENT 11968 419940219920110024 8999.94 8CTECHN +0888CURIE JEAN BERNARD 11968 91988091993121249910471.74 8MSANS +3431BOUEL BERNARD 119681019880919870910407 9270.97 8MSANS +3147ROCHERS ISABELLE 21968 51994071992011202810239.96 8CTECHN +7236SIMENTAL BERNARD 11968 219910719910510407 9270.44 8MCOMPT +9853YAN DAMIENNE 21968 71994011992011202810241.16 8CSANS +3267LONG BRIGITTE 21968 11992091991091330611016.93 8MSANS +8141EXUPERY GERALD 11968 51994011993011267210590.11 8CSANS +3839MINIMES JEAN PIERRE 11968 71989011988011450311831.78 8MESP +6386PAUCOURT SALOLOM 11969 91994011993011420611639.24 8MTECHN +5948CARRERE JOCELYNE 21969 6199205199105 8656 8145.60 8.SANS +1726ASQUES SYLVIE 21969101994021992011202810240.50 8MANGL +3067CHEVRAINVILLIER BERTRAND 11969 119940119920110024 8999.90 8MSANS +5762WINSTON JEAN 11969 11989101988101450311832.69 8MSANS +6200MONTGOMERY DANIEL 11969 91990041995011330611016.47 8MSANS +9177RIEUX BERNARD 119691119920619910611389 9852.27 8MINFOR +6151CANTAGALLO EDDY FELIX 11969 71994011993011202810240.23 8MSANS +8371MOUTHON HERMINE 21969 919950319930411389 9852.29 8MTECHN +5982LONGWOOD MARIE NOELLE 21969 71991091991051330611016.84 8MVENTE +3924ANGELES MARYSE 21970 219940719920111389 9850.74 8MSANS +5000MARCHAND ANDRE 11970 8199306199206 9597 8727.91 8MSANS +6053EXINCOURT DOMINIQUE 11970 419940619920110024 8999.43 8CESP +6405ORMILLES ALAIN 119701119910819900810024 8999.57 8MSANS +4367OURCHES AGNES 21970 1199506199406 7803 7680.36 8CSANS +6055LACATE DENIS 11970 9199308199208 9597 8729.66 8CTECHN +4701DUCA ANDRE 11970 71991051990051467711985.86 8CESP +6470ALLEES YVON 11970 71991021990021467711987.75 8MALLEM +6121RIVAGE FRANCOIS MARCEL 11970 419950119950110363 9233.88 8CSANS +0867FOURS CHRISTINE 21970 3199409199309 8359 7952.10 8MTECHN +9075SEMBAT FREDERIC 11970 3198912198812 8656 8145.26 8.ALLEM +9637JUAN MURIEL 21970 5199310199210 8656 8146.70 8.TECHN +6609GAYE NICOLE 21970 8199607199507 7803 7680.41 8MSANS +5493LAUZES MICHEL 11970 11991071990071202810241.09 8MSANS +6491BRAS BEATRICE 21971 619921019950410668 9425.45 8MSANS +7556YOLA PHILIPPE 11971121994041993041360611209.94 8CTECHN +7031ECOLE CHRISTINE EMILIE 21971 419910219920111389 9851.19 8MSANS +5834ORANGERIE SERGE 11971 8199302199202 9597 8728.46 8CSANS +4526LOT PHILIPPE 1197110199407199307 9597 8729.27 8CSANS +4363QUART VINCENT 11971 4199404199201 9597 8728.44 8CSANS +7702MONTARNAUD PIERRE 11971121992111991111420611638.97 8MVENTE +8710GAULTIER ISABELLE 21971 31994011993011267210589.57 8CSANS +5198ROUILLON CLAIRE LUCIE 21971 819940519920111389 9851.97 8CANGL +6286WATTEAU JEAN CLAUDE 11971 81994071993071360611211.56 8MSANS +3787TAUDE JACQUES 11971121993121994011202810241.40 8MSANS +3968CAPRI MARIE CHRISTINE 21972 8199607199507 7803 7681.22 8CESP +5435BERRE JOELLE 21972 21994091993091360611211.42 8CSANS +2682VINGT GENEVIEVE 21972 7199406199306 7803 7681.40 8CSANS +5935ORVEAU FRANCK 1197212199609199509 8656 8146.25 8MTECHN +5312LUCE GUY 11972 81994041993041420611637.47 8MSANS +5416ESSARTS FRANCOIS 11972 819931019930711389 9850.62 8CSANS +5534ISLE MICHEL 1197210199312199212 9597 8728.58 8MSANS +3974DEVIN FRANCOIS 1197212199605199505 8656 8145.57 8CSANS +6877COUPERIN PHILIPPE 11972 5199310199210 9597 8727.95 8CSANS +4740PLAISANCE SERGE 11972 219950119930410024 8998.82 8CSANS +3393MANAU EDITH 21972 219941019930411389 9851.88 8MTECHN +9615BOL JEAN CLAUDE 11972 21991071994011249910471.79 8MSANS +4599GUYAU MAUD SOPHIE 21972 519940719920111389 9852.47 8MANGL +8612HAMELIN JEAN MARC 11972 8199310199401 9597 8728.98 8CSANS +8541RESIDENCE MICHEL 11972 319951219941210668 9426.89 8CTECHN +3801NASTRINGUES SABINE 21973 8199606199506 7803 7679.46 8CTECHN +2827OREE JOSEPH JEAN JACQUES 11973 6199502199402 9126 8456.78 8CANGL +7660ESTIENNE JACQUES 11973 1199406199306 9126 8455.56 8MSANS +5260JACQUES ERIC BERNARD 11973 319931119921111389 9851.61 8CSANS +3671GARCHES GEORGES 11973 31992021991011202810240.68 8CANGL +4348ROQUEFORT JEAN PIERRE 11973 819930319920311389 9850.74 8CINFOR +6630LAGRANGE THIERRY 11973 9199302199505 9597 8729.63 8CTECHN +9712EMPIRE CHRISTIANE 21973 6199606199506 7803 7680.67 8CSANS +3751OASIS JACQUELINE 21973 219930319920711389 9851.25 8MSANS +3830DRECHO JEAN 11973 61993051994011202810240.55 8CSANS +4561DANNEMOIS JEROME 11973 5199612199601 7803 7679.91 8CSANS +3191JAVEL CHRISTIAN 11973 5199311199211 8656 8147.13 8.SANS +1618CHASLES CORINE 219731219940719930710668 9427.08 8MSANS +4268SENE LUC 1197312199306199206 9597 8728.23 8CSANS +8421ROCBARON JOEL 11974 1199510199410 7803 7680.36 8CSANS +0930ESTANOVE ALAIN 1197411199606199506 7803 7679.99 8CMICRO +6807TOURDRES MANUEL 11974121994051993051360611210.28 8CSANS +4488CHAUVEAU CECILE 2197412199601199501 7803 7679.51 8CSANS +8315COUVENT PIERRE 11974121995121994121450311831.06 8CSANS +6605EDMOND SYLVIE 21974 8199504199404 7803 7679.78 8CTECHN +9778ONS MARIE SIMONE 21974 7199405199406 7803 7679.96 8MSANS +3816AURIC PASCAL 11974 6199502199402 9894 8922.63 8CSANS +2018FOUR PATRICIA MICHELE 219741219940719930710668 9427.40 8CALLEM +7643SEGUIER PATRICK 11974 5199406199306 7803 7679.67 8CSANS +5610SAGET HENRY 11974 9199407199307 9126 8456.47 8CALLEM +6425FINLAY PHILIPPE 11974 81993121994011202810241.74 8CANGL +8616PAEA MICHEL 11975 5199407199406 7803 7681.40 8CSANS +9958DULUD GILLES 11975 6199612199512 8656 8146.52 8.TECHN +8573PIBONSON CHRISTOPHE FREDERIC 11975 6199607199507 7803 7680.81 8CSANS +7803INCAPIS PASCALE NANCY 21975 7199604199504 7803 7680.34 8CALLEM +7514VIENOT ANDRE 11975 3199508199408 7803 7679.78 8CSANS +7507FAISANDERIE JEAN PIERRE 1197512199607199507 7803 7679.99 8CSANS +3865MICHEL PATRICK 11976 3199507199407 7803 7680.12 8CSANS +4755OCTAVE MARC 1197612199608199508 7803 7679.99 8CSANS +0542TORREILLES ALAIN 11976 5199510199410 8656 8145.80 8CSANS +9647DELORME DOMINIQUE PIERRETTE 2197612199407199307 7803 7679.69 8CSANS +4725TACONNAZ BEATRICE 21976 4199508199408 7803 7681.17 8CALLEM +9564CESSOLE FRANCIS 11976 4199607199507 7803 7681.20 8CSANS +8087CHUTES GUY 11976 3199407199307 7803 7680.62 8CANGL +5480LOUIS JACQUES 11977 9199607199507 7803 7680.59 8CSANS +1361BANVILLE PATRICK 11977 4199607199507 7803 7680.34 8CSANS +6209BEAURECUEI CATHERINE 21977 4199607199507 7803 7680.57 8CSANS +3656FLIREY JEAN CLAUDE 1197711199606199506 7803 7679.59 8CANGL +9051SUANE ALINE 21929 919680919870111389 9851.91 9VSANS +2724DEL PIERRE 11930 21989021995023455825330.03 9.SANS +7341GRATECA PIERRE 11933 21966071993012273717260.26 9MSANS +6774BARRAU AGNES 21933 8199512199412 8656 8145.06 9MANGL +0536FIRMAMENT SCHEHRAZAD 21934121962101982052470018541.72 9DSANS +7368RESSAC RICHARD JOSEPH 11934 11967011994011557012567.09 9LANGL +7599ANNE JEAN FRANCOIS 11935 11974031994011578112722.84 9VSANS +1083COUCOURDE DOMINIQUE 11935101973061991011433211715.02 9MSANS +2946ROLLAND OLIVIER 11936 51962111984122470018541.29 9MSANS +7241THERMALE MARGUERITE 21936 7199306199206 9511 8688.67 9MESP +1695LOUVEL CHRISTIAN 11937 519820219920311389 9852.69 9MSANS +9744SALENGRO SYLVIAN ERIC 11937101961071991083417325097.15 9MESP +7083OLIVETTE CATHERINE 21937101966071989031932314934.86 9MALLEM +0151DUCHEMIN JEAN JACQUES 11938 41962061991012470018541.29 9MINFOR +8395FRANCO ANNIE 21939101984011991091288210745.34 9MANGL +9978BARBERAZ MARIE CLAUDE 21939 71972071989011621213034.09 9VANGL +2131ARGENT CATHERINE 21939 71963121994042137316332.05 9MALLEM +3235THUI HUGUES 11939 61967071995041557012566.37 9MSANS +7994THIBAULT PATRICK 11939 31962051983032470018542.10 9MTECHN +5783DOMATS MICHELE 21939121963031992021932314934.12 9MANGL +6426PORTAIL JEAN FRANCOIS 11939 11969121995041557012567.53 9MESP +6856JULIE JEAN MARIE 11940 319950219940211131 9657.83 9MANGL +4024LEBRUN ALAIN 11940111965041995041557012567.77 9MESP +9739NOCETA YVES 11940 21972041991011663613343.82 9MSANS +9045MURET RENEE 21940101964091993072137316332.29 9CSANS +4987UNIVERSITE CATHERINE 21940 41967011990011932314935.20 9MESP +1530CYRILLE ANNICK 219401219741019881011131 9659.19 9VSANS +1447HAMEAU OLIVIER 11940 61964081988092947921838.88 9MTECHN +8268ANNEES PATRICK 11941 51961081992042022115555.75 9SANGL +9303SCIOTOT ALICE 21941 61973071991101578112722.75 9MSANS +0509PIECE ROBERT 11941 51963121994073844228045.38 9MSANS +3288ISERE EMMANUEL 11941 51965081990011433211714.24 9MSANS +9898CHANTEGRIVE JEAN MARC 11941 91964091992082470018540.12 9MSANS +0163DAUTHEVILLE MARCELLO 11941111964121992072137316332.45 9MANGL +0652VAUTHIER MARIE ALICE 21941 41971021991101932314933.60 9MINFOR +7932VAUX DANIEL 11942 51969031991011433211713.80 9MSANS +0197MAURENS CLAUDE 11942 91962081984123200223582.94 9MTECHN +3251RUELLE JEAN 11942111976041992011403411520.12 9MALLEM +8289OLYMPE NADINE 21942 51964121993102137316331.37 9MSANS +9503GLORIETTE ALDO 119421019951219941210024 8999.12 9MSANS +4563CERTAIN LOUIS 11942 31965071995011557012567.22 9MANGL +6383DESGRANGES JEAN CLAUDE 11942 71983051993011249910473.49 9MSANS +8658VALLONGUE BERNARD 11942 71963041995102666519899.30 9MESP +4745RUCHERS GILLES 11942 21980051979051249910473.56 9MSANS +8824PEYBERT JOCELYNE 21942 31963031994012137316332.51 9MSANS +7242CORMEIL PATRICK 11942 81970041990011433211714.79 9MANGL +0065ANGES XAVIER 11943101966101990011663613343.16 9VSANS +4531SENART JEAN LOUIS 11943 21967111987012273717261.13 9MSANS +7154MUIDS THIERRY 11943 31962121990013844228044.24 9MINFOR +5345ORATOIRE ALAIN 11943121970081989011932314934.36 9MSANS +3282SOUGERES JEAN LOUIS 11943 11968051990011433211715.33 9MSANS +6215JOFFRE PASCALE 21943 81986021991071249910473.24 9MINFOR +7867BASTIDE HIROKO 21943 51964071993072334017610.06 9MCOMPT +6194STEPHAN KARIM 11943 81966051995041557012567.45 9MANGL +4570MONDENARD JACQUES 11944 61965051994012137316331.93 9MINFOR +3691CAORCHES MICHELE 21944101965081995042137316331.97 9MINFOR +8595PRAD BENOIT PIERRE 11944111965031984123200223582.37 9MALLEM +6617LONDRES PATRICK 11944 41972041991011621213032.39 9MSANS +9701CAPUCINES ALAIN 11944 119820119830511389 9851.24 9MSANS +7661ROSERAIE FRANCOIS 11944 31973071992011403411521.88 9MANGL +0274FROMAGERIE ALAIN 11944121971011991101433211714.28 9CSANS +9427GROULES MARIE FRANCOISE 21944 81963111993082334017609.06 9MANGL +9749HEROLD ISABELLE 21944 31973071991071578112722.97 9DSANS +5120MONTBY PIERRE 11945 81978041994011663613343.91 9MINFOR +7337MAGINOT PHILIPPE 11945 61965031994012137316330.71 9MANGL +2937PAYEN JEAN PAUL 11945 81973051992011403411520.53 9CANGL +3034SCHUMANN GEORGES 11945 81970041991011433211715.11 9MSANS +4582PETENATI MARIE CHRISTINE 21945 11974121993032043315669.65 9MALLEM +2430TOURNELLES ALAIN 11945 91975031993011369311287.38 9MSANS +4782CHENAY MARIE LAURENCE 21945121968091989012273717259.78 9MSANS +1091RENNES MARIE ANGE 21945 61974071990071621213033.56 9MSANS +2494ONA FRANCOISE 21946 51969081993121834514275.25 9MESP +2170VIENNE MARIANNE 21946 81970021991102137316330.67 9VSANS +2830FONTAINE ANNETTE 21946 41968041991091932314935.20 9MSANS +8673ABEL JEAN PIERRE 11946 2198810198510 8656 8145.21 9.SANS +9142ORSAY MICHEL 11946121970121991041663613343.28 9MSANS +6458FOYER JEAN LUC JACKY 11946 71969111986012470018540.12 9MSANS +8418RIVERIN ALAIN 11946 11979091992011249910473.05 9CCOMPT +2785PONT ANDRE 11947 41968041990102739020403.33 9MANGL +3079MOISE YVES 11947121972071991101433211714.69 9MTECHN +6994CHEMINEES SOPHIE 21947 11976061981091834514276.09 9MANGL +0913ROCHER BRIGITTE 21947101971041990102334017609.66 9MSANS +3030LUZIADES ANTONINA 21947 519940619920111389 9851.64 9MSANS +2592CLOUZIT NATHALIE 21947 7199208199108 8656 8145.20 9.SANS +2816BAULE VERONIQUE 21948 51973031972031236910396.01 9MANGL +0561DELAUNE JEAN NOEL 11948 11975041993011369311287.82 9MSANS +4506DIDEROT JEAN PAUL 11948 619790519880411131 9657.51 9MTECHN +5103CORNETIERE FRANCOISE 21948 21983061990041288210744.22 9DSANS +0785RUDLOFF MICHEL 11949121971121993122547019086.15 9CSANS +7465DEVORAH MICHEL 11949 91980041990091608112915.38 9MSANS +6601LAS CLAUDE 11949 61969051990043417325096.67 9MTECHN +5921SAINTPIERRE CAROLE 21950 31974021991071578112722.12 9CSANS +4717BERARD DENIS 11950101983081987011283810705.67 9DTECHN +6138DUCERIS COLETTE 21950 81992051991011202810241.85 9SVENTE +1254ESQUIROL JEAN CHRISTIAN 11950 81975081992101369311286.84 9MANGL +3226BOX CHRISTINE 21950 41970041990101834514275.65 9MSANS +4683MAUNE PASCALE 21950 61974051995072175716601.42 9MSANS +3496FROIDE JEAN JACQUES 11950111972101991012137316331.69 9MANGL +2173BERNARD CHRISTIAN 11950 41972051991042137316331.34 9MANGL +2204VIA STEPHAN 11951121972101991072017815517.05 9MSANS +5528HORIZONA JEAN PAUL 11951 219931019940510407 9270.34 9MANGL +2181CHAPUIS ALLAN 11951 1198810198603 8656 8145.89 9.SANS +8003COMPREIGNAC JEAN RENE 11951 81973101994082201216756.14 9MALLEM +4444HOTELS ANDRE 11951 41981111992011249910471.71 9CTECHN +3137GARIDECH MICHELINE 21951121993051993041249910473.47 9MANGL +5824LONGCHAMPS SYLVIE 21951 51972011990071578112722.42 9MANGL +8477MENEZMEUR NORIKO 21951 51973071991041578112722.69 9MESP +1336RANELAGH PIERRETTE 21952 21972041995011881314585.46 9MALLEM +6782LAVACHET ALAIN 11952 11978091994011369311287.77 9MINFOR +6451MONTPARNASSE AURIC 11952121973031987112470018540.56 9MESP +9132BOUVELARD ALAIN 11952 619930819910110407 9271.74 9CSANS +9726VIGIER GABRIEL 11952 419930819920811389 9852.47 9MSANS +4608DESPAGNE ANNIE 21952 3199503199403 8656 8146.05 9MSANS +2221LYANES YANN 11953121973071995041881314586.14 9MVENTE +1575PELURES MICHEL 11953111975011991012781920674.59 9MSANS +4898BLANCHET ODILE 21953101973071984051834514275.11 9MSANS +2339ODES MICHEL 11953 31976121993041471512025.77 9MSANS +4008BETHANCOURT MARIE ANNE 21953111981121980121202810241.36 9MSANS +1590CIVRAC PHILIPPE 11953 91977051993041369311286.83 9MTECHN +6109PEIRE GERARD ANDRE 11953 31972071991082175716602.51 9MCOMPT +7232CHAMP MICHELINE 21953 7199001198801 8656 8145.87 9.SANS +4789TOURACHE ALAIN 11954 71974081993011369311286.53 9MTECHN +8709QUIETUDE MONIQUE 21954101977011994101471512025.14 9CSANS +1712BIR ALAIN 11954 31975011991091684813421.42 9MSANS +7069TUBY ROBERT 11954 71975061991071578112722.30 9MSANS +4017BLEURY BRIGITTE 21954101977011992011471512025.20 9CSANS +4255BEAUSEJOUR FRANCOISE 21955101981031995071433211714.70 9MSANS +3435VENTS PHILIPPE 11955 71978041991011471512025.16 9MTECHN +3130CIGALONS PHILIPPE PIERRE YVES11955121978111995021608112916.95 9MALLEM +9170ALMA ANTOINE 11955111978101992011578112722.61 9MANGL +9114CASTEL LILIANE 21955 51976071991121578112722.52 9MVENTE +4844CHER JOELLE 21956 31993091995111202810240.94 9MINFOR +1241GOUVERNEUR JEAN PAUL 11956 31976031990101684813422.68 9MSANS +9766FRAYSSE CHRISTIAN 11956 819800719821211389 9850.88 9MSANS +6781CHANTEREINE JEAN LUC 11956 91979011992012175716602.36 9MSANS +6220PUYRAVEAU MICHEL 11956101985041988061326611017.52 9MSANS +5187BOLIVAR DANIELE MARIE 21956 81981081995071433211714.30 9MSANS +8283VICINAL MARCEL 11956 91977111992012175716600.94 9MSANS +0990CORMERY EYT 11956111979121995041249910472.84 9MSANS +9255SERRES MARY ANNE 21956 71981011980011684813421.58 9DANGL +9968TRAILLES JEAN 11956 919870419860910407 9271.59 9MSANS +6046RONDE JACQUES 11957101976121992011608112915.20 9MSANS +4312DUROC KETTY 21957111980041979041684813421.51 9CANGL +1998MADELEINE CATHERINE 21957 21980061994041471512025.70 9MSANS +0810TROMPETTES LAURENCE GISELE 21957 91994021992011202810240.40 9SSANS +1103JOURDANS JEAN MARIE 119571019900419910410791 9502.58 9MANGL +3941SOUGRAIGNE MICHELINE 21957 71980071979071684813423.49 9CSANS +1971BORDINAS GENEVIEVE 21957111980011993111471512024.89 9MSANS +5459VORS ANNE 21957 5199006198906 8656 8146.61 9.SANS +5423FLOQUET FABRICE 11957 3199408199308 8359 7953.59 9MSANS +0905CARREL KARIN 21957101980101979101684813423.47 9MANGL +4069JUZET JEAN FRANCOIS 11957101976071993062043315669.89 9MSANS +4527MANIGUETS PIERRE 11958 819820619810611131 9658.16 9MSANS +2372FONTANGE EMILIENNE 21958111981041980041381911366.00 9MANGL +4357RAYOL PATRICIA 21958 41994031992011202810240.40 9MSANS +5408BLANCHE GERARD 11958 41981021985112256617147.10 9MANGL +3006FOULQUES JOELLE 21958 51979031993041471512026.00 9MINFOR +6430PERIGORD PIERRE 11958 219790519780511389 9852.09 9CSANS +6468PLANTADE BEATRICE 21958101981041980041684813422.18 9MALLEM +0044MONTBRUN PIERRE 11959 51983061993121326611017.97 9MANGL +2272GRANGE JEAN MICHEL 11959 519790319820111389 9851.46 9MSANS +8185TONNER CHANTAL MARIE 21959 3199606199506 7803 7681.35 9MSANS +8317DAMESME JOELLE 21959 919940219930211389 9851.73 9MSANS +3554FRONTONAS MICHELINE 21959 61979101978101202810241.66 9MESP +3926TARNES NELL 11959 11980101993041471512024.20 9MVENTE +9173BLIGNY MARIE MADELEINE 21959 1198810198510 8656 8146.64 9.TECHN +9704DEMMLER ANDREE 21959101979101993071471512024.66 9MANGL +1648RENAULT MARIE ODILE 21959111986121991071249910472.96 9MSANS +1803HONORE ISABELLE 21959111982041981041202810240.26 9MALLEM +5795SUQUETTE SYLVIE 21959121980031995021527112374.40 9MANGL +9158ALDERBURCHS PATRICE 11959 719790619811011389 9852.67 9MSANS +8333PONCHETTES VIRGINIE 21959 7198801198510 8656 8145.83 9.SANS +5238BOURRE CLAUDE 11960 51981031984091684813423.35 9CSANS +7478ERDRE ANNE 21960 81993111992011202810240.71 9MANGL +2036SALENGRO SYLVIANE 21960 31985121984121288210744.62 9CINFOR +7716GOLF BERTRAND 11960121982071989021608112916.95 9MANGL +4057MILTAT HERVE 11960 719810419800411131 9657.84 9MANGL +2635BIGNAN MARTINE 21960 51981041992092090215980.88 9MSANS +7613PIERRE JACQUES 11961121986041990031527112374.84 9MSANS +0365CLICHY BERNARD 11961 419830519830511131 9658.07 9MSANS +2806GOIZ DIDIER 11961 119840419830411131 9658.46 9MSANS +4103BRUSC CATHERINE 21961 319940919930411389 9852.47 9MSANS +1349MAUROIR ERIC 11961 819900119870310407 9270.29 9.SANS +0451RENARD JEAN MICHEL 11961 1198810198604 8656 8145.78 9.SANS +8494CYGNE SYLVIANE 21961111983021982021326611016.71 9CSANS +9150GAY JEAN CLAUDE 119611119880719870810407 9271.52 9MSANS +3221SURCOUF GUY 11961 91984081992121527112374.97 9MSANS +3083CANADA ALAIN 11961 11982051982111326611017.29 9CSANS +0448LAVANDES GILLES 11962 319930819920811389 9850.79 9MALLEM +3439VERSAILLES MARC 11962 319840419830411131 9657.57 9MALLEM +5360VEZELAY THIERRY 11962 119880919870910791 9502.46 9MSANS +8567PRE FRANCOIS 11962 519910119940810407 9271.42 9MINFOR +0702LACOSTE PHILIPPE 11962 61985091984091608112916.14 9MESP +3016CARDELINE ELISE 21962 11993091992011202810241.27 9MSANS +7387BELLERIVE EVELINE 21962 91992111992061330611016.03 9MSANS +3882RETHACKER JEAN LOUIS 11962 719930819921210407 9272.17 9MSANS +5174SEILLANS NICOLE 21962 71983081982081608112915.08 9MTECHN +2800VILLETTE JEAN PIERRE 11962 51985041991091288210744.28 9MANGL +9420ROURES YANNICK 119621019820319810311131 9658.82 9MSANS +4001ASNIERES JEAN PIERRE 11962121987071994091693613499.67 9MSANS +8856CANALS GILLES 11962 219911219901210024 8999.16 9MANGL +9775MOUETTES FRANCOIS 119621219900219890210407 9270.91 9CVENTE +7097BROUENOU JEAN PIERRE 11962 619860319850310791 9502.82 9MSANS +8917CHANCELIER PATRICK 11962 31995021994021202810240.53 9MSANS +8358CREBILLON NICOLE 21962 61983011982011608112916.37 9VSANS +1296BERARD MICHELE 21962 119941019931011389 9850.89 9MSANS +3188CONCY MICHELE 21962 31987091986092090215979.80 9MALLEM +6829SEINE DANIELE 21962111994061993061202810240.23 9MALLEM +7876VIELLA HERVE 11963 619930119920110407 9272.09 9CESP +7396SANAJO BRUNO 11963 91987081991091249910473.60 9LSANS +7380MARINA ANNE JACQUELINE 21963 119910919900910024 8999.61 9CANGL +5941SIFFLETERIE GILLES 11963 519940219910710407 9270.56 9MTECHN +5364BOUSSY GENEVIEVE 21963 519940519920111389 9850.61 9MANGL +9502MONTOLIEU JEAN CLAUDE 11963 41985051994061527112374.72 9MSANS +8964DOUJAT MICHEL 11963 619841119831110791 9503.92 9MSANS +3405AMANDIERS PHILIPPE 11963 81984031992111527112372.90 9MSANS +1868COUPE JEAN 11963 61993031995081381911366.16 9MSANS +2984GOUSTAN JEAN MARC 11963101987111994091693613499.09 9CSANS +7572CHARONNE DANIELLE 21964 41995011994011206910240.19 9MALLEM +9668EDELWEISS JEAN BERNARD 11964 31984071991121288210745.70 9MSANS +3335CANTEPERDRIX MARIE CHRISTINE 21964 41983061982061326611017.52 9MSANS +2509FINO JEAN MICHEL 1196410199311199211 9085 8417.90 9CVENTE +1812LLORCA PIERRE 11964 21986031993091527112374.72 9MTECHN +5943BERGERIE JEAN 11964 31987021995011373711327.16 9MSANS +5136VALERIEN ANDRE PASCAL 11964 71987081986081527112373.86 9MANGL +6432ECUREUILS PATRICK 11964 3199202199102 8656 8147.19 9.SANS +2610DUVERGIER MARC 11964 91984031992031527112374.88 9MTECHN +5455CEZANNE PASCAL LUC 11965 31988091993031450311831.19 9CALLEM +7204PICCINI CAROLINE 21965121992091991091839014314.08 9CSANS +0125HUNTINGTON YVONNE 21965 91994011992011202810240.77 9MSANS +3791BOUISSETTE PHILIPPE 119651119940119950810024 8998.95 9CSANS +2711ROSETTE PHILIPPE 11965 41990101994011288210744.86 9CALLEM +4882LOZERE ERIC 11965 31988021992061450311831.91 9MANGL +4855BELLEVUE PATRICK 11965 11990101989101249910473.69 9MALLEM +3048PIERRE PIERRE 11965 7199110199010 8656 8146.61 9.ANGL +2278LOGT NORBERT 119651019900619890610407 9270.24 9MSANS +5557LAUZADEL GERARD 11965 91992071994072256617145.75 9MSANS +6129ROZ GISELE 2196510198805198510 8656 8145.20 9.ALLEM +3979RIVES YVES 1196511199609199509 9126 8455.98 9MTECHN +8688FASSUN HUGUETTE 21965 4199511199411 7803 7680.23 9MSANS +9402PARMENTIER PATRICK 11966 819880319870310407 9270.16 9MCOMPT +8428BARJAQUETS THIERRY ABEL 119661119920319910310024 8999.07 9CALLEM +8348CLERMONT ANNE MARIE 21966 11989051988051202810241.40 9MVENTE +3723COURCELLE GENEVIEVE 21966 2199506199406 7803 7680.93 9MANGL +3173CHAL ARMAND 11966101986051988061288210745.88 9MSANS +9965VENETES YOLANDE 21966 519930719920711389 9851.21 9MTECHN +6306ANJOU ALINE SIMONE 2196612199004198707 8656 8147.13 9.ANGL +5448FILHOS JEAN CHARLES HERVE 1196612199212199112 7677 7604.70 9MSANS +7571GORRE SYLVIE 21966101988121987121249910472.03 9MSANS +8890LAMORLAYE FREDERIC 11966 41986041992011450311832.68 9MVENTE +2287DORMOY GENEVIEVE 21966 31988111987111450311830.80 9MSANS +0092ALCANAL JEAN LUC 11966 61987041992121249910472.03 9CSANS +2554ROULOTTE OLIVIER 11966 419940219920110024 8999.03 9MANGL +9801GRAPPONS NATHALIE 21966 919940819930411389 9851.57 9MTECHN +1541ALDES JEAN MICHEL 11967121994051992011202810240.26 9MSANS +9290PLOEMEL YVES 11967121991051990051467711986.91 9MSANS +8169CHAUVIN FRANCOIS 11967 21994011994011202810240.53 9MSANS +6269GOLF ROLAND 11967 919940219940710024 8999.47 9MALLEM +2878RICHART ERIC JEAN MARIE 11967 819891219950410407 9271.91 9MSANS +9098OR DANIEL 11967 719880919870910407 9272.01 9CSANS +4331MONIER DIDIER 11967 719881019871010407 9270.12 9CSANS +0261ROUQUET RENE 11967 41989051988051539912452.78 9MSANS +1507FLACHAT PIERRE 11967 41994011993011420611639.09 9CSANS +7887TENDRE CLAUDE ANNE 21967121994051992011202810241.72 9DSANS +0525SERRES LAURENCE MAGALI 21967 11994011992011202810240.50 9MSANS +9421ASNIERES MARIE CHRISTINE 21967 319951119930411389 9852.22 9MSANS +3624LAPEYRE THIERRY 11967 519870119940110407 9270.12 9MSANS +0344GABRIEL JEAN PIERRE 11967 419940119920110024 8999.57 9MINFOR +7208GAZAN ERIC JEAN 11967 219940119950810024 8998.94 9MTECHN +4335GLACIERE KEIKO 21967 21994041992011202810240.89 9MINFOR +9851TOUCANS MICHEL 11968 219910119900110407 9272.01 9MTECHN +9263ROSSINI ALAIN 11968111991011995021330611018.13 9MSANS +9662DEPORT PHILIPPE GEORGES 11968 3199607199507 8656 8145.38 9MANGL +2814ALFRED VERONIQUE 21968 6199202199102 8656 8146.65 9.COMPT +3291LACUEE REMI 11968 91989021988021450311831.34 9MANGL +3557KERHOUET REGIS 119681019930319920310024 8997.86 9MSANS +6204ESCA BRIGITTE 21968 9199404199201 9597 8729.22 9CESP +1678HADRIEN PHILIPPE 11968 819931219921210363 9231.95 9CSANS +0299MONICA DOMINIQUE 21968 51994021992011202810241.70 9MTECHN +6960PRES COLETTE 21968 2199108199008 8656 8147.15 9.SANS +4443BENOIT JOSIANE 21968 81988011992011249910473.05 9MTECHN +5697QUILICHINI ROBERT 11968 31993121992011202810241.92 9MINFOR +9315PAVE LEON 11968 21988111987111539912452.39 9CTECHN +7230BOUCHE FRANCOISE 21969 3199304199204 9126 8457.67 9MSANS +8237DENEB WALTER 11969 419890919910710407 9271.47 9CSANS +3459ALISCAMPS LEONIE 2196912199610199510 8656 8146.02 9MANGL +4247ARISTIDE CHRISTIAN 11969 5199501199401 9894 8921.55 9MSANS +0137VILLEMENT ANNE MARIE 21969 81994051992011202810239.81 9MSANS +9445STREET DANIELLE 21969 7199204199104 8656 8146.74 9MSANS +9019VALLIERES JEAN 11969121990111989111381911366.90 9MALLEM +4031COLVERTS LAURENCE 21969 11993121992011202810240.89 9MSANS +4000CUENANT THEOPHILE 11969 219890619880610024 8998.09 9CSANS +7496GRASS FRANCOIS 11969 81989051992121249910472.43 9CSANS +4671GRASSET ROGER 11969111992061995121330611018.09 9CSANS +0067RESTAURANT MICHEL 11970 7199407199307 9597 8728.26 9MANGL +0824FIGARES JACQUES 11970121993101992101360611210.03 9CESP +0143MACONNERIE MICHEL 1197010199511199411 7803 7679.87 9MSANS +2934FUZELIER SYLVIANE 21970 5198906198806 8656 8146.56 9MSANS +2663TOULOUSE PATRICK 119701219930819920811389 9850.66 9CSANS +0038LANGRUNE FRANCOIS 119711119940619951010024 8998.32 9CANGL +8414VILLE NOEL 11971 41990051989051202810241.49 9CANGL +5333SQUARE JEAN LUC 11971 81995051994071450311832.45 9CSANS +3680LAUTREC CALIXTE 21971 9199602199502 7803 7680.84 9MINFOR +9370CAMELIAS CHRISTIAN 11971 5199307199207 9597 8729.90 9MTECHN +6026NADAILLAC JEAN LOUIS 119711019910219900210024 8998.44 9CANGL +4310VICTORIA ERIC 1197110199607199507 7803 7680.44 9CSANS +2394CLAVIERS MICHELE RENEE 219711019910919900910024 8998.26 9CANGL +4996GUILLAUME FREDERIC HENRI 11971 41993031992031330611016.30 9CSANS +6930ROYAL EVELYNE 219711219940119930110668 9426.26 9MSANS +1006CRAU MARIE CLAIRE 21971 21994051992011202810241.04 9MSANS +0817ATHEE MAITE 21971 81993011992011267210590.11 9MSANS +5245VAL XAVIER 11971 3199306199206 8656 8146.79 9MESP +7249CLARS ALFRED 1197110199306199206 7803 7679.41 9.ALLEM +9895JUVANTE JACQUES 11971 61995051994051450311832.69 9MSANS +4769BORDERIE OLIVIER JEAN 11972 219940719930711389 9852.20 9MTECHN +4620VERDEILLE FRANCIS 11972 619930419940910363 9232.32 9CSANS +3812BLAINS DIDIER 11972 9199302199202 9597 8729.94 9MANGL +9910FORET JEAN CLAUDE 11972 119930719921011389 9851.30 9CSANS +5930CHATEAU SERGE 11972 9199205199105 9597 8728.49 9CMICRO +3132SAGONE EMMANUEL 21972 4199601199501 7803 7679.46 9MSANS +2171BERGERONNETTES STEPHANE 11972121995111994111450311832.22 9MSANS +5929CARRIEREBLANCHE OLIVIER 11973 6199410199310 9597 8728.98 9CINFOR +6111ROCHETTE JACQUES 1197310199307199207 7803 7680.93 9.ANGL +1480CREYSSAC VANESSA 21973 4199511199411 7803 7679.33 9CSANS +9433BIS NICOLE 21973 6199407199307 8359 7951.65 9MALLEM +5673ROLLIN JEAN 11973 6199304199204 9597 8728.28 9CESP +8786MIMOSAS ALAIN 11973 21993031993061420611637.51 9CANGL +3099MAUR ANDRE 11973 41996051995051450311830.65 9CANGL +1278ENTASSI VERONIQUE 21973 7199606199506 7803 7679.67 9CSANS +6956PRIEURE FRANCOISE 21973 819930919920911389 9851.28 9CSANS +7084AVNEUE JACQUELINE 21974 7199606199506 7803 7679.99 9MANGL +9484DOUMER JOEL 11974 519930819940910363 9232.98 9CESP +9483VILLEBON REMY 11974 8199606199506 7803 7679.78 9CSANS +4120SURBAIX FRANCOIS 11974 719940819930810668 9425.81 9CSANS +6136PASSERO JEAN PAUL 11974 4199606199506 7803 7679.78 9CANGL +9119SERVAN VERONIQUE 21975 7199505199405 7803 7680.00 9CANGL +0958RENDEZVOUS BARBARA 21975 6199307199207 7803 7679.87 9.TECHN +0221ANDALUCIA SERGE 11975 1199606199506 4264 5818.98 9CANGL +1770MARIGOT DIDIER 11975 9199407199307 7803 7679.94 9CCOMPT +2889MANE JACQUES 11975 5199606199506 7803 7680.21 9CINFOR +8800CHEZ JEAN 11975 5199408199308 7803 7680.98 9CANGL +6217MURE GREGOIRE ROBERT 11976 5199607199507 7803 7679.28 9CANGL +9488HARMAS JOSE 11976 8199607199507 7803 7680.27 9CANGL +9074MILIERE ELIANE 21976 6199607199507 7803 7681.26 9CSANS +8755BOITRON MICHEL 11976 4199606199506 7803 7679.67 9CSANS +5066LOGES PATRICK 11976 2199401199301 7803 7680.72 9CSANS +7767CAVOK CATHERINE 21976 4199506199406 7803 7679.49 9CANGL +4014DELAMBRE ALAIN 11976 4199507199407 7803 7680.71 9CSANS +7434CHAMPCEVINEL MICHELINE 2197612199606199506 7803 7681.25 9CSANS +3520CATALINA CATHERINE MARIE HELE21976 9199506199406 7803 7681.34 9CVENTE +6859BILLET JEAN LOUIS 11977 7199606199506 7803 7680.36 9CALLEM +3181NADAUDS JEAN MARC 11977 2199506199507 7803 7679.51 9CANGL +0928DELACROIX CATHERINE 21977 6199607199507 7803 7681.13 9CALLEM +5100BREVAINVILLE GERALD 11977 8199607199507 7803 7679.45 9CSANS +2336ROCAMADOUR GILLES RENE 119331219861119901011131 9658.9910MINFOR +3692ALBIZZIAS DOMINIQUE 11935121965031994011557012566.3610MSANS +1060SEDS ANNE MARIE 21935 61970071991071578112722.8210VANGL +1596OPERA JEAN LUC 11935 31971101991041433211714.3910MSANS +2633SOULEYRAS MONIQUE 21935111958071993012470018540.4410MINFOR +0658LOURMEL BERNARD 11936 51967051994011932314934.8010MTECHN +1362LAC YUMIKO 21937 41965061994012137316332.6910MSANS +7201ILE JEAN PASCAL 1193711198810198309 8656 8145.1210.SANS +7674CASTE PIERRE 11937121971061993072547019086.2710MVENTE +9244LIVRY EDITH 21937 1198901198306 8656 8145.3810.INFOR +4790FRANCIS LYSIANE 21937 2199001198903 8656 8146.5210.SANS +7950CHARBONNIERE STEPHAN 11938 61972051991011433211714.5510MSANS +1814IRMA MARIE 21938101967011989091932314935.3810CANGL +0599FAUBOURG BERNARD 11938 71961011986012273717261.9010MSANS +0425PLUVIERS JEAN PIERRE 11939121971071995081557012567.3610MSANS +7312EST THIERRY 11939111971071992011433211715.4510MANGL +2010CAMP LAURENT 11939 319890119931211389 9852.1510CTECHN +3770COSTES ELIANE 21939 91980071992121471512024.9610CSANS +3046CRIMEE JACQUES 11939 719890619880610494 9309.0810MANGL +5231BONNETERIE VERONIQUE 21940 61962021988042273717260.8010VINFOR +1917CENTRE FREDERICK HENRI 11940 31961091990012739020404.0510MALLEM +0890MIEGESOLLES BERNARD 11940 21960041995043200223583.4110MESP +5720SAULX JACQUES 11941 71971071990071663613343.3310MSANS +4881DESFOSSEZ JULIETTE 21941121976051991051684813422.8110MSANS +5085ALBERIC PHILIPPE 11941 919900719950310407 9271.7010MANGL +0632BESSE PASCAL 11941 51966021989071663613343.7310MSANS +5114SHARON MICHEL 11941 21968081984062022115555.3510MSANS +4229TERRASSE BERNARD 11942 11964111993102137316332.4710MSANS +2811BROSSOLETTE GEORGES 11942 11967121990011663613343.0610MSANS +0937TILLEULS BRUNO 11942 81972061992011433211714.9110MANGL +6193ROOSEVELT CHRISTIAN 11942 71972061991011663613344.1510DTECHN +2942PETEL GEORGES 11942 21974051992071369311287.8610MTECHN +9989TASSIGNY JEAN PATRICK 11942 91971071992011403411520.6610MANGL +1548BARBIER RENAUD JEAN 11942 81961081986042273717260.1910VINFOR +9612LAURAGAIS PHILIP 11943111972031995042547019084.9710MCOMPT +0194FOUQUEVILLE BRIGITTE 21943 51963041991072273717261.1310MSANS +2327GAVOTTE JEAN MARC 11943 11974051993011369311287.1010MSANS +9716HENRI JACQUES 11943 31963041993032922321685.2910MANGL +2720LOCMIQUEL BERNARD 11943 6199301199201 8656 8145.4410.SANS +1736OLIVERAIE VERONIQUE MICHELLE 21943111971071991071578112723.5010DANGL +5205PIOCH VERONIQUE 2194412199302199202 8656 8145.2610.SANS +3085TRASTOUR GERARD 11944 61972041990011433211714.0710DSANS +0317MOUETTE THERESE 21944 51972051988101621213032.5110MSANS +5694PIERRELAIS ERIC 11945 81972091976082022115555.4410CANGL +1116BOISSISE ANNE MARIE 21945 1198901198606 8359 7952.1210.ANGL +4722BRIMONT MARTINE 21945 5199007198907 8656 8147.1710.INFOR +3958CRAMCHABAN MICHEL 11945121969011990101433211714.5110MSANS +7673SURESNES JEAN PIERRE 11945 61982011992101249910472.1010DSANS +7687VALET JACQUES 11945 61972071989011621213032.1710MANGL +8152TAILLIS FRANCOIS 21946 91976021991101578112722.6610MCOMPT +0924BONAVENTURE REIKO 21946 91971011993042547019086.4510MVENTE +8336MASSUGAS MICHELLE 21946111968111992091834514274.3910MSANS +8834LEMENC DIDIER 11946 11974031992102334017609.9510MSANS +6052DURAND LAURENT 11946 21972121988061932314934.9910MSANS +8405GAULLE JACQUES FRANCOIS 11946 31969051989012273717261.7510MSANS +7901VIOLAINE JACQUES 11946 419840719900711131 9659.1710MALLEM +9538SUEDE JEAN MICHEL 11946101971021991011433211715.6910MSANS +7317MARMONT ALAIN 11947 91973051991071621213032.1210MSANS +8240ASSOMPTION JACQUES 11947 11973011991072837121100.6710MALLEM +8104FRERE DOMINIQUE 11947 11975041993011369311286.0310MVENTE +6906VILLEFRANQUE FRANCOISE 2194810199107199007 8656 8145.4410.MARKT +4316DOMDES NOELLE 21948 51971011989082022115554.9910MSANS +8058RANGE MARIE CLAUDE 21949111973061991071578112722.2410MSANS +6117WILSON MICHELINE 21949 21970011993111834514274.5310CSANS +2977CERISAIE CAROLE PAULETTE 21949 81972051993111471512025.8210MCOMPT +3294PLOUER MICHEL 11949101969101989042022115555.4110MCOMPT +4908GIRONDE PATRICK 11949 41981091992011249910472.6910MSANS +2440AJAC FRANCOIS 11949121974081990011684813423.2610MSANS +6866MUSTAPHA VALERIE 21949 71970111994071834514275.3810MALLEM +9238CHOISY JACQUES 11950101976081992042022115555.4810MSANS +5421NATIONALE FRANCOISE JEANNE 21950 21971061995121684813422.3610MSANS +7441ROCHE CLAUDE 11950121977051993041369311288.0110MINFOR +2053LOIR MONIQUE 21951121972061990011621213032.0610MANGL +6550BELLEVUE FREDERIC DAVID 11951121970111990122470018540.4210MANGL +0900PAT VICENTE 11952 61977071991011369311287.7710MINFOR +9719BERAL YVON 11952101986101994011433211714.3710MVENTE +8718VIENNO DOMINIQUE 11952121976101991011369311287.8310MSANS +5348CRIKET JEAN 11953121979051995041471512024.2110MSANS +7442DETAILLE JOEL 11953 81973031991012334017608.5310MSANS +7704MARTILLE CATHERINE 21953 21973041991072137316330.5310CANGL +3122MADELEINE CLAUDE 11953 31978061995041471512024.7810MANGL +7454AURAY MARC 11953121972121992122175716601.7510MSANS +2338LAMARTINE DOMINIQUE 11953 81981051992011471512025.4710MSANS +5898ITALIE DENIS 11955 419941119920110791 9502.4110MSANS +2818ENTREPRENEURS BRIGITTE 2195610199506199406 8359 7951.8010MSANS +4736MONTBRIEUX LAURENT 11956 11982051991071471512024.9210MSANS +5607ORBAY GILBERT 11956121976071994011369311288.0110MTECHN +6044BRONZE CHANTAL 21956 31978031990101911114779.0510CESP +2949AIGREFEUILLE HERVE 119561119810119840811389 9851.9210MTECHN +1891POSTALE DIDIER 119561019820319810611131 9658.0110MSANS +6887ESTADOU MARC 1195712199311199211 8656 8146.8810.COMPT +3156FLACQ PHILIPPE 11957 11980081992011608112915.1510MINFOR +0665MIRAGE HERVE 11957 41978031995041249910471.8810MSANS +9619SOLEIL SYLVIE 2195811199406199507 9126 8456.9610MTECHN +7598COTES MARC 11958 41978041995041249910471.9410MINFOR +1289SOUCI ANNE 21958101980071979071194310202.5910MSANS +5278SEYSSUEL ROSELYNE 21958 51979021993071608112917.1010MSANS +5065INDUSTRIE JEAN PIERRE 11958 81978071995041249910473.1510CSANS +6257PLESSIS JEAN YVES 11959 51983041994011433211714.2810MVENTE +5018CHAUX JEAN 11959 91979061993041471512026.1810MTECHN +4009PLEIN ANTHONY 11959 719810119800511389 9850.5610MTECHN +9730PRINCE JEAN JACQUES 11960 31982051991091326611017.5010CSANS +1357TAMNIES FRANCOISE 21960 11980031979031215710279.3810MSANS +8601VALMY PIERRE M 119601019820319810311131 9657.9610MTECHN +5371ARC GILBERT 11960111988101996012773220636.1610.INFOR +0267OLIVIERS DIDIER 11960 7199312199212 9597 8728.6410MSANS +3866FLEURIS JEAN MICHEL 11960 41986021993041288210744.6410MTECHN +4485ALLEMANE PHILIPPE 11960 71983011989041608112915.2410MSANS +1801CAUTEGRIL CORINNE 21961 11981031992061527112372.9010CTECHN +0557BENEFIAT MARTINE 2196111199412199312 7803 7680.7710MSANS +2605MATHURIN PIERRE 119611019830419820411131 9658.4710MINFOR +8035BASSETTE BERTRAND 11961 31987081986081288210743.8610MANGL +4026GAJAC KARIN 21962 81983011982011608112916.3210MSANS +8790TREDREZ LEONIE 21962 71986061985061288210745.2210MSANS +0932BASTIDON MARYLENE MARTHE 21962 7199301199201 8656 8146.4210.SANS +1052MARJOLAINE PHILIPPE 11962 11984111991071868714507.4710MSANS +3917FONSORBES JOEL YVES 11962111982061988051326611016.6210MALLEM +6770ROUBIN FREDERIC MARC 11962 719840419870211131 9658.4110CSANS +9591BAS EDOUARD 11963 319850419841210791 9503.5810MSANS +0126LALA MICHEL 11963 219830619820611131 9658.7410CESP +0547GAUMERIE EDGAR 11963121985011994011433211714.2510MANGL +5064LOISIRS GEORGES 119631019851219860510791 9503.6610MALLEM +6975BOUCHET YANNICK 11964 61985111985112090215981.0610MESP +2365TERNES ERIC 11964 51983081994011433211714.4310VVENTE +1287OIDE MARIE LOUISE 2196412199201198703 8656 8146.9710.SANS +1746MICHELETTE GERARD 11964 619840719830710791 9503.7410MSANS +4496COLONEL MONIQUE 21964 41984091983091288210744.8610CSANS +6420MERCURE MICHEL 11965 61985121993121288210745.0010MSANS +2452FEUDON ANNICK 21965 81989061988061249910471.8910MANGL +3490DION ALEXANDRA YVETTE 21965 6199504199404 7803 7680.5910MVENTE +9441GALLET JEAN CLAUDE 11965 11991021994022256617147.1310MSANS +8588JARRES GERARD 11966 919880319870310407 9271.5610MSANS +1291HERMITAGE XAVIER 11966111991101990101330611016.3310CSANS +6530ETRUN PATRICK 11966 31989111988111539912452.4210MANGL +1352PLAIS JUAN CARLOS 11967 419870719860710407 9270.9110MSANS +7277REY MICHEL 11967 21995081996012559919162.3610CSANS +1793BARBE VALERIE ANNE 21967 5199201199101 7803 7680.5910.INFOR +3158KERIOLET FRANCOIS CHRISTOPHE 11967 41990051992121381911365.8510CSANS +0027DANS JEAN PIERRE 11967 719920119910110024 8999.9910MSANS +6374PUISEAU THUY LAN 11967 61987041991121249910472.2410MESP +9025BEUVRON PATRICK 1196711199606199506 7803 7679.4610CANGL +9820CHARLES CATHERINE 2196710199507199407 8656 8146.4610MALLEM +6484VIGNAUD PATRICK 11969 91990071992031381911365.6710MSANS +1414BRUNE SYLVIE 21969 619890219880211302 9775.1910MSANS +4633MICHELET JOHAN FR 11970 619901219891210024 8999.7210MINFOR +2182PLANTIER PHILIPPE 11971101995091994091450311831.5510CSANS +8157LILAS PIERRE 1197210199207199107 8656 8146.5510.SANS +5454LOIR MARIA 21973 5199406199306 7803 7680.1410CANGL +9209CARREFOUR SERGE 11974 6199505199404 9126 8455.7410MALLEM +3395ADAM JEAN CLAUDE 11974111993091994011202810241.5810CSANS +8662REIGNIER JEAN MICHEL 11975 9199607199507 7803 7681.4710CSANS +8679MOUTONNE MARIANNE 21935 9199408199201 9085 8419.1611DCOMPT +9359RASPAIL ALAIN 11935 91963121994103200223582.5411MTECHN +0977DELBESSOU JEAN CLAUDE 11935 91958051992013844228044.4211MANGL +5628REPUBLIQUE PHILIPPE 11935111967011995041557012567.7211MALLEM +5361CHAUMIERE CHANTAL 21937 91967011992011471512024.5111MANGL +8814KIKOCHI CHRISTINE 21939 819880519870510407 9271.4611MTECHN +3550CONCLUE PAULETTE 21941 21973081991071578112723.7211MTECHN +3525PAU CLAIRE 21942 81965021991122334017609.2411DSANS +6963CEZANNE CAROLE 2194310199411199311 8656 8146.7911MALLEM +1837FRIZAC PETER 11943 81976041995011578112721.6711MINFOR +5658SOLANGIERE JEAN 11944121969121990041433211715.0511MSANS +7261MONTGERMONT SOPHIE JEANNINE 21945111971111995041834514274.5111MANGL +4785LODI PHILIPPE 11945 21980071994011471512024.5611MESP +5841PORT JACQUELINE 21946 41970021969021300910822.2611MANGL +0606BAGEN MARIE JEANNE 21946 11970121993032022115555.6811MSANS +5640GALLIA BENEDICTE 21946101973101993121911114780.1311MINFOR +0298BRETIGNY MICHELINE 21946 5199208199108 8656 8145.8011.TECHN +3925PELLETIER MARTINE 21946111968111993012137316332.0911MSANS +7692BARBIN MARIE NOELLE 21948 21968111990012137316331.0611CINFOR +3739JUIN MARCEL 11948111981091992011249910472.7411MSANS +7300URANIES CHRISTIAN 11948 91973021992011433211714.6011MTECHN +6456TUBLERIE CAROLE 21949 81968111992032470018540.0611MANGL +3324TAMANACO MARTIAL 11949 21974061993011369311288.2211MSANS +8400LOIRE MURIEL 21949 41969031991091834514275.4511MSANS +9140RENAITRIE CLAUDE 11949101980071995041249910473.7211MSANS +5589SITE PATRICIA 21949 7199508199408 7803 7679.4611MVENTE +5386MEDECIN JACKY 11950 21975051992101369311286.8711MSANS +2377VOLTAIRE CHRISTIAN 11951111976101993041471512025.2511MSANS +4340BAUDRIMONT JEAN FRANCOIS 11951 41984071993121326611017.5511MINFOR +0397PAREAGE JEAN YVES 11951 81979071994101249910472.9611MANGL +9259PEYRAS CHANTAL 21951 4199608199508 7803 7679.6411MVENTE +1711ESTAGNOL BRUNO CLAUDE 11951121983051992071578112722.6611MINFOR +4351CHARRON ANNICK DENISE 2195210199408199308 8359 7952.4311MALLEM +2396CHAPELLE JOCELYNE 21952 41976061975061288210745.0911MANGL +3571OBSERVATOIR NICOLE 2195211199610199510 7803 7679.9911MSANS +2219LISA MARIE LOUISE 21952 11973061991041578112722.4211MSANS +7029VIERGE DANIEL 11953 51976091994112547019086.5111MSANS +6315EPSOM LAURENCE SONIA 219531119961019951010668 9425.3111MSANS +8330GUISE VERONIQUE 21954 91975071974071215710279.3211MTECHN +4963GUILLOTIERE ROBERT 11954 21977071992072350617727.3311MSANS +9223MARCHAUX JEAN PATRICK 11955 91975031991071578112722.0711MINFOR +8081JAMBLES BERNARD 11955101980061995041249910472.1211MSANS +2906DOUGLAS ERIC JEAN MARIE 11955 21978051994011369311287.7711MSANS +3749MAGNAN PIERRE 11956 7197910199111 4134 0.8911MESP +8176THENOT DIDIER 11956 71980021982102470018541.8311MSANS +3392SIMON PIERRE 11956 61979021994041249910472.7011MSANS +6393BERGERS LYDIE 2195611198901198604 8656 8146.4111.VENTE +7181CABAUDRAN FREDERIC MICHEL 11957 21978061991102529918969.2211MSANS +6568LANDEDA THIERRY PATRICE 11958 31979071993071471512025.9511MSANS +0333DAPHNE CHRISTOPHE 11958 719820619810611131 9657.6211MSANS +2504TREICH JACQUES 11959 51982051994081638413149.5711MALLEM +3534KHRAIEF CHRISTIAN ANTONIN 11959 61981031995021433211714.7011MSANS +9601PECLET GENEVIEVE 21959 119791019781010024 8999.7411MSANS +2575BELLEVUE FRANCIS 11959101980051991091369311287.1611MSANS +1679GRIGNAN GERALD 11959 71981081993081804514082.7211MANGL +4039GOULAINE EDWIGE MARCELLE 21959 51979081993071471512024.9611MSANS +3106YABBOQ CHRISTINE 21960 119910619900610024 8999.7011MANGL +5771GONDS JACQUES 11960 21983051995011433211713.8911MSANS +3478ATHOS FRANCOIS 11960 21983081989112090215980.7311MSANS +3217MOINES FRANCE 21961 51982111981111326611017.1611MTECHN +3318EPINAY DIDIER 11961 51982111995091450311832.0011MVENTE +0241PROVENCALE CHRISTINE 21961 11984021983021249910472.6111MSANS +7712JANVRY CHRISTIAN 11962 41986081995011373711328.3211MTECHN +8426FILET GLORIA 21962 1199607199507 8656 8146.2911MSANS +2991BOIRARGUES MARC 11962121982061990091326611016.1711CSANS +4250FOREST ANGEL 11962 219830819950911131 9657.3911MINFOR +0642GOGH ANNICK 21962 719960219930410668 9427.0711MSANS +3978FONDETTES YUKIKO 21963 71984081983081527112374.5211MANGL +1989BRANCION MARIE JOSEPHE 21963 51990041993081330611017.2911MSANS +7919CERFS BRIGITTE 2196310199310199210 9597 8729.1711MALLEM +6531DORMELLES PIERRE JACQUES 11963 41983041982041326611016.5111MSANS +0104SALETTES FREDERIC 11963 219860519850511131 9658.8611MMICRO +3391LAURISTON JEAN CLAUDE 11963 41983061991091326611017.6511MINFOR +9918BOULEAUX DANIELLE 21964 8199505199405 8656 8146.1111MSANS +9860MOREAS LOIC 11964 2199303199203 9597 8728.9811MSANS +4629LEMBRAS MARC 11964 31988041989011527112374.8411MSANS +8531SIGNORE CHANTAL 21965 4199607199507 7803 7680.8911MSANS +5775GRANDS LINDA 21965 41988061987061249910473.6311MESP +0548VALERIEN PHILIPPE 11965 71986041995041710713577.0111MSANS +5728MUCHARISTA GILLES 11965 81985071991121288210744.9511MSANS +0495ALIZES JEAN MICHEL 11965 61986071993111288210745.2211CTECHN +3119GAMBETTA JEAN PIERRE 11965 519851119841110791 9502.2311MANGL +7770NOTTET CHANTAL 21966 31985101984101288210744.2611MALLEM +7186ILLIERS FRANCK 119661219921119911210024 8998.3111CANGL +5800COLOMBIERES VERONIQUE 21966 71992081991081202810240.8611MSANS +8549ROMAI PATRICK 11967 81987041993081450311830.5811MANGL +2557CHAI CATHERINE 21967 9199201199101 7803 7680.9811.INFOR +5044ROUSSILLON HIOU SHU 21967 51987111993031381911365.1911CSANS +3101MARECHAL JACQUES 11967 91988071993011839014313.7211MANGL +9282LEOPOLD ALAIN 119671119880519890910407 9271.9711MSANS +1201PEYRERE PASCAL 11968 919881219871210407 9270.4211MALLEM +7061TEICH PAUL 11968111994031993031267210588.7411MSANS +5746HARRIAGUE GERARD 119681119900919890910407 9271.1911MANGL +6486MAR ALAIN 11968 1199404199304 7590 7564.3511MSANS +0773VICTOR JEAN CHRISTOPHE 11968 71994081993082107316096.7111MALLEM +3494VILLARCEAU ISABELLE MARIE 21969 7199609199509 9894 8921.5911MSANS +1068AMOUR DIDIER 11969111991051990051467711987.6711MINFOR +1796ROCQUENCOURT FRANCK 11970121991091990091202810241.7011MANGL +6197WRIGHT ANNE 21971 919930319920311389 9850.7011MSANS +9660CYPRES GERARD 119711019900719890710024 8997.9011MALLEM +8022ARCAY CLAUDE 11971 51992111991111202810240.1311MSANS +3764CHEMIN FABIENNE 21971 219951119941110668 9425.6411MVENTE +2448PINCHINADES JEAN CLAUDE 11972 21995051994051450311831.0111CALLEM +1927VALESCURE PHILIPPE 11972 4199501199304 9597 8728.7711CSANS +2074AZUR DIDIER 11972 51993111992111267210588.5311CTECHN +9842BASTIDE ERIC 11972 5199312199212 9597 8727.9111CSANS +5954SABLES ROCCO 1197212199305199205 9597 8728.1911CSANS +0278PAIXENT JEAN MICHEL 11972121994101993101360611210.6011CSANS +1572DAGNY BRUNO 11972 11993101992101360611210.2811MSANS +4298AIZIER NICOLE 21972 219940719920111389 9852.4211MALLEM +2321DESIRADE EVELYNE 21972 119910719900710024 8998.1311MTECHN +6794CHEUVRY PHILIPPE 11973 9199207199107 9597 8729.9211CSANS +8383ETIOLLES ANNE MARIE 21974 5199607199507 9894 8922.2111CSANS +3562PORSCAVE GEORGES PASCAL 11974 1199508199408 7803 7679.9911CANGL +6773GERANDO NICOLE 21974 51995051994071450311831.9711CANGL +4226APPY BERTRAND GEORGES 11975 2199606199506 9256 8532.5611CTECHN +1343SANS FRANCOIS 1197510199410199310 9126 8456.3911CSANS +6979ANGLAIS NADINE 21975 7199304199302 8656 8145.5711.SANS +5254BERLIOZ DANIELE 2197610199607199507 7803 7680.5011CTECHN +0275FRIARD GERARD 1197610199608199508 7803 7681.4711CSANS +3929CHATEAU VERONIQUE 21935 2199301199201 9085 8417.4612VANGL +2917PASTEUR NICOLE 21935 31967071990011932314933.6012MSANS +4491FALLIERE CATHERINE 21935 7199109199507 7677 7603.7312.ANGL +4190CHRISTOPHE DOMINIQUE AUGUSTE 11935 31977111992101369311287.1912MANGL +3826RAYON BERNARD 11935 319830819820811389 9851.7412DESP +2841SEVERINE PHILIPPE 11936 6199409199309 8656 8146.7412MANGL +6337FREDERIC CATHERINE 2193812199201199101 9085 8417.6312SSANS +7355ANTOVAL JEAN FRANCOIS 11938101961021995043200223582.3212MANGL +8990DETALOUX CLAUDIE 21938 71962071984102273717260.0812CSANS +7576SEBASTIEN BERNARD 11939 51971121991071663613343.3712MCOMPT +3808CABRIES ANNE LOUISE 21939 31973071985041834514275.9512VSANS +3333BOSQUE JEAN YVES 119391219900919920310791 9503.1612CTECHN +0851ORANGERS CHRISTIAN 11939 11973071992011433211715.2212MALLEM +7226ROYA FRANCOISE 21939121962121983122470018541.7912MSANS +4767DOMITIA VINCENT 11939 6198912198504 8656 8145.1112.VENTE +1932LEROY FRANCK 11939101968101991011433211714.2112MTECHN +4220GUERINIERE MICHEL 11940 11971041991011663613343.9712MSANS +5021MONTLANDON RENE 11940 61973041993011369311286.6612MSANS +3088ALTAIR NICOLE 21941101962031994122470018540.1712MSANS +2222MILLET JACQUELINE 21941 21970051992072137316331.7812MALLEM +6726HURONNERIE CHRISTIAN 11941101980031992011403411521.2912MANGL +1951ROSIERE GILBERT 11941 91971031990011433211715.5412MSANS +4436CHAVANNES MARIA LUIZ 21942 51968111991072137316332.6012MSANS +9151CHATONNAY PAUL 11942 21969021990071433211715.6312MTECHN +2643SOUSBOIS DOMINIQUE 21942 31962041988122470018540.2412MSANS +6554SARCELLES JEAN MARIE 11943111963071993083200223584.0712MTECHN +6672RENDEZVOUS FRANCOIS 11943 11969091990101663613343.6012MSANS +3579RUISSEAU DANIEL 11943 31965011994011557012567.1812MANGL +0484PAUL CORINNA 21943 61965121988062470018540.6612MSANS +3880ROUVRES ERIC 11943 819931119950610407 9271.7412MSANS +4665MONTEE JOSETTE 21943111968041991052470018540.5712MSANS +3302VERS JEAN 11944111970061991011433211714.8712MANGL +6749AUCUN JEAN CLAUDE 11945 11974071992041471512025.0212MINFOR +6957RESIDENCE EVELYNE 21945 61971071991101578112723.4212CSANS +1669CHEZY PIERRE 11946111976051993011369311286.0612MSANS +1674AVENIDA SYLVIE 2194611198806198706 9511 8688.4112DINFOR +6741FONDS GEORGES 11948 11977041994011249910472.1012MSANS +4859ZORI CATHERINE 21948 81968111991021834514274.7012MSANS +1314MINES JEAN MARIE 11948 31975061993071369311288.1812MALLEM +5393PROVEN ANNICK 21948 9199309199209 8656 8145.0612.ALLEM +9886FLAUBERT YOLANDE 21948 41968041995111684813422.3612MANGL +8118JUGY JACQUELINE 2194912199504199404 8656 8146.6412MTECHN +3693RETRAITE MARYSE ARMANDE 21949 9199201199101 7803 7681.4712.SANS +7335PETITES MICHELLE 21949 71970101990112043315671.1512MSANS +6896MERIMEE PATRICK 11949 11972031995011834514274.2412MANGL +0173RESIDENCE HARRY 11949 71973061992101369311287.1412MVENTE +7211LAVIGNAC MARIE ANNE 21950 6199307199207 7803 7680.0912.SANS +6258DEAUVILLE SALIM PHILIPPE 11950 61975101993011684813423.4912MSANS +6945BERANGER AGNES 21950 11970011989011621213034.1012MSANS +6072LAZUEL CHANTAL 21951 11971051995041834514274.4412MSANS +3233GRETZ PATRICK 11951 61981041993011608112917.2412MSANS +3090VERTS THERESE 21951 21972101987072334017610.2012CALLEM +4522POISY BRIGITTE 21951 41973051991011578112722.7012MSANS +1211SAINTE PIERRE 11951 219940119940110407 9272.1312MSANS +9697RUE NADINE NICOLE 21951 11977071991051608112915.7412CTECHN +7336GRURY ANTOINE 11951111977051993041369311286.9212MTECHN +4900BENARD JEAN LOUIS 11951 71973081992032470018540.1512MSANS +0543BARETY JACQUES 11951 71977031993011369311286.8012MSANS +4195GRENIER THIERRY HENRI 11951 71979011994111403411522.0912MALLEM +6636BERANGER JEAN PIERRE 11951 619831219821211131 9659.0112MALLEM +1282PALOMBES OLIVIER 11952 81979061995011621213033.3712MESP +7146VENERIE YANN MAR 11952101981031992011249910473.4712MSANS +8503GIRELLES MARTINE 21952 41993111992011202810240.1312MANGL +9767ROUBLOT FREDERIC 11952 71976121991071578112722.3712MSANS +1506BELLES SERGE 11952 1199301199201 8656 8146.7012.SANS +5411MERMOZ BRIGITTE 21953 419910919900910024 8997.8112SSANS +8001PANORAMAS JACQUES 11953111980031992101369311287.3212MALLEM +8972NOGUES JEAN 11953121981091992011249910472.0112MSANS +6536MARX EVELYNE 21953 7199201199101 9511 8688.8912MANGL +3768LAMBRIGOT PHILIPPE 11954 51976071991012022115554.5412MSANS +0662BRACQ GEORGES 11954121975111993121369311286.4712MSANS +5304BETOUILLERE NORIKO 21954 71979061993041433211713.9212MALLEM +4215PARA KARIN 21954 91979071992111608112915.5312DSANS +2037FORGE LUCIEN 11955 21984021992111578112723.2412MSANS +2945ABBEVILLE PASCAL 11955101983101993011471512025.4612MANGL +2849NERTHE MARTINE 21955 21978091993101471512025.9212MSANS +3488REVOL ANNE 21955111977071992011471512024.0612MSANS +4431LAUNAY LOIC 11955101984091993011215710278.6912MSANS +8724CASSIFLORE ROGER 11956 11976071985102397418036.3812MANGL +0629FRANCOIS SANDRINE 21956 91977071995101881314586.0612MSANS +4823RENARDIERE JEAN LOUIS 11956 41977031992111608112915.2912MSANS +8808ENGHIEN MAX 11956 91977061992011471512025.6512MVENTE +2432MICHELE ISABELLE 2195710199611199511 7803 7679.4512CINFOR +7158CAPITAINE DOMINIQUE 21957 91978061993031608112917.0412MSANS +6317COURLIS GUY 11957 21980051992121369311286.7412MSANS +7608DESSUS SABINE NICOLE 21957121979031993041471512025.2812MSANS +3637PEYRIERE FRANCOIS 11957 81979111995101911114778.2412MSANS +9600HAKEIM THIERRY 11957 51981031986092256617146.6812MANGL +1537RESISTANCE SERGE 11958 81986031991101868714506.0112MSANS +3033PIERREDON JEAN LUC 11958 51980041992121471512024.7812MSANS +9058ROYALES ALAIN 11958 31982081994041326611016.6912MSANS +1074PONTILLARD JACQUELINE 21958 51981111980111608112915.8412MALLEM +0339VERNOCE THIERRY 11958 81982041994041471512025.3212MSANS +1325ZOLA CHRISTINE 21958 81978121993041471512024.9312MSANS +6083HAIG MICHELE 21959 419791119781110876 9502.3712MSANS +9351QUIHOU STEPHANE 11959 41988061992091450311831.2512MSANS +9582LAENNEC COLETTE 21959 41983071982071326611016.0812MSANS +5220RECOLLETS YVES 11959 51981011994011471512026.1512MSANS +5140DAILLON DOMINIQUE JEAN 11960 31984071995081527112374.5812MANGL +4446ELPHEGE PIERRE YVES 11960 419840319830811131 9657.2612MANGL +0969BOUNIN PHILIPPE 11960 71983031991111616712995.2012MSANS +2335CAILLOUP CHRISTINE 21960 11980091994071471512025.0212DSANS +8339MER ISABELLE 21960111980101979101684813422.5712MANGL +6061ESCALES JEAN MARIE 11960 51982051995121804514082.6512CSANS +0818GATTIERES PATRICE 11961121983121989031527112373.0812MTECHN +5053LARUE KARINE 21961 8199407199307 8359 7952.0712MSANS +9219OPALINE EVELYNE 21961 61983111982111202810240.8412MALLEM +6160LAURENT ANNICK 21961 51982091981091527112373.7112MANGL +9514GARGAS NICOLE 21961 31981041980041684813421.4912MSANS +2936KIPLING ERIC 11961 419830419830711131 9659.2212MTECHN +3023BOREL PHILIPPE GILLES 11961 51982041981081608112915.8912MSANS +5767BORGHERE PASCAL EMILE 11961 51985061989112090215981.0912MSANS +9519SUISSES PHILIPPE 11961121985031984031608112916.4312MSANS +7271BOUEL JEAN LUC 11962 21982071990101527112374.1612MSANS +1969BIERE SIMONE 21962 3199404199304 8359 7953.2412MESP +1388MOLIERE GERARD 11962 71987081988011527112374.2012MSANS +5714NICOLO DIDIER 11962 11983071984121608112916.8112MCOMPT +1039ATTILL ERIC 11962 91983081984091608112916.6412MALLEM +4474SAUSSAYE MICHEL 11962101989011992121249910471.9712CANGL +0108ORBESSON MIREILLE 21962 81983041989112090215981.4112MSANS +8464DIJON JEAN LUC 119621219860219850210791 9503.7012MINFOR +0217MAGDEBOURG PIERRE 11962 51986071995011373711327.8712MANGL +5259VANOEL SERGE 11963 81984021991011868714507.8512CSANS +6176GOETHE GILLES RAYMOND 11963 41983051993121326611016.5712MSANS +3711SIGNAL KARIN 21963 6199407199307 9126 8456.8212MCOMPT +5792ARCACHON SERGE 11963 519931019910710407 9271.9712MCOMPT +2491OSSOLA ANNIE 21963 51993101992011202810240.2612CSANS +5463PERE JEAN LUC 11963 819860319850310791 9503.8812MSANS +0572ALSACE MICHEL 11963 219830619920111131 9658.0212MANGL +5197LATECOERE BERNADETTE 2196411199201199101 7803 7680.2312.SANS +3820SAUSSES MICHEL LOUIS 11964 31986061985061288210743.8312CINFOR +3831CRESP BRIGITTE 21964 6199109199009 8656 8145.8412.TECHN +7862GUILLEMARD GERARD 11964 619870419880910791 9503.2712MSANS +3863TREMOILLE LAURENT 11965111989011991051249910473.0012MTECHN +2269VERDUN DIDIER 119651019870219910110407 9271.4212MSANS +4817VAUCLUSIENS JEAN PIERRE 11965101986051991091288210743.8612MVENTE +8120BUSSIERE LYNDA 21965101988041994121450311832.2912MSANS +9872ROTTEMBOURG PHILIPPE 11965 71985071991091288210745.6112CALLEM +3157GEORGES MARC 11965 119870219860210791 9502.1412MVENTE +5375GRAFFIANE ROBERT 11965 119870419861210791 9502.8912MSANS +9838SELLE XAVIER 11966101992011991011202810240.9512MSANS +4716BEG PASCAL 11966 61987061992041249910473.4212CANGL +8142FONTENIL MADELEINE 21967 91990051993051723313653.6012VESP +4631ROBINS ISABELLE CAMILLE 21967 61993111992011202810241.8112MSANS +0875RESISTANTE ALAIN 11967 61988041994011249910473.1812MSANS +7618JUANE JOSEPH 11967 919880919910210407 9270.4812MSANS +6297QUINT MARIE CHRISTINE 21967 11989121988121202810240.8412MINFOR +9234SAINTRY FRANCK JEAN 11967 619891019881010791 9502.8912MSANS +0878MERIMEE GUY 11967 81990011989011467711986.9112MSANS +7463VALETTE BERTRAND 11967 91987051994051381911366.9312MSANS +1043RAMBOUILLET JEAN FRANCOIS 11968 81990071989071381911364.8712MANGL +2350PANPYC CLAUDE 11968 91990111989111467711985.8712MSANS +9468GUEPIN EVA 21968 41989051988071949415051.6812MSANS +4690VERLIN YVES 11968101989111994011249910473.4712MINFOR +4832BAYARD CORINNE 21968 21990111989111202810239.8312MSANS +2141CHATAIGNIER CATHERINE 21968 519940919930411389 9852.2212MMANAG +2439AIGUILLE CATHERINE 21968 9199407199307 8359 7952.2512MVENTE +2895PASSAGE PHILIPPE 11968111990031989081381911366.2212CSANS +6720ANTHEOR VINCENT 11968 21988051993041249910472.6412MSANS +4877AUBIN PATRICK 11968 71990011989011202810239.7812CSANS +7975GUITTARD ISABELLE 21968121993121992011202810240.1912MSANS +3884DESMOULINS ANNIE 21969 2199510199410 7803 7680.5012MSANS +4326CASSIOPEE JEAN PIERRE 11969 21989031988031249910473.5612MSANS +9844DAUDET ROBERT 11969121993101992101330611016.3012MALLEM +1235TRANSIT CHRISTINE 21969101992031991031420611639.2212CINFOR +9148CARTIGNY TONY PIERRE 11969 81994091993091450311830.6212CMANAG +1898VEUVE BERNARD 11969 119891019881010407 9270.6912CALLEM +4856BELIER JEROME 11970 11990111992011381911365.6212MSANS +3215BASTILLE GILBERT 11970 219921019911010024 8997.8612CSANS +1681VAUCHAMPS THIERRY 11970 319940419930111389 9852.2412CVENTE +0330GIRAUD DIDIER 11970 319940319920110024 8998.7112MALLEM +2920FONZERI PAUL 11970 81993061992061267210590.0212MTECHN +3390CLANS LOUIS 11970 51989111988111539912451.9712CSANS +7148OISEAUX FRANCE 2197011199004198904 8656 8145.6612.MANAG +2817GAIRANT MONIQUE 21970 319910719900710024 8997.9112CSANS +8162VOLONTAIRES MONIQUE 21970 5199410199310 7590 7564.3812MSANS +9567LEGUMES CHRISTINE 219711119950419940110668 9426.0312MANGL +2435BRESSON SYLVIE 2197112199007199101 8656 8145.9312MSANS +0955BEAUGENCY LAURENCE 21971 1199206199106 9597 8729.9712CSANS +4021VICOMTE ROLAND 11971 119900619890610024 8998.0112MINFOR +7963MONTESQUIEU HENRI 11971 51993081994011249910473.0512MVENTE +9955WAY JEAN MARC 11971 1199305199205 9597 8728.0112CSANS +1833INKERMANN LAURE 21972 919930519920511389 9851.3912MANGL +4630CHEVREUILS CHRISTINE 2197312199306199206 8359 7952.0112.TECHN +3273MIREILLE ALAIN 11973 819931119921111389 9851.5512CMARKT +6842DARONNE ALAIN 1197311199307199503 9597 8729.2212CINFOR +5953BOURGEOIS BRUNO 11973 21993081994011202810241.9212MSANS +3467PONTIER ALAIN 11973 619930919920911389 9850.5612MSANS +6507MAYVILLE CHANTAL 21974 1199208199302 8656 8146.4112MANGL +4060HALLEGUEN MICHEL 11974 11993121994011202810241.7012CSANS +8760RAGUINOT GHISLAINE ROBERTE 21975 1199507199407 7803 7681.4412CSANS +1454NEUF GILLES 11977 9199606199506 7803 7681.3512CSANS +2092BRASSAURIS MICHEL 11931 91956101978013327724477.6013VSANS +8552VIOLET DIDIER 11933 4198810199501 8827 8263.5613.SANS +6589DEVENCON BERNARD 11934111955111993103417325098.4513MSANS +7036PERNETY FREDERIC 11934101961111987102273717260.4013MINFOR +7079CHARDONNERETS LAURIS 11935 31978071992011403411520.5313CINFOR +9868JAURES MICHEL 11935 51970051992011403411521.2013MSANS +8365HELIOTROPES LISE 21935 11963021991072273717259.8613CSANS +7450POISSON CHANTAL 21936 91968111989011621213033.5613MINFOR +9779CONSOLACAO NATHALIE 21937 3199401199201 9085 8417.3613VSANS +8202DIANE JACQUELINE SUZANNE 21937 61972041989101621213032.8713VESP +5521LAZURE RAOUL 11937 31966021995011557012567.6313MTECHN +7843NOM ETIENNE 11938 1199001198510 8656 8145.6213.SANS +7282IRISASCO ERIC STANIS 11938121958081988013844228045.3713MSANS +3124VIVIER GEORGES 11939121967011994011663613342.8513MSANS +1445GAUSSADE FRANCINE 21939 11967121992012137316332.1113MSANS +5399GROSSETI JACQUES 11940111969011990011433211714.7913MSANS +7177MONTSEGUR DOMINIQUE 11940 2199206199106 8656 8146.8313.ALLEM +4475SOLEIL JEAN CHARLES 11940111962041993043417325097.6413MINFOR +6615GRAVELLE CLAUDE 11940 419880319870810407 9270.3013MESP +5880OR LILIANE 21940 8199301199201 8656 8147.0113.ANGL +0756RENARD PATRICK 11941 71960041991013327724477.7213MSANS +9016SIMON JACQUES 11941 81973061992101369311288.1813MANGL +4931AIGNAN SALOMON 11941121972111992011403411520.2913MSANS +7676ROUX DOMINIQUE 11941 81969121990011433211715.5413MSANS +3434NOUVELLE GUILLAUME 11941 31970061991011433211715.4713MSANS +1569MOULINS CATHERINE 21941 31993051993101249910472.9113MSANS +4399SOLDATS ANNE 21941 71963091994011932314934.0013VSANS +4929MANOUCHIAN RICHARD 11943 41979011992011249910473.3213MALLEM +5101CLOT PATRICK 11943101977041995011578112723.1813MSANS +1399PLANTES MEDERIC 11943 61962111991072273717261.5413MTECHN +4835LECHIAGAT MAURICE 11944111963121993082922321683.6013MSANS +2862CASTELROC PHILIPPE 11944 81968091988062947921840.0613MTECHN +5852PUGET JEAN LEO 11944101971011990032022115554.8113MSANS +4369BOUCHER LUCIEN 11944 51976051991012022115555.3913MALLEM +6206VERANE COLETTE 21945 11975101987031684813422.3113MSANS +2842ROND THIERRY PIERRE 11946 11967121993013844228045.1613MANGL +8250JULIEN MARIE PAULE 21947 4199409199309 7803 7680.0013MINFOR +4160ALLUES DANNY 21947101978071993012529918968.6013MSANS +8190BUT CLAUDE 11947 71982041994011471512024.0813MANGL +9979FLORALE STEVEN 11947 21975041992101369311286.7813MANGL +5458BEYNAC PIERRE 11947111972031994011663613343.8813MESP +5735CONDE THIERRY HENRI 11947 51976041995011578112722.5213MSANS +6972BIRAC DANIELLE 21948 41973071991071578112722.1913MSANS +8328MAC LAURENT ROLAND 11948121977031993011369311287.1013MSANS +8020COMMODORE JACKY 11949 21977031993071369311287.0713MSANS +9492BOURGADE FREDERIC NICOLAS 11949 91972081986092470018540.6013MANGL +7494HAM JEAN BAPTISTE 11949111979041993081369311287.1913MSANS +2684LANTERNE JEAN PIERRE 11950121975041991071578112723.1813MSANS +8110LACOUSSIERE MONIQUE 21950 71993101992011202810240.4013MANGL +4050HERBILLON FRANCOIS 11950111971051991012470018540.6113MSANS +0115ACHILLE JACQUES 11951 41976021992091834514274.9313MSANS +6913MADAGASCAR FRANCOISE 21951 81977101993041471512024.8713MANGL +9541FARGE FRANCOIS 11952 91984031994011433211714.8813MANGL +1147VERTES GEORGES 11952111979041991011608112917.2413MANGL +3720FRESNE PASCAL 11952 91973021992082022115554.4213MALLEM +3427LYAUTEY SOPHIE 21952 91973051991011578112723.4213MALLEM +6348TOURELLE BEATRICE 21952 51972061990011621213034.1513MANGL +6291MONTMERY MICHEL 11952111978091995011578112723.5413MSANS +9048VILL YANN 11953 51981021993011369311286.6913MSANS +2556GAGNEUR MARTINE 21954 3199611199511 8359 7952.9113MTECHN +5041GALAND MICHELE 21954121981071995071433211714.0113MSANS +6421OUERRE CHARLEY 11956111982071993011249910473.1113MESP +8090BALISE JOEL 11956 61986011995011373711326.7113MSANS +6312RASPAIL CAROLINE 21956 619940619920111389 9852.5113MSANS +6598RUBENS JEAN MICHEL 11957121976121992011578112721.6513MMARKT +7944MAUBEUGE JEAN ALAIN 11957 11982031981031326611016.2913MMARKT +8793MOREAU BERNARD 11957111985051988031288210745.0413MANGL +8404CHEVERNY OLIVIER 11957 51983081995011578112722.8713MSANS +1860CHAMPIGNY JEAN HUGUES 11957121978031993051608112916.7213MSANS +9938CHARENTON PASCAL 11957 21981061993011471512025.2513MSANS +0001TASSIG ARMELLE 21957 71982031981031288210743.8113MSANS +6966GARE MARIE THERESE 21957 41979101993071471512025.8213MINFOR +5849ELOI FRANCIS 11958 21983051993011215710279.9913MALLEM +0222GERTWILLER ROLF MIC 11958 61983061995061894014661.1213MINFOR +9106MAISON JEAN CLAUDE 11958 11978021992051471512025.5613MSANS +3045BATISSE PHILIPPE 11958 51977121992012175716600.9413MVENTE +6087HUCHA ANNE NATHALIE 21959121981011988112090215981.6313MSANS +7732GENETS JEAN DENIS 11959121986061985061288210745.3913MSANS +8156BRASLES BRUNO ROGER 11959 81984041995071433211714.0613MSANS +4809GENEVOIX ALAIN 11960 219810919810111389 9851.6613MTECHN +2618BOCOUMYAJOUR PHILIPPE 11960 41980061992092090215981.1813MSANS +1786TREVARESSE FRANCIS 11960 21981091994011471512025.5013MSANS +7909CHARITE CATHERINE 21961 11985041984041527112373.8513CESP +7849BUCHES COLETTE 21961121985051984051527112373.8513MSANS +7624JOUVENES CATHERINE 21961 1199504199404 8359 7953.5113MANGL +2428DUCOS FRANCE 21961 1199309199209 8656 8146.1613.ALLEM +4640FINLAY JEAN PAUL 11961 319830419841011131 9658.3413MSANS +0498MONET ANDREE 21961111983081982081608112917.0013MSANS +3902ISTANBUL DENIS 11962 519840619830611131 9657.5313MINFOR +8720LOU ALBERT 119621119880819870810407 9271.3413MALLEM +9086CARNOT HENRI 11962101990111989111450311830.9813MSANS +4105CHAMINY YVES 11962 21982051987041608112917.1013MVENTE +7566SAINS CHRISTIAN 11962 31983091993051527112372.8113MSANS +2552FOCH FRANCK 11962121986061990111288210745.8113MSANS +5248VERONESE PATRICE 11962 219890119880210407 9271.9913MSANS +0127GRENETA BEATRICE GENEVIEVE 21962101984071983071288210743.8613MANGL +6150MAUREL DOMINIQUE 21962 11984071983111608112915.0813MVENTE +7881CHAILLEY ISABELLE 21963101985091984091288210744.4413CSANS +3227POINT COLETTE 21963 31989031988031249910471.5813CANGL +1094FERRAT ANNE LORRAINE 21963 91983061982061326611017.8313MSANS +0209MONTALEAU PASCAL JEAN 11963101983061986111326611017.3413MTECHN +6991COLOMBIER MARCEL 119631119870519880210791 9502.8913MSANS +8764PALMAS MARTINE 21963 81994051993051267210590.2913MTECHN +2275FANGADE ELISABETH 21963 51984021983021288210744.8513MTECHN +0866SECRET MIREILLE 21963 71991111990111249910472.0313MSANS +0133TORREPORTO CHRISTIANE THERESE 21963 6199302199202 7803 7680.4513.SANS +1651VALERE VINCENT 11963101987081991071288210745.9413MANGL +0332FRER CATHERINE 21964 7199407199307 7803 7681.2913MINFOR +1313ARPHY FREDERIC PASCAL 119641019870319860310791 9502.9813MSANS +7694BANNIERE GERARD 11964101987041992111288210745.9913MSANS +2808BOULIE ISABELLE 21964 41985051984051450311832.6913MSANS +9520ERMONT VERONIQUE 21964101993111992011202810241.1313MSANS +7726BUTIN JEAN YVES 11964 6198810198707 8656 8145.0313.COMPT +9487MARECHAUX ERIC JACQUES 11964 21988051987051450311830.9813CSANS +7195ARENE CHRISTINE 21964 71994101993101249910471.7613MINFOR +3536HAIE NATHALIE LUCE 21965 71985121984121249910472.4713MSANS +0845CHARLEMENTINE DOMINIQUE 21965 519940419920111389 9852.7413CTECHN +8486CANADEL SUZANNE 21965 41985121984121288210744.4113MALLEM +5385ROZOY TRISTAN 11965 31987071992031450311830.8313MANGL +7086BEAUME ALAIN 119651019860619850610791 9502.5313MSANS +2621LOTISSEMENT STANISLAW 11965 51986051990111616712995.9313MSANS +9449POSTE MARIE CLAUDE 21965111989031988031202810241.5713MSANS +1109PERRAULT CHRISTIAN 11966 81986041994041450311831.3713MSANS +4280BEGUDE MARTINE 21966 91986041985041288210744.1913MSANS +1973ESPRAT JEAN BAPTISTE 11966 919900119900510024 8997.9113MTECHN +6164UNIVERSITE VERONIQUE 21966 41985121984121288210744.1313MSANS +9407THIERRY GUENAELL 21966 91990091989091638413150.7913CALLEM +6809PERCEY PHILIPPE 11967 519930819920811389 9850.5313MTECHN +9633GILANDIERE ANDRE 11968 61993081994082256617146.7213CSANS +7128PERSPECTIVE PHILIPPE 11968101991101990101467711987.3613MSANS +0709AMYOT ISABELLE 2196810199603199503 7803 7680.2113MSANS +9931CIVADE PIERRE 11969 51991111990111467711986.6213MSANS +1496FERME STEPHANE 11969 519890919880910407 9271.7913CTECHN +4802JAURES MARIE CLAUDE 21969 21994011992011202810240.8213MALLEM +5721VIEUX ERIC 11969 41989061991021249910473.5413MSANS +4763PINTA ALAIN GEORGES 11969 919921019930210407 9270.6513MSANS +9618PASTOUR CHRISTINE 21969 11994081993081206910240.4613CSANS +3207PAQUERETTES MARIE CHRISTINE 21969 619940619930410668 9426.0813CSANS +0667FOURCHES SYLVIE 21969 719920719930411389 9850.6213MSANS +8437ORANGERI DANIEL 11969 31989041992121249910473.1513CSANS +4233LEBLANC CHRISTIAN 11970 419910119900110024 8999.3113MANGL +2043RAVEL FRANCOISE 2197010199301199201 9597 8728.8913MSANS +4748REDONDO CHRISTINE 21970111994081993081206910241.3013CINFOR +6379ROUGE CATHERINE 21970 11994011992011202810241.7213MALLEM +4507ALBAN CATHERINE 21970 91993011991011202810240.9813MSANS +8424FRANCE JEAN PIERRE 11970111992081991081202810240.9913CANGL +3409FLEURUS BRIGITTE 21970 9199009198909 8656 8146.6813.ALLEM +8040ROY PATRICK 11970 41991111990111839014313.7013MSANS +4985CUTTE MICHELE 21970 419940519920111389 9852.6013CANGL +0589MARTIN FABRICE 11971 11990091992021202810241.9013CANGL +2531ROI MICHEL 11971 41994011992011202810240.4413LSANS +0686RENAUDIN JEAN FRANCOIS 11971 51990091993121202810241.1213CSANS +1223ROUDIL CECILE MARIE 219711019921019911011389 9852.5913MVENTE +0603THORETON GUY 11971 7199605199505 7803 7681.0813MSANS +4480WAGNER YVES 11972 31991091994011249910473.6313CSANS +7873VALERY NORBERT 11972 319921019911011389 9852.0613MSANS +0068LAC CATHERINE 21972 419940519920111389 9852.2713MSANS +6496BEL CATHERINE EMILIENNE 219721119920219910211389 9851.3413MESP +4096XAVIER THIERRY 11973 31995121995101288210745.8513CSANS +0302FRANCH WILLIAM 11973 8199502199402 9894 8922.8613CSANS +1195GUILBERT ELISABETH 21973 819930319920311389 9851.4113CSANS +8888LEGER BERNADETTE 21973 7199409199309 9126 8455.9813CSANS +9415FONTANEY MARIE PAULE 21973 4199404199304 9894 8922.4113MSANS +8921ROSA SUZANNE 219741019940819930810668 9426.3413CVENTE +1867BASSE JOCELYNE 21974 6199404199304 9894 8923.1713MSANS +1798RUSSE THIERRY 11974 4199401199301 9894 8923.3113CANGL +8684CHEM BERTRAND 11975 6199407199307 7803 7680.3913CSANS +3841UTRILLO JACQUES 1197611199506199406 7803 7681.1613CSANS +6399ABEILLES RENE 11934 7199207199107 9511 8687.5114MSANS +1983PETUNIAS MICHELLE 21935 1199208199501 7803 7680.2614.SANS +0006DOMONT YVES 1193511198810198509 8656 8145.3914.ALLEM +6326JATELIER CHRISTIAN 1193511199107198509 8656 8146.0914.ANGL +5224MAGNOLIAS MICHELE 21936 31962111991072273717260.2614MSANS +1839ANSELME REMY 11937 21963121994011557012567.7714MSANS +6250ASPREMONT JEAN LUC 11937 91968081990071433211715.6514MALLEM +2328AGE MARIE HELENE 21937 81966071995102017815518.0914MSANS +1178NAPOLEON HELENE 21938 61967071990071578112723.2714CANGL +9417SOUTRANO MICHELE 21938 11963021963051288210744.3714MVENTE +9022GATINES CHRISTIAN 11938 11973071992011403411520.0814MINFOR +6359LANCHY SOPHIE 21938 8198811198511 8656 8146.3414.ALLEM +4141JASMINS PIERRE 11938 81976071992041403411521.0714MANGL +7981NOUVELLES PHILIPPE 11939111968011993011557012566.8214MTECHN +1626VEUR LOIC 11939 11982011993011215710279.2314MANGL +4677ORMEAUX CHRISTIAN 11939 91963121994011557012567.6614MSANS +0263ASPHODELE STEPHANIE 2194010198807198707 8656 8146.5514.ANGL +8254CONNETABLE JOELLE 21940 8199509199409 8656 8147.1714MINFOR +9870RESISTANCE PHILIPPE 11940 61967071993061834514274.5714MSANS +4388ORBAY PATRICK 11941 41965051994011557012568.1314MINFOR +0023ROUVIGNARGUES CATHERINE 21941101963011994042666519900.9114MMARKT +9628BROOKE ROGER 11942 11962021991072273717261.4714MMARKT +4240NUMANCE ANNIE 21942 71963031992012273717261.0014MANGL +3342ROMPU FRANCIS 11942 61962031994113200223583.9014MSANS +4773HA DIDIER 11942101961091994033200223583.1214MANGL +2795ECHO BRIGITTE 21944 419941019930411389 9852.4114MSANS +4188VISONNIERE MARIE CHANTAL 21945121972101971101249910473.7414MINFOR +0739VALLES JEAN FRANCOIS 11945 71966081995042666519900.3614MSANS +4899COURBANIERE DIDIER PIERRE 11945 31972061991011663613343.1614MESP +7972FORET MARC 11947 41971071991011433211714.9114MESP +1272CIGALES JEAN DOMINIQUE 11947101976101991011369311286.2114MTECHN +6191HUGO MARLENE 21948 91973101991071578112722.6114MSANS +1802CAVALIER PHILIPPE 11949111972021992092256617145.2914MALLEM +3695JEANNE CHRISTOPHE 11949121977081992101471512024.1514MESP +9900ANTOUNE FRANCE DOMINIQUE 21949 31972121992012017815516.8314MSANS +0012MAUREILLAS RAPHAELE 21951 51971071988052334017609.1514DSANS +9378VERDIERS CLAUDE 11951 41980031992061369311287.0114MSANS +8265POUSSIEU DOMINIQUE 21951 81980061988052090215979.7614CSANS +3423MORIGNY LUC 11952111979061992011608112916.7214MSANS +7925FOURNIER JEAN PIERRE 11952 21976021995061608112916.2814MSANS +2966ANTIBES JOEL 11952 41975101994041894014661.7814MANGL +7905BOISSONADE FRANCOIS 11952 51990031989031288210744.1914MINFOR +2700LERINS MURIEL 21953 91974011973011288210745.5214MTECHN +6213TOISON JACQUELINE 21954 21974081982041527112373.3514MSANS +1204TRIANON ANNICK 21954 3198801198511 8656 8146.6514.SANS +7183CABRIER MARIE FRANCE 21954111974071979112470018541.1114MSANS +0005BOILEAU FRANCOIS 11954 61974051990052175716601.9514MSANS +7845LARGADES NOELLE FRANCOISE 21955101977021992011471512024.8714MSANS +3059BLEUETS MAURICE 11956 81980071995011471512025.7014MSANS +3868IORANA PATRICIA 21957 2199201199101 7803 7680.0314.SANS +4327MARTILLE CATHERINE 21957101984091983091288210744.6414CSANS +3448FAREL MICHELINE 2195712198805198603 8656 8145.9314.SANS +6045AIGUELONGUE MICHEL 11958 71983081992061527112374.8114MANGL +3104GAIRAUT JACQUES 11959121987021989051288210743.9914MSANS +6864SCHMITT DENISE 21959 3199201199101 7803 7680.3414.ALLEM +3805OUEN GERARD 11959 91980061994011471512024.5714MANGL +7188SOL FRANCOIS 11960101981051991011868714507.4514MTECHN +7952CABRO MARIE CLAUDE 21960 4199504199304 9126 8456.3314MTECHN +3834JEANPIERRE FRANCK 11960 21981091987011684813421.4614MSANS +2909BLERE PHILIPPE 11960 31983041993121326611017.6114MSANS +8259VALOIS NATHALIE THERESE 21961 2198810198603 8656 8147.0114.SANS +9506FORESTIERE ANTOINE REMI 11961 719821119811111131 9658.0714MSANS +5269BIZET JEROME 11961111985041993021433211714.1514MESP +5031CORBIERES PASCAL 11961 21982121993041326611016.6214MSANS +0735MONTAIGUET ANNE MARIE 21962 819960619940111389 9850.5614MANGL +0633BULLY LOUISE 21962 91991121994061202810241.5214MANGL +7250SERMET XAVIER 11962 41985061986011527112373.0414MANGL +9656SARRAMEA ANDRE 11962101983081994091868714507.1614MALLEM +8263MAISONNEUVE MURIEL SOPHIE 2196212199404199301 9597 8727.8714MSANS +8851BERGES MARTINE 21964 2199406199306 8359 7952.5514MSANS +7351NUNGESSER PHILIPPE 11964 71988111987112188616680.9314MSANS +3681LOOZE BRITTA 21964 21993121992011202810240.9114MESP +1581VALLAGON MURIEL 21964 31986041987091527112374.1214MANGL +0821BRANLY YVES MARIE 11965 51986011993041288210743.8714CVENTE +3591MANNA CATHERINE MARGUERITE21965 7199407199307 8359 7952.4314MSANS +7792INSTIT PHILIPPE 11965 619870719870410407 9271.4114MSANS +5791RADEGONDE MARIE LOUISE 21966101986041985041168610048.4714MSANS +0301ESTERELLA ANTOINE PAUL 11967121989021988021450311832.0014CSANS +1872TOUL FRANCIS 11967 919900419900910407 9271.3814MTECHN +5651MURIERS CHRISTOPHE 11967 31989101995071249910472.7414CANGL +0527REMPART DENIS 11967111992071991071330611016.9614MALLEM +8590TOURNEFORT CHRISTIAN 11968 6199410199508 9126 8456.6614MANGL +5968PRESBYTERE DOMINIQUE 21968 21992011991011202810241.8414MSANS +8374AUMALE JACQUES 11968 819890419880410407 9270.6614MSANS +7416BREGUET DANIEL 11968 21987061993051381911365.2614MSANS +0198MARINES MARTINE 219691119920419910411389 9852.0214MANGL +8772GORGE MARC VITTORIO 11969121989091994011249910472.7814MSANS +9157LEON JEAN CLAUDE 11969 81989061995101249910472.6114MSANS +3588LUCIEN DANIEL 1196912199403199303 9597 8727.9914MSANS +5266COUTANT DOMINIQUE 21969 2199502199402 7803 7680.0914MINFOR +6967CONTI GILLES 11969 9199612199512 7803 7680.6614CSANS +4277COLLONGES MARTINE 21969 2199112199012 8656 8146.3814.ALLEM +6780ERIK SABINE 21970 819910619910411389 9850.6214MSANS +9400LONGCHAMPS MARIE CLAUDE 21970 71990041989041202810241.6714MSANS +0861ROUMEGONS GERARD 11973 81996101995101288210744.8514CANGL +1149MOULIN MYRIAM ELISABETH 21974 9199501199401 7803 7681.2514CINFOR +8134AJOUPA PHILIPPE 11974 3199508199408 7803 7680.5314CANGL +5009LEVIS FRANCOISE 21974 6199506199406 7803 7679.6914CCOMPT +5993FROBERT ARN 11975 7199503199403 8359 7951.9414CANGL +7536ORNE BEATRICE 21976 3199602199511 7803 7680.3214CSANS +0584LISON PATRICK 1197611199610199510 7803 7679.2814CSANS +9645TESTE ALAIN YVES 11935 31964091994011557012567.6215MANGL +4415CROIX GUY 11936 61966081981072022115555.5015MANGL +2212BAC JEAN PHILIPPE ANDRE 11937 41972051992011433211715.3215MSANS +9432ULYSSE JEAN MARC 11938 91960121988062947921840.2015MINFOR +8124CHAMIGNY STEPHANE 11938 2199001198604 8656 8145.1215.SANS +7324MOLITOR ROMAIN 11938 41962111992032572519240.6415MTECHN +8862CONDAMINES NICOLE 21938 41960111976012470018540.4715MSANS +2089ALLEN DIDIER 11939 81972041990011403411520.5715MSANS +3194COUTURIER DENIS 11939 11963101994011557012568.2615MVENTE +0835VALMANTE DENIS 11939 21959051991113327724475.7015MINFOR +8646MESNAY ANNE GENEVIEVE 21939 51967011994091834514275.5215MANGL +3426GAMBETTA ISABELLE CECILE 21940 7198912198603 8656 8146.0515.COMPT +0422VAUGAILLERES CHRISTIAN 11940101963111988011663613343.0315MSANS +0838ORVANNE PATRICK 11940 31962061993082922321683.8515MSANS +4067OUTREMONT PATRICK 11940 31962031987012022115555.6215MSANS +0744GRANAGHIU DIDIER 11940 81972021995041834514276.1015MVENTE +9034TREILLE MARIE JOSE 21940 11962051984062470018540.8215CSANS +5214BART MICHEL 11940 21964071991072273717261.7615MALLEM +3460SERENA MARTINE 2194011198810198604 8656 8146.0515.ANGL +3601MONTJEAN DOMINIQUE 21941 6198805198610 8656 8146.2015.SANS +9277ELNE LAURENCE COLETTE 21941 31968071990011621213033.3215MSANS +0325PLATANES CHRISTINE 21942121966081995091834514275.8315DSANS +9878GAUTIER MARYVONNE 21942121972101989011621213033.2915VCOMPT +9699GERVAIS JACQUES 11942 11966101992011663613343.4715CSANS +6148GATINAIS FRANCIS 11943101969101992082470018541.2815MSANS +4347MONTFRAY CLAUDE 21943 71962121991072273717260.0115MANGL +4710VIRY GUY 11943 51970051991011433211714.3715MALLEM +0354BENIGUET MARIE PASCALE 21944 41965021993111471512024.3315MINFOR +6561LEBAS HELENE 21944 21964071994011932314934.2715SSANS +1882BARBES JEAN MARC 11945 9199309199209 8656 8145.8915.SANS +0226FERRIE CLAIRE 21945 4199207199107 8656 8146.7315.SANS +6166BARGUE FRANCOIS 11946 61972071991101433211715.4515MESP +9007CLAYE PHILIPPE GERARD 11946 21970041991011433211715.0915MALLEM +9314GRILLONS MARTINE MONIQUE 21947121969031981122470018542.1015MSANS +2474RODIN ERIC JACQUES 11947121972121991071621213034.1315MSANS +0379ARGENSON BERNARD 11947 61971121991082470018541.2915MSANS +1358SEILLE JEAN PAUL 11947 31971021993061834514274.8915MTECHN +0628GOURGAUD PHILIPPE 11948 11969051993082666519901.0015MTECHN +1939DISQUE ERIC 11948 41977031991011578112723.4215CTECHN +1605FRESNES ALAIN 11948 51975061991011684813422.8115MSANS +9214CHAMPS BRUNO 11948111973081991013417325098.6515MSANS +5666NOVEMBRE JEAN PHILIPPE 11949 41971101994013417325097.9315MSANS +0720MOINES GUY 11950121978011994031471512025.3415MSANS +8674IMPERIAL JEAN CHRISTIAS 11950 21970041989111932314935.4315MINFOR +8739HUGO MICHEL 11950 21974041992011578112721.8015MSANS +9090CYR CATHERINE 21950 7198908198808 8656 8145.3915.SANS +8528EMERAUDES BERTRAND 11951 61979061992011249910472.0615MSANS +0912ALBERES MARTHE 21951 41974051991072137316331.3315MTECHN +1664BENASY DOMINIQUE 2195210197206197106 7252 7486.2815MSANS +5853ROI CHANTAL 2195210199112199012 8656 8147.0615.SANS +6634DUMAS BRIGITTE 2195210199509199409 7590 7562.6315MESP +9376LOUVRE SABINE MARIE 21952 51975051995021433211713.5315MSANS +8735BYRON MARTINE 21952 51973071991071578112722.0715MALLEM +1663PLANESTEL CATHERINE 21953 11974101993042017815517.2015CANGL +5646ALEXANDRE MARIE CLAUDE 21953 11975071991091578112723.4215VSANS +6614GLYCINES PIERRE 11953 71978101994031471512025.7215MSANS +8773CLEMENCEAU ROLAND 11953 81974031991012334017609.3715CTECHN +2191HEBERT PIERRE 11953 21972081992072043315669.2915MSANS +7378THOMAS PATRICK 11954111982051994011433211715.6315MSANS +6161HASTIGNAN ANNICK 21954 31980071994041471512025.0115VVENTE +6895VALETTES ANORE 11955 31979061993121369311288.2415MALLEM +8499ATHIS JEAN PAUL 11955 11977081976081834514274.8015MSANS +8271SPORTS PAQUITA 2195612199112199012 8656 8147.0115.ANGL +3980RAPHAEL MARLENE 21957 61980041979041684813421.6715MINFOR +9964MUGEL PATRICK 119571119821219820311131 9658.4715MSANS +0593GRACE JEAN MARC 11957 41977121992021471512024.5615CSANS +2905EXEMPT PATRICIA 21957 3199201199101 7803 7680.5915.ANGL +5492PERRIERE PASCAL LUC 11957 11983121994041894014662.7215MSANS +7685SURMELIN JACQUES 11957 5198109198812 4864 2.1915MSANS +3608ROOSEVELT FLORENCE 21957121980111994071471512024.5315MTECHN +5451TULEU JEAN LOUIS 11957111977121994011621213033.1015CSANS +4681VERIGNON JACQUES 11957 51984051995071433211714.1615CSANS +1478RESIDENCE CLAUDE GUSTAVE 11958101982091995011433211715.7415MSANS +0355ROSAIS MICHELINE 21958 81978061992051471512024.1515MANGL +4981CHRISTOL BRUNO 11958 11978061995041249910473.5415MSANS +6921MATRA FERNAND 11958 11978051993011471512024.4215MESP +2956LAPEYRERE PHILIPPE 11958 11977071985102397418037.4715MANGL +8126CYPRES JACQUES 11958 41983081982081608112917.1515CALLEM +5587BERENGUIER JEAN PASCAL ROGER 11959 81981061993031894014662.0615MSANS +2962CAYES CAROLINE 21959 61981051995041433211713.9215MESP +5994GRASSE PHILIPPE 11959 819820419811211389 9851.6915MALLEM +0767SOUCHET MARTINE 21959 91983011982011249910471.9215MTECHN +1353AGEN JEAN MARC 11960 319810319800311131 9657.6515MANGL +9232GROULLES ANTOINE JEAN 11961 31993101992011249910472.5715MALLEM +3855BAUMES JEAN LUC 11961 41982111994031527112373.1015MANGL +9369HELBRONNER VERONIQUE 21961111994031993031202810241.5715MINFOR +4341OLIVIER CHANTAL 21961 31981101980101684813422.3515MSANS +5305DAME ANNIE 21961 51981071995071433211715.5915MSANS +6569GAULLE JEAN CLAUDE 11962 91989041992121249910472.3015MSANS +6715SEINE KARL 11962 719840219830211131 9657.1215MSANS +3136GOBELINS JEAN PIERRE 11962 21993091992011249910472.3015MSANS +5291LAMBERTIANAS MARIE CLAUDE 21962 7199506199406 9126 8457.5615DSANS +6342MISSECLE DIDIER 11963 41989111988111539912453.6015MSANS +3447VIAL GEORGES 11963 51985041984111527112374.3415MALLEM +5045GRAZAILLES LAURE 21963 8199108199008 8656 8146.9715.INFOR +7974CHAUSSEE PAUL 11963 61985071991121288210743.9215MSANS +2189PEYBERT DIDIER 11963 81983081988112090215980.4615MSANS +7262JOZE PATRICK JEAN 11963 91983111982111326611017.4115MSANS +8222ETANG LIONEL 11963 71985011993031693613497.9015MSANS +6881OUEST OLIVIER 119631219840419840210791 9502.0815MSANS +8121MADELEINE JEAN 11964101984071983121288210745.1815CESP +6828CONCY JEAN MICHEL 11964 91988041994091693613499.2215MALLEM +3939CHURCHILL BRIGITTE 21964101992021991021330611016.6015MSANS +5116PEREIRE DIDIER PAUL 11964 21986071992121288210745.9915MSANS +2174TEISSEIRE ELFRIEDE 21964 4199212199112 8656 8145.5615.ANGL +0585CRETS LAURENCE 21965 3199306199209 9597 8728.8415MSANS +7988DOMAINE PASCAL 11965 61984051993071527112372.8715MSANS +1646PERDRIX MARCELINE 21965 51985101984101288210745.7015MSANS +7090KERAVEL GILBERT 11965 11988041994091693613498.2215MSANS +3100BARILLERIE BRUNO 11965121988111987112188616679.7215MALLEM +8075ESCALE YOKO 21965 61991061990061381911365.3215MSANS +1009CHARRIERE SYLVAIN 11965101993021993121249910473.1115MSANS +8542MOLIERE PIERRE 11965 51987111995021450311830.6215MSANS +8729ROSTAND PIERRE 119661219860419850410791 9503.7015MANGL +8802DOUMER JEAN LOUIS 11966 619860319930110791 9502.8415MINFOR +8596ABEBERRY PATRICK 11966 619891119910910407 9270.2415MALLEM +6485CHALEUTRE GILBERT 119661219870719860710407 9271.9715MTECHN +9054FAURE FRANCIS 11966 519860719890710791 9503.7915MALLEM +6168CHENEAUX COLETTE 21966 61994021992011202810240.1915MSANS +9809PESSOT JEAN JACQUES 11966 11992011991011202810241.3015CALLEM +8041BIGUE THIERRY ALAIN 11966 619860419850410791 9503.8515CCOMPT +7730CALIANES STEPHANE JEAN 11967 3199404199304 9894 8921.6315CSANS +2161TOUCH MICHELE 21967 11989111988111949415052.4015MSANS +1999LISLE GILLES 11967111990021989021539912451.6115MMICRO +2038GRANDES ROGER 11968 2199312199212 9597 8728.0115CSANS +4888BELMONTET ANN 21968 619960419950410668 9426.5315MSANS +5809ROUSSIER DENIS 11968111990011989011467711987.1615CSANS +0146ROSESCERNY MIREILLE 21968 5199602199502 8656 8145.5715MANGL +3432GARCIA PHILIPPE 11968 51990121992041249910471.8915CSANS +3058SANGRIA CAROLINE 219691119910519900510024 8998.6815MANGL +7679BLEU CHRISTIANE 2196911199207199107 8656 8146.3815.SANS +0602VAUGINES GILBERT CHRISTIAN 11969 91991061994011249910471.7615CCOMPT +5226BOULEE PHILIPPE 11969 819900419890410407 9271.7215CSANS +5904ORANGERIE MARIE CHRISTINE 21969 1199001198712 8656 8146.0115.ALLEM +8131NICE CHANTAL 21969 41989031990011450311831.6615CTECHN +8570SOULAGE MICHEL 11969 41989091994031330611016.4415MVENTE +5857ALLEE JACQUES 11969 7199304199206 9597 8728.9515MANGL +6920LOTI YVES 11969 919911219901210024 8999.3115CVENTE +3599PLANA JEAN PIERRE 11970 61991051990051467711987.6115MALLEM +7579BERGUEROLLES MARIE CLAIRE 219701219910919900911389 9852.4115MSANS +0494DESBORDES BERNARD 1197012199101199001 8656 8145.1215.SANS +9496MONTBAURON ERIC 11970 61991051990051467711986.2215MSANS +8603DESCENTE FRANCOISE 21971 5199607199507 7803 7680.9915MSANS +2449TAHITIAA MIE 21971 619940919930810668 9425.5515MSANS +7786LOUP ISABELLE 21971 61991121993041202810240.8915MANGL +6100MARNE JOEL 119711219940719940111389 9851.4615MSANS +8569ASPIRAN ANDRE 11971 61991121994011249910472.8415MSANS +0626ODET PAULE 21971 2199611199511 7803 7681.0415MSANS +7006ARGENCE PHILIPPE 1197212199308199208 9597 8728.2215CANGL +2516MAILHEAUX LAURENT 11972 41991121991061202810241.5215CSANS +4928COLLEDEBOEUF ANNE MARIE THERESE 21973 51994071993071206910240.6415MANGL +1718HACHETTE ERIC 11974 7199606199506 7803 7679.4615CALLEM +5240MUSES JEAN BERNARD 11974 9199507199407 9894 8922.4415CANGL +3654MAIRIE MARIE 2197412199507199407 7803 7680.6315CSANS +3017BAUCHAT MICHELE 21975 8199505199405 8359 7952.4615MSANS +1395BROSSOLETTE MARIANNE 21975 4199609199509 7803 7679.7615CESP +9154REYNARDE FREDERIC JEAN 11975 8199406199306 7803 7680.3415CANGL +3041BOYER ERIC 11975 3199406199306 7803 7679.3315CSANS +8817FILOURIE FRANCOISE RENEE 21976 8199506199406 7803 7679.3615CANGL +3408BRIE BRUNO 1197611199508199408 7803 7679.4515CSANS +6446WYLLIE PATRICK 11976 1199507199407 7803 7679.4915CSANS +7476SOMME BEATRICE 21976 4199606199506 7803 7680.8615CSANS +8951BARNIER MARTINE 2197612199506199406 7803 7679.4915CTECHN +5707FOCH DENIS 11977 7199607199507 7803 7679.3615CCOMPT +9331PEYPIN MICHEL 11977 3199506199406 7803 7681.2015CALLEM +2044RENAN BERNARD 11977 7199607199507 7803 7679.9915CSANS +0991GUTENBERG BERNADETTE MARCELLE 21930 6199207199107 9894 8922.1616MANGL +4650NORD PASCALE 21930 6199001199506 8827 8262.8016.SANS +7670BOURG ERIC 11935 11967071994011433211713.8816MCOMPT +1067ITALIE SVETLANA 11935 81973071991011433211713.6116MSANS +7446BELMONT MARIE JEANNE 21936 4199010198910 8656 8145.0316.ANGL +4567VICTORET DOMINIQUE 11936 2198812198511 8656 8146.6116.ALLEM +1382ARIES DOMINIQUE 11936 11970081991041433211713.8816MANGL +7727TERRASSES BERNARD JACQUES 11936 91957051994123417325096.9816MALLEM +2304MERCUES JACQUES ANDRE 11936101955061992113327724476.7316MSANS +1717FEUILLETS EDITH 21936 51971091992021932314935.3116MSANS +5274VALLEES PASCALE 21937 8198901198511 8656 8145.6216.INFOR +1751BESSE WILLIAM 11937101959021994065760041273.7516MSANS +7544TRAIL PATRICK 11938 41971081991101433211714.7916MINFOR +0247VIARD CHRISTIAN 11938 11962121984073200223583.9016MTECHN +9383CHALONNIERE MARIA 21938 4199009198909 8656 8147.1916.SANS +1762EMERAUDE BRIGITTE 21938 11975051995011369311288.0616VESP +8379MAGNIOUX NADINE CHRISTINE 21938 81966071990071578112723.4716CTECHN +4635CYTHERE CORINNE CHARLINE 21939 4199201199101 9085 8418.3916MANGL +2414PILATTE MARIE JEANNE 21939 11962051983032470018540.4716CSANS +9003MOULIN DIDIER PAUL 11939 51980021995121471512025.3716MINFOR +6102MARINVILLE ERIC ANDRE 11939 21971031991101433211714.6416VANGL +9945ELANCOURT AGNES 219401119841019810111131 9658.0916CVENTE +5615THORELLE FRANCOIS BERNARD 11940 219840119840311131 9658.6416MALLEM +9231HERBILLON MADELEINE 21941 11968071990071578112722.1216MSANS +9547REMY CATHERINE 21941 31965121990012273717261.0916MTECHN +8538DAMPMART THIERRY 11941 41964071994013200223582.7616MSANS +4432ECOLE CLAUDE 11941121966071995041557012566.5416MALLEM +7122SORRIERES JACKY 11941111975031992011403411520.6216MSANS +5855CESARI PHILIPPE 11941 41972081992011433211715.6916MSANS +4569BELTCAGUY JEAN PIERRE 11941 31974041991011369311288.0016MSANS +0119BAUMETTES VONICK 21942 7199309199209 8656 8146.7316.SANS +5799ICARD JACQUELINE 21942 31968071994031834514275.4316VTECHN +3230NIBELLE PHILIPPE 11942101963011990042273717261.8816MTECHN +1160PLAY JEAN DANIEL 11942 81975091993041369311287.9716MSANS +8701ORRIANES DIDIER 11942 81964101989122470018540.0616MTECHN +9211ANJOU JEAN CLAUDE 11943 81969101991011433211715.4716MSANS +2069CHURCHILL ANDREA 11943 61970061995042201216756.8916MINFOR +4457ARBAUD JEAN CLAUDE 11944 61971011992102137316332.3116MSANS +9480SABLONNIERES CAROLINE 21944 11962121991072273717261.7616MALLEM +1573HOCHET HELENE 2194410199208199108 8656 8145.3416.ESP +8504ANDRE FRANCOISE 2194510199301199201 8656 8145.4216.SANS +2608THIRD ALFRED 11945 91971041990012137316331.6616CSANS +0698CEDRES BRUNEL 11945 91968061990071433211714.3916MSANS +8224CLOSERIE MARTINE 21945 61971061991101932314935.2616VTECHN +6798MONTESPAN JEAN NOEL 11946 21983121993011215710278.5716MTECHN +4449TRAW ALAIN 11946 21976091993041369311287.8216MSANS +1458BOIZEAU PHILIPPE 11947 11973071993041518612334.9216MANGL +8853OUF HENRIETTE 21948 91970011994062201216756.8016MALLEM +0743GEORGE BERNARD ALAIN 11948111973021991011433211714.9316DALLEM +2218GEMEAUX GUILLAUME 11949 51970101992072739020404.5916MSANS +3154MONTAGNE SERGE 11949 31973061992011403411522.1316MSANS +2871VILLERMONT EVELYNE 21949111970061993102175716601.0116MINFOR +8174SARDAN PATRICK 11950 61978051990091966515206.0716MANGL +5180LONE ALAIN 11950 31978021994011369311287.4616MANGL +7155COSSON DOMINIQUE 11950 41970101991012990722150.5216MANGL +7616QUAI FRANCOISE 21951 51973101991071578112723.5116MSANS +1943VAUGIRARD DANIELLE 21951 7198810198709 8656 8145.3916.SANS +8270LOUPS CHRISTIAN 11951111979031993011471512024.3816MALLEM +2654PRESSENS ANNE MARIE 21951 31973011976011288210745.5416MINFOR +8175COUDOURON LUC 11952 21978061995011249910472.6616MSANS +9368DOLMENS CLAUDE 11953 81977081991071578112723.3816MSANS +3828ESTIENNE PATRICK XUAN VINH 11953 71984071992041326611016.1116MINFOR +8961APPART JEAN LUC 11953101973021992102017815516.1216MSANS +9113PERIGUEUX JOELLE 21953 21973101991071578112723.0616MINFOR +7735FLEZ PIERRE 11953 11978071994011403411521.0216MINFOR +4018FONTMERLE MICHELINE 21953 8199311199211 8656 8146.9516.SANS +5157GREZ FRANCIS 11953111974051992082350617725.9216MTECHN +5311SUFFREN MARIA 21953 41973021990101578112722.9116MANGL +7764BRON CLAUDE 11953 91979081994011249910472.9216MINFOR +0120POSTAL CHRISTIAN 11954 31976071994011369311288.1516MSANS +5265HUGO JEAN 11954 51975021993092256617146.9116MSANS +5590SOPHIE SUZEL 219541119960119940110668 9425.3116VSANS +5401LARREY MONIQUE 21954 31975041995101881314585.7316MSANS +6562LANTERNE CLAUDE 11955121980061995041471512024.3516MANGL +1519GOURDON SYLVAIN 11955 51980051995011249910472.9716MVENTE +3963RUISSATEL MICHEL 11955 51979051994011249910473.2216MSANS +3870COMMANDERIE BERNARD 119561219850419870910791 9503.3616MANGL +6506SUPERIEUR JEAN CLAUDE 11956 31979011994011249910472.3016MINFOR +0863FIGUIERES JEAN PIERRE 119561219890919881210407 9270.6216MSANS +1566GROS ANDRE 11956 419950119950110363 9232.9816MSANS +2124CHASSEURS AUDE 21957 219920619930110024 8997.9516MINFOR +5594VAAGGASSE CLAUDE 11958 71978051992011471512024.3916MALLEM +7033TITAN ERIC 11958 41978011992021471512025.2516MSANS +5186CEYRESTE JEAN 11958 91980091993041471512024.7116MSANS +7174SEPTEMBRE PIERRE 11958121978081995071369311286.1516MSANS +4207REGARD GINA 21958 1199107199007 8656 8146.5216.SANS +0723GARDONNE SIMONE 21958 21989081991101249910473.2416MALLEM +3190MONTAUROUX FRANCINE 21959 61989011991071249910473.4116MINFOR +7379SUD PHILIPPE 11959 81982051992011527112374.2216MALLEM +0598FERBER GUILLAUME 11959101981051995082256617146.9116MINFOR +6321CEZANNE ALAIN 11960 41984041993041326611016.0616MSANS +6273FONVERT MARC 11961 619901019891010407 9271.5916MSANS +6867GENEVE ANNE MARIE 21961 31983011982011608112916.2516MSANS +7828PUISEAUX BERNARD 11961 5199403199303 9597 8728.1416MSANS +7252CHEM MARC 11962 41986091992041949415052.0616MSANS +0052TEMPLIERS CATHERINE 21962 61982021989041608112916.9716MSANS +4660HAROUSTA PHILIPPE 119621119900119890110024 8998.9516MVENTE +3619MURAT PIERRE 1196212199406199306 9126 8455.9716MINFOR +1366REINE GEORGES 11962 5199606199506 9126 8456.6416LSANS +6020YVART ELISABETH 21962121994051992011202810241.1616MANGL +9740SEJOUR DANIEL 11962 81982121992041326611017.0516MSANS +3790BEAURONNE PAUL 11963 419840619830610791 9502.6816DSANS +0831VICTOR MICHELE 21963 11985121984121288210744.4116MSANS +5171NEIGE DANY 21963 21985051984051527112372.9916CSANS +4834CROIX CLAUDINE 2196310199101198807 8656 8145.0616.SANS +9575HILL DOMINIQUE 21963 319951219941211389 9852.5416MSANS +1494FECAMP DANIEL 11963 31991041990041381911366.6116MSANS +2944MONCET THIERRY 11963 91991081992051249910471.9416MCOMPT +8018DRAGON XAVIER 119631019830519820510791 9503.5216CCOMPT +7258CASTELLAS LAURENT MARC 11964 31984091992121288210745.9316MSANS +3956CORDIERS PHILIP 11964 219861019851010791 9503.0416MSANS +1434TRESPOEY HENRI NICOLA 11964101987041991091450311831.5216MTECHN +7725MASSANE LAURENT ALEXANDRE 11964 819850919840910791 9503.9916MALLEM +5509FLAMANTS OLIVIER 11964 219890519880510407 9271.8216CSANS +9732VENT THIERRY 11964 91987071988121288210744.9116MALLEM +8053CAUSSINIERO ANNY 21965 8199610199510 7803 7680.3216MANGL +8933CHOPIN VERONIQUE 21965101986061994091288210744.0816MANGL +4294GRAVIER PHILIPPE ARTHUR 11965 61994041992011202810240.0416MTECHN +7996LOUPIATS CATHERINE 21965 3199312199212 9597 8728.5816CSANS +5751DIMANCHES JEAN FRANCOIS ROLAND1196511199404199201 9597 8727.9916CSANS +3314COPERNIC NATHALIE 11965 91993111992011202810239.8316MALLEM +8095MALIKA ESMERALDA 21966111994051992011202810241.6116MINFOR +2514CANGINA MARIE CLAUDE 21966 519951219941210668 9426.3416MANGL +8137BARBE SOPHIE 21966 61985061984061202810241.6116MSANS +2086FELIBIEN GILBERT PIERRE 11966 619860919850910407 9270.8916MINFOR +5743FOUESNAN PHILIPPE 11966101987021991071288210745.4316MANGL +7755ALGLAIS BERNARD 11966 81989031988031249910473.3616MVENTE +4183NEUVICQ MARIE CLAUDE 219661119950119930411389 9851.0116MSANS +5854BINEAU BRUNO DANIEL 11967 51991081990082107316097.0316MSANS +1015HUSSON MICHEL 11967 31990041989041467711985.8116MINFOR +8894VEGA YANNICK 11967 1199311199211 9597 8729.4016CSANS +2165POMONE EVELYNE 21967111989031993071381911366.4716CSANS +3736LYS DIDIER 11968 919950119950110363 9232.6616CSANS +9047PUITS VINCENT 11968 21990081989081539912453.7216CSANS +6745COMMANDANT DOMINIQUE 21968 6199403199303 8656 8146.3216MANGL +2664JAMES CHANTAL 21968 719940419920111389 9851.5216CSANS +2387LECLERC BERNARD 11968 819950119950110363 9233.9016MSANS +8096PAROISSE DOMINIQUE 21969 61991091991021330611016.5116MTECHN +8708BOISSY BERNADETTE 21969 7199006198708 8656 8145.2116.SANS +7358CUQUERON MARTINE 21969121994031992011202810240.4616CSANS +5192BESSOU ROSINE 21969101991111990111839014314.0816MSANS +1422LAVAUX DOMINIQUE 21969 11992061991061202810240.9816CSANS +4798IDOLE MARIE CHRISTINE 21969 219930419920411389 9852.1516MSANS +7101NOGENTAIS CHRISTINE 21969 91989111988111202810240.5916MSANS +3573MIRBEL ANTONIO 119691019900519890510024 8999.4916CSANS +8187NORD ROBERT 11969101991101990101467711987.9716MVENTE +2888CASTELS YVONNE 21970 419960619940110668 9426.8916MSANS +5902GARRIGUE MICHELE 21970 21994021992011202810241.7616MSANS +7139BRUANT ISABELLE 21970 919940619920111389 9852.0916MSANS +8561FREGATE DOMINIQUE 11970 81993041995091267210590.1516LSANS +8391ESCOURADIERES CHRISTOPHE 11970111991111990111467711986.0816CSANS +7113FLAVIEN MICHEL 11970 91992121991121467711987.9416MSANS +1139CHAMPIGNY LIONEL 11970 11995031993041202810241.7416MANGL +3774FAHNESTOCK MAX 11970 11992101991101467711987.9016MSANS +3115MAGATIS PIERRE 11971 119960219950211389 9851.0316CSANS +7606ITALIE JACQUES 11971 4199407199307 7803 7679.4516CVENTE +2804JOYEUX FRANCIS 11971 21990061992121202810241.0416CSANS +5659HOULE PATRICK 11971 21993121992121420611637.3316MESP +9687LANCIERS DANIEL PHILIPPE 11971 8199311199211 9597 8727.9016CANGL +5871LACOURTADE PHILIPPE 11972 11991121994011249910472.6116CVENTE +4676LUPINO ATSUKO 21972 6199501199401 8656 8146.1416MTECHN +2981VIREBELLE FRANCOISE 21972 219940819930810668 9426.5716CSANS +1979LOMBARDS JEAN DIDIE 11973 6199309199209 9597 8729.0716CSANS +7372BOIS MONIQUE 21973 1199407199307 7803 7681.1116CSANS +3844PERIGORD NICOLE 21973 319930919920911389 9850.5616CSANS +0819THOBIE DANIELLE 21974 1199409199309 8359 7952.6116CALLEM +8257SEVIN CLAUDINE 21974 4199409199309 8359 7951.8816CSANS +5832DELAGRANGE MICHELE 21974 3199309199209 9597 8728.8216MSANS +6357MORTARIEU MARIE JEANNE 21974 8199607199507 9894 8921.8516CSANS +7800TOURNELLES FLORENCE JACQUELINE 21974 519950119940110668 9426.0016MSANS +1978CENIS ALAIN 11974 71994091994011202810240.8616CSANS +4208BEAU OLIVIER 11975 8199510199502 8359 7951.6616CTECHN +2472TOWERS CORINNE 2197511199410199310 8359 7953.1116CTECHN +8054QUINTA PASCAL 11975 4199606199506 7803 7680.5016CSANS +5910JARRY CLAIRE 21976 1199608199508 7803 7680.6616CVENTE +9513GENISSIEUX HERVE 1197612199607199507 7803 7680.0016CSANS +6334MUSSET MARIE PIERRE 21977 3199607199507 7803 7681.4716CSANS +3177VILLEFRANCHE NICOLE 21977 7199607199507 7803 7680.4416CESP +3707PREVOST CLAUDIA 11934 81963071994011663613343.7817MANGL +7266OUCHE JEAN LOUIS 119351019930919910110407 9272.2217CSANS +5677VIRGINIE JEAN PHILIPPE 11938 51963111989071663613342.9817MESP +0564PEYREBELLE JOELLE 21939 11967011989091932314934.5317MSANS +6752SILLERY PIERRE 11941 41962061985072273717260.5917MSANS +7389BILLOUX NATHALIE 21941 3199012198912 8656 8145.3317.SANS +0440MALASSIS EVELYNE 21942 11993101992011202810240.7217DSANS +6527CURSON JEAN LOUIS 11946 71974121991011369311287.1017MANGL +4166EVIAN FRANCOIS 11946 31969101986012470018540.6117MSANS +6635ROSAY FABRICE EUGENE 11946 71970031989122334017609.4317MANGL +3999MUSARDIERE CLAIRE 21946 81968111983042470018540.9317VALLEM +9845YVETTE MARTINE 21947 71972101990071621213032.1717MANGL +1439FIEF EVELYNE 21947 91974071991071578112723.1817MSANS +2404ROME BRUNO 11947 91988031995011433211715.0917CSANS +8776ROME THIERRY 11948 61974011995031911114779.7717MSANS +5946TERRA MARIE CHRISTINE 21950 91970011991071578112723.6817MSANS +5232DEBUSSY CATHERINE 21951 81973051991021684813421.7217MTECHN +0869CARAMEL ELIANE 2195211199207199107 8656 8146.0917.SANS +1911PLASSAN THIERRY 11954 41980031992031608112916.5917MTECHN +1670LORETOHOHE MARIE EDITH 21954 11974071993101911114780.0617MANGL +9187BINGER DOMINIQUE 21955121986091991041249910471.9217DESP +2614COLLONGUE MARCEL 119561019810319820611389 9852.2917MANGL +9658BEAUREPAIRE MICHELE 21957 81977071992011471512025.4717MSANS +1305HOPITAL DOMINIQUE 21957121979071980041684813421.6717CSANS +2762PELUT PIERRE YVES 11958 119881219871210407 9271.4117MALLEM +4217ALEXANDRA JEAN MICHEL 11958 71983031993081326611017.7417CTECHN +8469CRETES PAULETTE 21959 619910719900710024 8999.3117MANGL +1495RIBAUTE PIERRE LAURENT 11959 119801019820611389 9850.8817MINFOR +1650BRIAND SYLVIE 21959 91980041992121608112915.9217MSANS +8360JOUY CLAUDIE MARIE 21959 319940419920111389 9852.7417MSANS +5653ROLL ROBERT 11959111988061991091450311830.5617MINFOR +4042TANE PHILIPPE 119591019870719890410791 9503.7017MANGL +0940YVETTE MICHEL 11959 31978071991032022115555.5017CTECHN +9875DANREMONT THIERRY 11961 41982091995041433211714.5117MTECHN +9667CASITA JEAN LUC 11961 81982081995121638413150.9717MSANS +1371ROME MAURICE 11962 21984051995081710713577.9317MSANS +6755AUBAIS BRIGITTE 21962121983011993051527112374.0017MTECHN +2907BRETEUIL FREDERIC VALERY 11962 41993021993081202810241.7217MSANS +4530MICHAUDES CHRISTINE 21963 11982071981071326611017.7417CSANS +9935TAZARKA BERNARD 11963 91992111991111330611016.2617MSANS +1813PLOUGUIE DANIEL 11964 21985081989051288210745.8117MTECHN +2666DAUX JACQUES ANTOINE 119641219840119830110791 9503.3917CANGL +4498LOUVEAUCOURT MICHEL 11965 81985061988061288210744.9117MSANS +6274BRIE PIERRE 11965 21984071983071288210745.4317MANGL +8475PATHE LOUIS 11966 91987111993091839014314.3417MSANS +2923LACLOTTE NADINE 2196610199501199304 9597 8728.7217CTECHN +5049CROZES CAROLE 21966 71987021992011450311832.6817CMANAG +9666RABINES MICHEL 11966 81986071995121450311832.3617MTECHN +1503LESTRADE GILLES 11967 119870119860110407 9272.1917MINFOR +2577JONCQUIERES MARCUS 11967 61987041990091249910471.6517MANGL +6372VILLARS LYDIE 21967 3199411199311 7803 7680.5917MANGL +8399HAMEAUX BERNARD 11968 61990071991081249910473.2417MSANS +0624BLOY MICHELINE 219681219940619930610668 9427.0217MANGL +0069ARTHUR CLAUDE 11968 71989021993041249910472.5717MTECHN +9429MATIN FRANCOIS 11969 919890419890410407 9271.0217MANGL +6364LEONIE SERGE 11969 919900319890310024 8998.4117MSANS +3990SALANGANE CATHERINE 21970 619950919940110668 9426.0017CALLEM +9447AYGULF CHANTAL 21970 419950219930411389 9851.1617MSANS +5807CIMES ODILE 21970 1199404199304 9126 8457.6317MINFOR +6551FOUCHER CHRISTIAN 11970 81990081989081202810240.2617MSANS +9323SAUVAGERIE MARCEL 11970 7199512199412 9126 8457.5917MSANS +0265PEYRIERE YVES 11970 91990111989111381911366.7217CTECHN +8683BRUSE VERONIQUE MARIE PAUL21971 119960119950111389 9851.9717CCOMPT +4051CHANTILLY PATRICK 11971 8199602199502 7803 7681.2017CINFOR +5145ETHORRI BERNARD 11971 9199309199209 9597 8729.2517MSANS +2756CADDESI THIERRY SERGE 11971 919910719900710024 8998.0117MSANS +5810HAUT CAROLE 2197212199610199510 8656 8146.9517MESP +1266GAUTIER VIRGINIE SOPHIE 21972 1199603199503 9894 8923.0217MSANS +8948CLOUD RICHARD 11972 81991071992041202810239.8317CSANS +4395DELIBES ERIC 11972 619940219930211389 9852.6917MESP +9450DAMMARTIN YVES 11972 6199404199304 9597 8729.4517MSANS +4403MORTIERS BERNARD 11972 219910919900910024 8999.0917MANGL +1227ROSSAT MICHEL RENE 1197212199407199201 9597 8728.3517CINFOR +8746VERGER JACQUES 11972 519940219930211389 9851.0117MCOMPT +9344ECHEZ CLAUDE 11973 9199505199405 9126 8456.2417CSANS +4420CASA ALAIN JEAN CLAUDE 11973 319930719941111389 9851.8417CSANS +2752BEAUTE PATRICK 119731219930419920411389 9851.7417MSANS +0850MULON GERARD 11974 619940919940110668 9425.6717MCOMPT +2641ESCURIAL JEAN FRANCOIS 11974 3199606199506 7803 7679.5117CTECHN +2955MALETACHE GENEVIEVE 21974 9199508199408 7803 7680.9817MSANS +5801COSTES NOEL 11975 8199609199509 9894 8921.3117CSANS +2146DAUMIER IGINIO 11975 4199310199210 8359 7951.7917.ALLEM +3984OR GISELE 21975 9199607199507 7803 7679.6717CANGL +9050GIRAULT LILIANE 21975 5199406199306 8359 7952.9617MSANS +3948SEIN FREDERIC 1197511199410199310 8359 7953.3217CSANS +4265MIGNET BERNARD 11976 5199507199407 7803 7679.7817CANGL +0351RIMBAUD JEAN PAUL 11976 619961219951211389 9852.3617CSANS +1931BERGERAC DIDIER 11933 3198810199501 8656 8146.3218.SANS +9698SCHUMAN DOMINIQUE JEAN 11935 71968101995041557012568.3518MANGL +2020JOLY PIERRE 11935 119870719900710791 9503.6618CSANS +7058BARGE REMI 11935121955021980013327724475.6718MTECHN +3747MARIES RENE 11935 51955021988013844228044.8418MSANS +3141VALLONGUE GUY 11936101976071991011433211715.2418MINFOR +1098CACTU CATHERINE 21936 41962111991072273717261.7218MINFOR +9199PLOUHARNEL BERNADETTE 21936 21967011989102273717261.0418DINFOR +9270ABBE SOPHIE 21937 71968061991041932314934.4118MSANS +2969BEDOYERE GUY 11937 7199001198412 8656 8146.6418.TECHN +1219HOCHE JEAN MAURICE 11938 51969051990011433211714.1218MANGL +1887TOURNON GILLES 11938 51967051990011433211714.1918MANGL +5417AMBREVILLE FRANCE 21938 51973071990071578112721.7618VSANS +1954SOPROCOM PATRICK 11938 71973101992011403411522.1318MSANS +0028ROLE PHILIPPE 11939 81963111994011557012567.1418MSANS +6857KERPADIRAC EMMANUEL CLAUDE 11939 71965051990011433211714.6418MANGL +3697PEYRUIS BRIGITTE 21939 81962061991021834514276.0918MSANS +5636SAVE RENE 11940 21969061991101433211714.1918MSANS +5290VIALE PHILIPPE 11940 11974071991011369311286.8418CINFOR +2591COLLE FLORENCE 21940 3199207199107 8656 8146.5218.SANS +7651GOZLAN XAVIER JEAN 11940 41960031993033200223582.7318MSANS +8388MONTROUGE LOIK 11940121974071992011403411520.2018MTECHN +3384LIVRON FRANCOISE 21940 71964071992072273717261.1818VSANS +7291MARLY MARTINE 2194010199206199106 8656 8145.8318.INFOR +2644EAU FRANCIS 11941 11968121990011433211713.5818MSANS +0515WRIGHT PHILIPPE 11941 21973061992041403411520.2118MSANS +1243SEMAPHORE ANDRE 11941 71969111986072470018540.5618MTECHN +1791PASTEUR BRIGITTE 21941 61974101992011578112722.8818MTECHN +1226SAUD JEAN PIERRE 11941 91973081995011621213034.1018MANGL +3874PASSERINES DOMINIQUE 21941 61966021992042273717260.5318MANGL +5394QUAY YVES 11941 91973041990101684813421.4518MANGL +0308BELLIVIER MICHEL 11941 21963091988043417325098.6318MSANS +8445HEROS SYLVIE 21942121963091991082470018540.5318MSANS +7703CERF NICOLE 21942 51978071992121471512025.6118MSANS +3807REBAIS FRANCOISE MICHELE 21942 31972041989011621213032.7018CSANS +5173TARCO MARC 11943 51973051993011369311286.4718MSANS +3544RESTANQUES SERGE 11943111971121990011433211713.8018MVENTE +7289FRAMBOISIERE DANIELE 21943 51969071991011578112721.6718CALLEM +2761WYLLIE ANNIE 21944 41963121985051932314935.2918MSANS +7593AMPHORE BERNARD 11944 71964101989062922321684.7218MANGL +7373PAMPERIGOUSTE MICHEL 11944 21972101992011403411521.3418MSANS +1159PATIOS ELISABETH 21944 91970101991101932314935.2618MSANS +6999BEL ALAIN 11945121969101990011433211714.7918MSANS +7962VIGIE MICHEL 11945 91971071994122295317300.3718MTECHN +3123GAULLE ERIC NOEL 11945 51973121991082470018540.6918MMARKT +9943DOUMER PATRICK 11945 51968041990071433211715.1118MSANS +3765IMPERATORS GHALIA 21945 61965021993102137316332.1118MSANS +6688COULOUNIEIX HERVE JEAN MARIE 11945 61971031991062273717260.7718MSANS +0965JUDITH BERNARD 11945 51966051987122470018542.2418MINFOR +3763MERMOLLOD DANIEL 11945 21972071992011433211713.5318MSANS +0042POUTGE PHILIPPE 11945 81968081990101433211715.7218MSANS +2250JACQUIN JOEL 11946 41971071991102022115556.3818MSANS +7112REDOURTIERE VERONIQUE 21947 3199303199203 7677 7603.7718.ANGL +5217SARRAZINIERE MICHELE 21947 51968111991102137316330.6718MINFOR +1448MAUPASSANT PHILIPPE 11947111968121988102273717260.8118MSANS +7506CLAP JEAN JACQUES 11947101968061986042470018540.8918MSANS +5237JAS MICHEL 11948 21975101993121369311287.1918MSANS +0341MAKILA NICOLE 21948 2198901198510 8656 8145.1118.ESP +3475REMISE MARIE CLAUDE 21948 41968041989042273717260.3218CSANS +3575DONAT JEAN MARC 11948 51972121991011621213033.6418MINFOR +0433CAROUBIER PHILIPPE GABRIEL 11948 5198801198306 8656 8146.1618.ANGL +9184PINEUILH CATHERINE JEANNE 21948 11968091967091493112142.5618MSANS +1377KERCOLIN ALAIN 11948 91972061992112137316331.4718MSANS +7248MERCIER FRANCOIS 21948 71970071993121834514275.1418MSANS +9014FELOUQUE JEAN LOUP 11948101972121994011621213032.9718MCOMPT +1756FREMICOURT DOMINIQUE 11949 81969121989111932314933.9918MANGL +7383BLAISON FRANCOISE MARIE 21949111970071994031834514275.1618MALLEM +6290TILLEULS BERNARD 11949 61971041990123417325098.1518MINFOR +2226VIVO DOMINIQUE 21949 41971101995041834514275.6118MTECHN +8441SARGIS CLAUDE 21949 11973061993082175716601.4318MINFOR +1520PIC JEAN JACQUES 11949 11975041992041403411521.8618MSANS +5696DRUGEON PATRICE 11949 81980071995041249910473.1818MANGL +1048MORIZET ANNE 21950 11970121994051834514274.8318MSANS +4058FRANCE ALAIN 11950101974091991071578112722.6118MMANAG +0512MARBO JOSIANE 21950 71972011992102017815517.3818MANGL +2797GUY LIONEL GILLES 11951 51976051993071894014662.5918MSANS +9267SAUSSIERE MARC 11951111972041992102017815516.2418MSANS +6865EMMANUELLA ALAIN 11951 51982041993011369311287.7418MSANS +0116GALICIE FRANCOISE GEORGETTE 21951 41971101992011471512024.0618MANGL +6144ROSERAIE DOMINIQUE THIERRY 11951 91972081992112739020404.7018MANGL +9941JULIETTE CHRISTIANE 21952 71976091992011578112721.6518MANGL +1879CLAIRVAUX JEAN SYLVAIN 11952 31976041993011369311287.4318MALLEM +9577PECHEURS DOMINIQUE 11953 31978031995011578112723.3318MSANS +4352BAR REGIS 11953 71979061994011249910473.4518CSANS +2194EVIAN DANIEL 11953 81977061992011608112915.1218MANGL +0566PARADISIER DIDIER 11953 11983111993011215710278.3018MANGL +8627CHARRIERES PHILIPPE 11954 61974111982102470018540.8018MSANS +5729BRECHET PHILIPPE EMMANUEL 11954 41974081991012137316331.2818MINFOR +3643RONSARD PATRICIA 21954121976011982052256617146.4518MSANS +1486AGEN CAROLE 21954 91977071984112256617147.1818MANGL +4779CALIFORNIE PATRICE 11955 31975051991101578112723.3318MSANS +0975BIEVRES ALAIN 11955 61978101993011471512024.4718MSANS +8614DUSENBACH ALAIN 11956 61979031992011471512024.3918MSANS +4428SAUZON ISABELLE 21956111977051992011471512024.2618MSANS +1720EOLE PATRICK 11956 41987111986112090215980.5518MALLEM +8905JANVIER MARLENE 21957 11979071993041471512024.3018MSANS +7774GAL PHILIPPE 11957 81977061982041834514275.7218MESP +3204SAGINAW EDITH 21957 319790719780711302 9774.2018MANGL +5409LEUN CLAUDE 119581019800719821011389 9852.4518MANGL +4971CHANTEGRELET FRANCOIS NICOLAS 11958101978061987112256617146.9518CSANS +5691ALTIPORT ANNE 21958121979101993111471512024.9618DTECHN +1005FLEURS PIERRE 11958 81981041985041684813421.4218MSANS +6295WINTER JACQUES 11959 81982081988052090215980.7318MINFOR +3634CELY JOELLE 21959 31979101995021433211713.6518MSANS +8425SOPITENIA BERNARD 11959 919790619831111389 9851.2118MANGL +2714AGNEAUX VINCENT 11959 21980091979091684813422.7218MSANS +3908SAN CATHERINE 21959111980031989112090215980.7318MSANS +9522ALLERAY EUSEBE 11959 81982041989052090215979.8918MANGL +4818CARNOT GENEVIEVE 21960 61981031995021433211714.8218MSANS +2809VAUCRISES FLORENCE 21960 1199205199105 8656 8146.4618.SANS +6703LAFONT CAROLE 21960 31993081992011249910472.3918MSANS +4781RUSSIE FRANCK 11960 1199006198906 8656 8146.2818.ESP +0025OYANA AYALA 21960 31981011980011202810241.2518MANGL +4606GARNET CHRISTOPHE HUBERT 11960 41983011993041326611017.3218MSANS +3285CASTAGNIERS BRIGITTE 21960 61980061986101684813422.5318SSANS +9855HEBERT GABRIEL 11960 11988091992041249910472.9618MALLEM +7538RUSTICANA JACQUELINE 21960111981011980011326611017.7018MANGL +7245HAVRE ALESSANDRA 11961121985031984031608112917.1018MSANS +2845ROSNE ANNE NOELLE 21961 6199507199407 7803 7681.3818MESP +4993NOIR GUY 11961 81982031995101638413149.8318MINFOR +0352NOTAIRES PHILIPPE SERGE 11961121986111993072397418036.8018MSANS +6114LAMPAUL ROSELYNE 21961 61994021992011202810240.8618CSANS +8947GUE JEAN PIERRE 11961 41981071995071433211713.7018MSANS +6115NICOLAS DOMINIQUE 21961121983011982011608112916.0218MSANS +0276ESQUIERE YVES 11961 81988081992061450311832.1518MSANS +5271BARGEMON SERGE MAURICE 11962 51992111991011249910471.6518MSANS +3485SOURCES MARTINE 21962 1199201199101 7803 7680.9818.SANS +1542BOCAGE MARYVONNE 21962 5199203199103 9597 8728.5818CSANS +8004CARDINAL MARIE JOSEE 21962 21983051982051527112373.2318MSANS +7577VIE KAVERIO 11962121982061987111608112917.1318MSANS +1474RABIAC CLAUDINE 21962 81984061983061249910472.0718MSANS +7742CAZILHAC DOMINIQUE 21962 51983011982011608112915.6518MALLEM +1316BRIAND FRANCOISE 21963 21983041982041608112915.7518MCOMPT +5967MASCREE YVES 11963 91983071988011608112915.3918MSANS +8262PENSEES FRANCOIS 11963 71985081991091288210745.3018CALLEM +9624JOFFRE FRANCOISE 21964 71988041987041202810240.7718DALLEM +1583MONTGOLFIER BERNARD 11964 11984071993041288210745.2718MSANS +8539GILBERTIN MOISE 11964 11985041986081288210745.4318MSANS +9414YVELINES JEAN PIERRE 11964111985071984071288210745.6618CANGL +2500PROVOST DANUTA HALINA 21964 51985051984051381911365.9518MESP +4860AUBEPINES THIERRY 11964 31993081993082401918075.8118MANGL +1591CALADE ALAIN 11964 21984071990091288210745.7518MSANS +8611DUGUESCLIN MARIE NOELLE 219651219880619870610876 9503.9018MANGL +1890DUC PATRICK 11965 21985091989111527112373.2218MANGL +8780ANTANANARIVO JEAN PIERRE 11965 219860619931210791 9502.9918MINFOR +9489CALMETTE JOEL 11965 31991121992122401918075.5718MANGL +0389VICTORET YOLANDE 21965 1198810198707 8656 8146.2818.SANS +8865VERDIE CHRISTINE 21965 51990111989111949415051.6818MSANS +3552LOGEM ISABELLE 21965 3199408199308 8359 7951.8018MSANS +2210MANCHOULAS PHILIPPE 11965 31994021993021420611638.9518MTECHN +6427LAUTIN JEAN DANIEL 11966 719890619880610791 9502.0518MINFOR +9413KERAVILOU HUBERT 11966 51989061993111249910472.6918MANGL +0446CHENEUSE JACQUES 11967 419931119950910363 9232.5318MVENTE +8752ALPILLES PATRICE 11967 6199105199005 8656 8146.2318.ALLEM +8347AICARD BERNARD 11968 219880619880110407 9271.1118MANGL +2090ALICE JEAN MICHEL 11968 61993041992041202810240.9118MSANS +8583EPINETTES DENIS 11968 31988041994101249910472.6618CINFOR +2122SEE PHILIPPE 11968 9199205199105 9597 8728.6418CANGL +2399ROQUEPAVA PAUL 11968 81988071993111249910472.9118MSANS +8130FRATERNITE JEAN FRANCOIS 11969 91992061994011288210745.7218MSANS +7498CARROUGES JEAN MARC 11969 31989041993121249910473.0618MANGL +3505CHEVREUL JEAN JACQUES 11969 61990091989091467711987.2218MSANS +2473MAJOR THIERRY 11969 3199406199306 7677 7604.8418CSANS +7707AYGOSI CORINNE 2197010199502199402 8359 7953.4218MSANS +6442BERGER NATHALIE 21970 5199607199507 7803 7679.4518MANGL +5162CHANDELIERS JOEL 11970 7199501199301 9085 8419.1118CSANS +1417BILLETS WADY 11971 119931019921011389 9851.2118MANGL +1522PARAME COLETTE 21971 3199606199506 8359 7952.5518MSANS +2322BARRE JACQUELINE 21971 91991011990011202810239.7818MANGL +8136TASSIGNY JEAN PAUL 11972 31992061991061249910472.4618MSANS +2240LOUP VERONIQUE 21973 21994031993031267210589.1018MSANS +2489VELLEDER MARC 11974 7199506199406 7803 7679.7818CTECHN +8166GUERRIAS CLAUDE 1197710199610199510 7803 7680.5718CSANS +6073ALLENDE DOMINIQUE 11977 1199606199506 7803 7680.9018CSANS +6606FROIDEVAUX FRANCOIS JEAN 11934111958051993013844228045.6538MESP +5822DITTE NAGUIBA 11937 61966091991072273717260.5038MSANS +1148KERVENNEC JEAN JACQUES 11938 31971051991011663613342.7438MANGL +8491ROCHEBRUN MAURICE 11939 51967011992021932314935.2938MCOMPT +5749GILBERT JACQUES 11939 61968031992102334017610.6938MTECHN +3667PERGOLETTE JACQUES 11939 31963051988011663613344.6938CSANS +6409PLACE JOSYANE 21940 71984011991091288210745.1338MSANS +2498GASNIER CLAUDE 11940 119810719890511131 9657.9738MSANS +2100BRASSIOUX BRUNO 11942 41973061991011621213032.2438MSANS +1118HOUMEAU ANDRE 11943 51962111991072273717260.3538MSANS +4519CAGOU JEAN CLAUDE 11943 41972071991011663613343.2038MSANS +6013REMO JEAN MARC 11943 91966121990011663613343.0138MANGL +8050YAN BERNARD 11944111963121992042273717261.8138MSANS +3614EGUILLON SERGE 11944 31978041992011471512025.5638MSANS +5430CHARPENTIER JEAN PIERRE 11944 91966061994072137316332.5038MSANS +8523PARIS PHILIPPE LOUIS 11945101969071992062334017610.6538MANGL +2111TOUL ROLAND 11947 51972021992012017815518.0638MINFOR +0683GEORGES RICHARD EMILE 11948 91976091994012000715439.1738MANGL +7517GRAND PHILIPPE 11950111971041995072470018540.9738MSANS +4909AIX JACQUES 11950 11970041993121834514276.0138DCOMPT +3400NOUAN PIERRE 11951 41971041992122739020403.8938MSANS +7319BERGERONNERIE MICHEL 11951 21979031993011578112723.3338CSANS +2615PATURES DANIEL 11952 91972081993122547019085.9538MALLEM +1673MIRAMAR PHILIPPE 11952121973071983112470018541.3438MSANS +4747LOLIVE FREDERIC 11953 81978111993011608112915.9738MSANS +9613BORD JEAN MARC 11953 41978051995041249910473.2038MSANS +9161CHANTE PATRICK 1195311199603199505 8656 8147.0938MTECHN +1511COLBERT PIERRE MARIE HENRI 11953121973031993042017815517.9138MSANS +0700BRAGELOGNE ALAIN 11954 91974021989052256617146.1638CSANS +4590BERRY CHRISTINE 21954 5199302199201 9085 8419.4938DMANAG +7017LASPLANES DOMINIQUE 11955 41984061993041326611016.6238MCOMPT +4869ROUMANILLE CLAUDE 1195512199306199206 9126 8457.4938CTECHN +2931PYRAMIDE ANDRE 11956 61979031992011471512026.0638MSANS +0636COTEAUX MICHEL 11956 31976011992011608112915.2138MANGL +9829EUROPE JACK 11957 11980061985011684813422.6838DSANS +7001FORET MARC 11957 41977011994011249910471.5638MTECHN +7136OCEAN HENRI 11957121977061992011471512024.5338CSANS +3955VIGNES PATRICK 11959 51981011993031608112916.1438MANGL +9568ARNOCHE GERARD 11959 71981061993121471512025.8338CTECHN +4979AIMEE PASCAL 11959 519860219880110791 9503.5238MSANS +2891SCHLOSSER BRUNO 11960 51982111995071433211713.6738MSANS +8194CABIRAUX JEAN LUC 11960 219930119910110407 9272.1338SANGL +2865LEIGNE ANNE MARIE 21960 71980091993051527112374.8538MSANS +4343GERMIGNY YVES 11961121983041982041326611017.7438MSANS +2039ROUTE JEAN CHARLES 11961 21982031981031326611017.8838MANGL +8887CUTTE HUBERT 119611019820619810611131 9657.5738CANGL +5692LAC FREDERIC 11961121981051994011433211715.2438MTECHN +9404COMBES HUBERT 11961 9199308199208 9597 8729.7438MCOMPT +7675CHEVRIER JEAN HERVE 11962 41984021991071527112374.2538MINFOR +8147PROMENADE CHRISTIAN 11962 3199405199201 9597 8729.7238MANGL +8550RASCAS JEAN 11963 119850219900610791 9503.9738MSANS +8387JEROME PIERRE 11963111985041992011949415051.6838MALLEM +7757FAVIERE PATRICK ANDRE 11963 51984081991021527112373.3138MSANS +2903GLADIATEURS MICHEL 11963 31984121983121326611016.0338MSANS +5686BEDFORDALE THIERRY 11963 819831219821210791 9502.0438CINFOR +5983TANNERON JEAN FRANCOIS 11964 61987111995042256617147.2238MTECHN +5469CIGALIERE JEAN FRANCOIS LOUIS 11964 31988081988021450311832.6838MSANS +2425BOUVREUILS MICHEL 11964 11988011995121381911366.9938MMANAG +7826EAU ARNAUD 11964 81987021986021249910473.4938LSANS +4783TESSIER MICHEL 11964 61990011991011249910472.1238MALLEM +4053ARPENTS PHILIPPE 11965 219901019891010407 9271.1138CESP +5354COMBELONGE PHILIPPE 11965 41985041984041288210745.9338CESP +0915TUILLIERE JEAN LOUIS 11965 51989031991011249910471.5838MCOMPT +3732MALABRY FREDERIC 11965 219940119910110407 9271.7938CSANS +8032VIRO PASCAL 11966 319921119911110024 8998.3738MSANS +0237TORRICELLI ERIC 11966 61988101986051288210744.7638.SANS +9815LAPLACE PHILIPPE 11966 5198912198812 8656 8146.1438.SANS +0253TALLOIRES ERIC 11966 61989121993071381911366.0338CSANS +7893BOURBOTTES JOEL 11966 8199404199201 9597 8729.0338MANGL +2674SET OLIVIER 11966 619891119881110407 9270.5638MSANS +8321LONGS FREDERIC 11966 219950319940110668 9427.0238CSANS +6369DOURBIES PATRICE 11966 319920319910310024 8999.3438CSANS +1563TURBINE JACQUES 11966 91987031994091693613498.1438MTECHN +6038COLLINE RICHARD 11966 5198912198812 8656 8147.2238.ANGL +8370BONSON THIERRY 11967 5199011198911 8656 8145.3838.MANAG +1538FAUVETTES HUGUES 11967 6199609199509 7803 7681.3138MANGL +5092DJINNS MICHEL 11967 1199111199011 9597 8728.9938CSANS +3468GARDES FARID 11967 119880319870310407 9270.4238MSANS +7303DENY JEAN CLAUDE 11967 51993021992021202810240.7738CESP +1319PLOUGONVELIN JEAN FRANCOIS 11967 919880919870910407 9270.1638MTECHN +7182BEAUMARCHAIS ALAIN 11967 11990111993071381911365.9838MSANS +5432ROMAIN JEAN PIERRE 11968 519940519920110024 8998.1738CANGL +8756PEGUIERE PHILIPPE 11968 919940319930310668 9426.6338MTECHN +0590MONTROSIER DIDIER 11968 419940419920111389 9851.6438MSANS +3773FIORI MICHEL 11968 61990051990051381911364.9938MSANS +9060CHAMBORD AGOSTINI 11968 9199406199306 7803 7679.9138CSANS +7693DIZIER THIERRY 11968 319920519911111389 9851.7338CSANS +7838CECILE PATRICK 11968101988071991011249910473.6738CSANS +6964GOYRANS GABRIELLE 21969 91990031992011202810239.9638MSANS +0784COSQUER COLIN 11969 719940619930611389 9851.9638MINFOR +8622COURTAIS JOSE 11970 619960719950710668 9426.6238MSANS +2794BERGERET CHRISTOPHE 11970 61992051993041202810240.5938MINFOR +4688RABELAIS FREDERIC 119701219940619930411389 9850.7138MANGL +9681POUSSEAUX RICHARD 11970 61991041990041202810241.4538MINFOR +0530BRANCOLAR PIERRE 11970 619900619890610024 8998.3538CANGL +9957LENTILLY LAHOUARI 11971 7199607199507 7803 7680.6638CSANS +7210CHAMPERRET ANDRE JEAN 1197111199406199201 9597 8728.6838CTECHN +7549BRAMO JEAN 11971 2199612199401 9597 8727.9638CSANS +1719TELEMLY JEAN 1197110199612199512 9894 8922.8038CINFOR +7574MOUQUET PIERRE 11971 3199304199204 9597 8728.7738CANGL +1471ETOILE PHILIPPE 11971 3199501199304 9597 8729.9038MANGL +1536MAISTRE LOUIS 11971 51990121989121202810241.5238MINFOR +7328BLAMONT BRUNO 11971 31991021990021202810240.4038CSANS +4093TOLOSANE JEAN 11971 51991071990071202810240.7638CANGL +8648RAPHAEL GERARD 1197210199408199201 9597 8728.4938CMICRO +2769GOULET ERIC 11972 119950419940111389 9852.5938MSANS +9108CRETEIL MICHEL 11972 4199606199506 8656 8145.6638CSANS +5284POMPONNE ALEXIS 119721219920519911211389 9851.7938CTECHN +8876LAIGNEAU ALAIN 11972 3199202199102 8656 8146.4138.ANGL +6070REVOULUN CONOR 11972 2199608199508 7803 7681.4038CMARKT +8083CLEYRAC JACQUES 11972 5199403199201 9597 8727.9138CANGL +8314PARIS GERARD 119731119940819930810668 9426.0338MANGL +4108SEGURET GUY 11973 9199207199107 9597 8728.4638CSANS +4139PRESSENSE PATRICK 11973 9199608199508 8656 8145.6938CALLEM +2465CHATEAUDOUBLE DIDIER 119731019950219940210668 9426.4838CSANS +5213MARTINIERE GERARD 11973 8199608199508 7803 7679.2838CSANS +0769POUR PHILIPPE 11973 719940919930910668 9425.8538CSANS +2580BESON MARC 11973 7199307199207 9126 8457.0238CALLEM +4770LIEUTENANT JEAN OLIVIER 11973 8199607199507 8656 8145.6638CINFOR +1963SENGA CLAUDE 11973 6199412199201 9126 8457.2238MCOMPT +2932SOULT CAMILLE 11974 5199604199504 8656 8145.8338CESP +5177CLOS GILLES 11974 4199506199406 9126 8456.6138CALLEM +0619MEUR BRUNO 11974 2199607199507 9894 8921.6938CANGL +3202RUBEU DOMINIQUE 1197411199610199511 9894 8922.0838CINFOR +1263PONTILLOU DIDIER ERNEST 11974 1199309199209 9597 8728.1738CSANS +3833NEUVE JACQUES 11974 2199508199408 9894 8921.6438CANGL +6528NIMES ROBERT 11974 1199410199310 9597 8729.3638MSANS +9312CHAT ANDRE 11974 7199307199207 9597 8729.6338CANGL +0437SAUVAGEONNE RICHARD 11974 4199301199201 9597 8728.8238MSANS +5387PLEHEDEL JEAN RENAUD 11974 8199309199209 9597 8728.9938CVENTE +5835MAROLLES DENIS 11974 7199609199509 7803 7679.9438CSANS +5277BURON STEPHANE 11975 4199410199310 9126 8457.5938CALLEM +0147URSULES PATRICK 1197510199512199412 8656 8147.1738CSANS +6637DEVANT PATRICK 11975 7199610199510 8656 8146.2938CSANS +7462BARBICAJA STEPHANE 11975 9199609199509 7803 7679.3138CSANS +9096HELENA PHILIPPE 11975 81994111994011202810241.8538CINFOR +7777ENGOULEVANT JEAN CLAUDE 1197511199612199512 9894 8922.0838CSANS +7823BRENNUS JEAN PIERRE 11975 2199606199506 7803 7681.2038CINFOR +7353LOOVAS FREDERIC 11976 6199612199512 9894 8922.8938CANGL +5381BRIAND JACQUES 11976 1199507199506 7803 7681.4038CSANS +8880LECLERC FRANCOIS 11977 2199506199406 7803 7679.8738CMICRO +1576MONTMELIAN CLAUDE 11977 9199607199507 7803 7679.3138CANGL +6203GUECH RENE 11977 1199507199407 7803 7680.2638CCOMPT +2768MERIBEL RICHARD 11977 7199607199507 7803 7681.2938CSANS +7366FERNANDEZ OLIVIER 1197712199607199507 7803 7681.0238CANGL +7525LONJUEUIL SYLVIE 2193011198901199511 8656 8145.9141.INFOR +8410CAIXA JEAN PIERRE 11935 31956051979013327724476.3741MSANS +4687FURSTENBERG NADIA 21936 31972041994101881314585.6641MSANS +9030AMIRAL JEAN RENE 11936 61961081993011663613343.8441MSANS +0747SURREY TOMOE 2193611199201199101 7803 7680.6241.INFOR +6230LIGURES JEAN PAUL 11937 81962021994042666519900.8141MALLEM +5598FONTENELLES CLAUDIE 21937 31962031995102666519899.2941MANGL +7964AUMONT JOSE 11938 31968121991011433211715.7241CSANS +1865HUBERT CHRISTIAN 11938121962111982112470018542.1041MSANS +0974ROMAINE JEAN MARIE 11939 91962111989071663613342.9741MALLEM +8959BILLEHOU DENIS 11940 41962011993011663613343.2041MSANS +3134RESISTANCE CHRISTIAN 11941 61970051987012022115555.5741MANGL +2829MARCIGNY ANNETTE 21941 8198901198711 8656 8146.6141.SANS +9621AIR MONIQUE 21941111968071990071578112723.4141MTECHN +2532MIMOSE JEAN 11941 31979031994011369311287.2541CANGL +6822BERLIOZ MICHELE 21942 81965021992051932314934.6841MSANS +8381REGRATTIER FRANCOISE 21942 41963101991072273717261.0341MSANS +1877GASTON APOLLINA 11943 41972061995011663613343.5241MANGL +9764NORTH CATHERINE 21943101992051995121330611017.8841MVENTE +0051FABRON GILLES 11943111972121992041403411522.2441MSANS +2826DESTEY RICHARD 11943101965121990011433211713.6541MSANS +4901GANDHI FRANCOISE 21943 31969031991011932314935.1641MSANS +2788ENSOLEILLADE CHRISTIAN 11943 81966011991043844228044.1541MINFOR +2725SAROIS CORINNE 21943 71972081994051804514081.9541MANGL +4033GRIVES PHILIPPE 11944 31966101990011433211714.0341MSANS +0306LUTECE CATHERINE 21944 91977061992011471512026.2241VSANS +6413TURALURE LOUIS 11945 11967121990041433211715.1541MALLEM +6065BUARD JEAN JACQUES 11945111969061991011433211714.6441MTECHN +0713CLAUVEL MARIE CHRISTINE 21945121993101992011202810241.7441MSANS +2016BENGALIS HENRIETTE 2194510199103199003 7677 7603.0141.SANS +5741SAUVAGERE ALAIN 11945 91972021989011621213034.1541MSANS +5896GAILLARD ERIC 11946 31973021995011663613344.4541MANGL +4390PAROUQUINE MARTINE 21946 81973041995101911114778.4441MESP +4358MAYE CHRISTOPHE 11946 81970111994051834514276.1841MSANS +3228PERRET JEAN PIERRE 11946 419800719790711389 9852.6741MESP +2070COMMERCE MARTINE 21946 11965101995042739020405.2241MMARKT +2112COT CHANTAL 21947 5199104199004 8656 8147.0141.ANGL +5488MONTAIGNE ERNEST 11947 81972061989041621213032.6541MTECHN +4615JAURES PASCAL 11947 319850219840211389 9852.1441MSANS +3975BENAT MARTINE 21947 9197204197104 8103 7796.4541MTECHN +5422LAUGIER FREDERIQUE 21948 719850419880110791 9502.2841CANGL +7269TORTE DENIS 11948 71969081994083916628548.6641MSANS +9916MARNES JEAN CLAUDE 11948 719931019910710407 9270.0341MCOMPT +7840GRIGNON CHRISTIAN 11949 51969121989122470018541.4341CVENTE +5255VERNY ARLETTE 21949 81971061990071621213033.7041MALLEM +4729SALONINA PATRICK 11949 91974041992011608112916.6141MCOMPT +5121KISS THIERRY 11949101976041994011369311288.2241MTECHN +3042FERIC MARIE CLAIRE 21949 51984071994031288210744.1741VTECHN +3660PLAINES FLORENCE 2194912199303199306 9597 8728.0841MANGL +6514EPINIERE JANY 21950101972011990102175716601.3041MSANS +4692HUNTZIGER BERNADETTE 21951 71992101991101202810241.0741MSANS +6747CHAMPERRET LAURENT 11951 819870719870810407 9270.9741MSANS +5984JAMET DANIELLE 21952 9199203199103 7677 7603.0441.SANS +8680SERRALONGUE ANDRE 11952 31977071981102470018541.9541MSANS +1345LENTILLAC ALAIN 11952 919940119920110407 9272.0141CALLEM +9942AUSSEL MURIELLE 21953 4199406199306 9597 8729.5841MINFOR +6512SCIPION CLAIRE 21953121974081992032175716602.2441MSANS +2634FOCH JOCELYNE 21953 31996011995011249910473.0941MINFOR +5957CYPRIERE CHARLES 11953 81977091993071369311288.1041MANGL +7817EMILE SYLVIE 21953121973041994011527112373.0441MSANS +8678HUNG HUGUES 11954 819810519850611389 9852.6041MSANS +7968LUBONIS MICHEL 11955 71980041992021471512025.5241MSANS +3688EBAT ANNE MARIE 21955 31977071995071433211714.0341LSANS +0140GIRARD CLAUDE 11955 71978111991041578112722.8741MTECHN +6583EUGENE CHRISTINE 21955 71978051992111608112916.2541MINFOR +3771CUQUES ELISABETH 21955 11993101992011202810241.6641MSANS +9329CARRIERO JOSE 11955 719830419820411131 9658.8341MSANS +6210MACHIEL ROGER 11956 71977031993041471512024.0841MSANS +7407QUENU PATRICK 11956 71980051995041249910473.3241MALLEM +7722CARNOT GENEVIEVE 21956 51977051993031608112915.4241MALLEM +7051PALMIERS EVELYNE 21957 41980041994011471512025.1141MSANS +6978JACARANDAS ALAIN 11957 11985081993041288210744.7741MANGL +5352VANTAGE GERALD 11957 91978071992091471512024.5341MTECHN +9337CHALONS MICHELE 21958 3199609199509 4342 5820.2441MSANS +6534HERRET VIVIEN 11958 919861119860710791 9502.8041MSANS +3402RUVEI LINDA 21958 71981051995041433211713.6241MSANS +5959SERLIANE HERVE 119581119851219841210791 9503.3141CANGL +2613ROSIERS RICHARD 11958 3199601199507 9894 8921.8141MSANS +3289ALLEGRES GERARD 11959121981071994011471512025.9141MSANS +6523ROCCA GUY 119591219850119860411131 9659.1541MMARKT +8881CHATEAUBRIAND GILLES 11959 51981011993071471512025.3241MSANS +5781HELSINKI DANIELLE 21959 81981011995011433211715.7441MANGL +4147SIAGNE CORINNE 21960 61981041980041450311832.2441MSANS +1606POIL MARIE THERESE 21960 919941119920110024 8999.5241CANGL +1752ROUGUIERE GUY 11960 319940819951011389 9851.1041CSANS +5961CHALAIS MICHEL 11960 919930819910110407 9271.4641MSANS +1601DURUY ANNE MARIE 21960 21989071988071249910473.2741MALLEM +3631ESPARIAT MIREILLE 21960 4199511199411 9126 8457.4941MESP +2747TENSE MARCEL 11960 11982021995042256617145.7841MSANS +6989JACQU YANNICK JEAN LOUIS 119601219831119850111131 9657.0641CSANS +4612BOURNET LAURENT LOUIS 11960 119900519891110407 9271.2441MSANS +3236PIOL DOMINIQUE 11960 51984051991011326611017.7741MSANS +6475VILLETTE PHILIPPE 11961 21984081983081608112915.6641CANGL +8207MESNIL REGIS 11961 21982101990112090215979.7941MSANS +0526AGUESSEAU DARA STEFANE 21961 91986041985041288210745.7541MSANS +3092MONTFLEURY JACQUES 11961 11983041994011433211713.9441MSANS +7762BUCHERIE ANNIE 21961 91986101985101288210744.6741MSANS +9535MADONA CHRISTIAN 11961 719931019910110407 9270.8041CSANS +4953GARE HIROMI 21961121984031994011527112374.4941DSANS +6431CORNEBARRIEU JEAN PIERRE 11962121985101991021527112373.6241MANGL +3878ANLHIAC MICHEL 11962 7199602199502 8656 8145.9641MSANS +6464ESTEREL GASTON 11962 619860319880310791 9503.7641MANGL +2255MAUVALLAT ANNE 21962 71982081981081326611016.1541VANGL +8438CHANTACO MARIE NOELLE 2196211199307199207 8656 8147.1541.SANS +4202FENOUA MARC 11962 3199212199112 9597 8728.5041MTECHN +3836PAUL PHILIPPE 11962 31982011993041326611016.2141MSANS +0418CHANET NICOLE 21962121982041981041608112917.1541MSANS +2005ROCHES MARIE HELENE 21963 31984071983071608112915.2141MINFOR +7305RASPAIL YANN 11963 719850919840910791 9501.7841MSANS +4264SCHOENFELD PHILIPPE 11963 619830419841111131 9658.4241MANGL +4951LAUVE JEAN PIERRE 119631119840319860610791 9502.5941MSANS +7632VALLOIS FREDERIC 11963101986011990111288210744.6741MSANS +6021ANTOINE JACQUES 11963 4199406199306 9597 8729.3441LANGL +1193SAUT YANNICK 11963 51987061992121450311830.7941MSANS +5840VIRARD JEAN PAUL XAVIER 11963121995011994011206910241.4941MTECHN +0346CASATORRA BERNARD 11963 419910619900610024 8998.1741MSANS +0082BAURECH HENRI 11963 41991101990101381911365.5041CSANS +3466TULIPES ANNEE 21963121984111983111450311830.8541MTECHN +3635FUSTEL BRIGITTE 21963101983041991091527112373.6441MALLEM +3776THUITSIGNOL ANDRE 11963 91983071986081326611016.7441MSANS +7941PINS MICHEL HENRI 11963 81983081993041288210745.4341CSANS +8903CHARTRES MARIE ODILE 2196412199412199312 8656 8147.2441MANGL +6455GIANOTTI FRANCOIS 11964 219870119860110791 9501.8341MSANS +3178PABU PATRICE 1196412199606199506 8656 8145.9641MANGL +1683TOKI GILBERT 11964101994051993051267210589.2541CTECHN +1069COUTURES ERWIN 11964 6199504199404 8359 7952.6641CSANS +7668PALISSY ALAIN 11964 2199310199210 9597 8729.2741MSANS +4934AIGUES JEAN MARIE 119651019860719860310791 9503.9741MTECHN +5099LARRALDIA REMY 11965 11987021993091949415052.3541CANGL +8301BOUCHAREL FABIENNE 21965 81993091992091839014312.4041CSANS +7214VOUTE CHRISTIAN 11965 419870719870610407 9270.9741CTECHN +7913MOULINS YVES 119651219890519880510407 9271.8641DCOMPT +1180REPENTANCE MICHEL 11965101993111992011249910472.8741MALLEM +1457SAUVETTE GERARD 1196512199301199201 9597 8729.3041MSANS +4206LONGERE ISABELLE MARIE ALICE21965 8199610199510 8656 8146.1141CANGL +2030TONELIER MARC 11965 719860419880510791 9502.5541CSANS +2828DERRIEN JEAN JACQUES 11966 71991011990041202810241.6141MSANS +5283COULLET OLIVIER 11966 519880619870610407 9272.1341MANGL +8198COUPANCES CHRISTINE 2196610199403199303 9126 8456.3041CSANS +4478NOSTRADAMUS GREGOIRE 11966 719860419900210791 9503.9741MSANS +7215HILAIRE FRANCOIS 119661019860319850310791 9503.9741CSANS +8745MONTREUIL GUY ROBERT 119661019910419900410024 8999.0741CTECHN +3647DELESTRAINT JEAN CLAUDE 11966 11989061994011381911366.2741MSANS +7458LISERB JEAN LUC 11966121991061992031381911366.0941MALLEM +6758BIGOCHETS FREDERIC 11966 119911119901210407 9270.8341MSANS +0098JARDINIERS MYRIAM 21966 51986061993071450311830.9441MVENTE +0882BRUXELLES CAROLINE 219661019940319920111389 9851.8241MALLEM +5390VEYRE NATHALIE 21966 419941119930411389 9851.9741MALLEM +4046CHAMBERTE BERNARD 11966 31987091988071949415052.4441CSANS +4837BONNAMOUR MICHELE 21966 21994031993011723313654.5941MSANS +0532MORE LOUIS 11967 919870819930410407 9270.2441MTECHN +4906LELIWA DANIEL 11967 219870619860610407 9271.2041MSANS +5362MAGNOLIAS JACQUES 11967 6199609199511 7464 7525.6141CSANS +8779SORQUES GUY 11967 61988041990011249910472.9741MANGL +1022ETANG GERARD 11967 3199506199304 9597 8729.5841LANGL +8535DELACROIX JEAN PAUL 11967 619940519930511389 9851.5141MSANS +4910ARANDELYS HERVE 11967 71990101989101202810241.0941MANGL +4304EURE ALAIN GEORGES 11967 51991101990101330611017.7941CESP +0132DJILLALI ALAIN 119671119931119920110407 9271.1941MSANS +9907BON THIERRY 11967 91987091992111450311830.6141MSANS +5376REGNAULT DANIEL 11968 51990111991021381911366.7941MALLEM +0903SUR BRUNO 11968121992051994121330611017.0541CSANS +7066RENAN FRANCOIS 119681219890619910510024 8999.7441CVENTE +9334ALL ADELE 21968 9199310199210 9597 8728.9841MSANS +1100MONTFORT ANNE MARIE 21968 519950219930411389 9851.7441MSANS +7153PINSON GENEVIEVE 21968 31989111993071381911366.3041MSANS +4338MABO MICHELE 21968 7199602199502 8656 8147.1541MSANS +2568GODEAUX GEORGES 11968 61994051993051267210590.4141MSANS +9355MEUNIER MARIE HELENE 219681219940919930411389 9851.1041MINFOR +4462CACTUS MICHEL 11968 51993091992091839014312.7641CTECHN +2155REINOTS DENIS 11968 1199406199201 9597 8729.6641CMARKT +1708QUEUILLES ALAIN 11968 91991111991111723313654.7041MANGL +9411MANDRAGORE ALAIN JEAN 11968 81995041994041206910241.6641CSANS +4930ELVIRE PATRICE 11968 41995121993041202810241.7441CALLEM +8112PAVOIS LUC 11969121992021991021381911366.7941CSANS +8181UNIVERSITE OLIVIER 1196912199408199308 9126 8456.6941LVENTE +6245CAIRE ANNICK 2196911199405199301 9085 8419.1641CSANS +2166PRETY CORINNE 21969 7199612199512 9894 8922.5341.SANS +4325COTTAGES YVAN 1196911199407199307 9126 8456.9741MCOMPT +0898SYLCO ALAIN JACQUES 11969 91989091988091249910472.9641MSANS +4572DARTHE DIDIER GEORGES 11969 4199503199304 9126 8456.5541CSANS +9418AUREVILLE PHILIPPE 11969 519900719890710024 8998.2841CSANS +7504MAROT ALAIN 11969 119910319951110024 8997.8341CANGL +4672TRUCQUES JACQUES 11969 2199606199506 8656 8145.6041MANGL +5588POUTILS ALAIN 1197012199405199305 9597 8728.2241MALLEM +8965SAUCES JEAN PAUL 11970 71992021991021381911366.2541CSANS +1934PRESSES LUCIEN 11970 11991091990091467711987.9041CSANS +5600LAROIN LAURENT 11970 91991061990061202810240.6841CTECHN +8935REINE JEAN PAUL 11970 119920819910810024 8998.7141CSANS +9304MARCQ MARCEL 11970 719940119930111389 9851.4341CANGL +5444CHEM LOUISIANE ALAIN 11970 11991021990021202810240.2241MSANS +7850HUBERT BERTRAND 119701219920619920410024 8998.1441CSANS +0638FLEUZY PHILIPPE 119701119900419890410024 8998.7141MVENTE +0729MUETTE CLAUDINE 21970 5199204199104 9597 8729.8541MALLEM +5723MARCHE LAURENCE YVONNE 21970 919940619930411389 9852.3641CANGL +1904CHENE JEAN GABRIEL 1197010199501199304 9597 8729.2141MSANS +1861CREOUNE MARIE THERESE 21970111991101990101330611018.1541MSANS +5885LONGUET MICHELINE 21970 619950319940110668 9426.5941MSANS +9271SEINE LIONEL 11971 81993121992121267210589.8241MSANS +6056CHE FREDERIC 11971 219901019891010024 8999.8541MSANS +8822BOUSSOLE ERIC 11971 819910419900410024 8998.7641CSANS +1433COMBE ALAIN 11971 5199308199208 9597 8729.3941CSANS +5251GRELLOU DOMINIQUE 11971 91992091991091330611018.2441MESP +6795EMMANUEL MARYSE 219711119920719920811389 9851.3041MANGL +6104AUDE CATHERINE JOELLE 21971 7199309199209 9126 8456.4741MSANS +3946PLEUMER CATHERINE 21971 6199301199201 9597 8728.1941MANGL +9614BOUE FRANCOISE 21971 519921219951011389 9850.7641CSANS +5568TASSY DANIELLE 2197111199605199505 8656 8146.4141SSANS +5159CHATEAU GUY 11971 619910419900410024 8998.9541CSANS +3722VERE ALAIN 119711219930919920911389 9852.6941CVENTE +8496ORANGINI PATRICK 11971 31994051993051267210590.4241CSANS +4662CANTE WINNI 21971 9199206199106 9597 8728.7141MSANS +5032CHATAIGNIER MARIE LOUISE 21971 81991121991091330611017.6441MSANS +1771PICHOLINES JOELLE 21971101991121990121202810240.9441MALLEM +8900BOULAINVILLIERS MARTINE 21971 719940619920111389 9852.0041MSANS +8306GUERRE FRANCOIS 1197112199103199003 8656 8146.2941.ALLEM +9088LAROQUE MARIE FRANCE 21971121993091992091723313654.6141CALLEM +6520LIEU JEAN PIERRE 1197112199201199101 9597 8728.2341CESP +2579HERANDIERE PIERRE 11971 6199606199506 8656 8146.4641CTECHN +8999JARDINS PIERRE 11971 819910119900110024 8999.3041MSANS +8513PERRIERES PHILIPPE 1197211199205199412 9597 8728.0941CTECHN +5836GIRARDON SYLVIANE 21972 119911019901010024 8998.5041MTECHN +9465DAN FRANCOIS 11972 31994031993031267210590.0541CALLEM +3970BREGUI GERARD 11972 5199311199210 9597 8729.5241CALLEM +8911RIVIERE MARTINE 21972 5199310199210 9597 8728.8441CANGL +8506RIBOT JEAN PIERRE 11972 3199403199303 9597 8728.1341CANGL +4988CHATILLON DIMITRY 1197210199303199203 9597 8729.2541MANGL +3678GRES CLAUDE 21972 8199608199508 7803 7680.6241CSANS +9757CADENELLE PAUL 11972 219951219940110668 9425.8141MINFOR +8910RENAISSANCE RENAUD 119721019931119921111389 9851.5541CSANS +4973SAL EMMANUELLE 21972 719920119910111389 9851.3941MANGL +8099TURENNE MARTINE 21972 8199407199407 9126 8457.5641DANGL +6683HIRONDELLES MARGUETITE 219721219930919920910668 9425.4541MANGL +3610BERTRAND DIDIER 11972 8199403199201 9597 8727.9941CSANS +7709MORINERIE YVES 11972 7199206199409 9597 8729.5241CSANS +6549BOISSERAIE HERVE 11972 41995041994041206910240.7641CTECHN +8170MALHEUREUX PATRICK 11972 21991111990111202810241.4041CSANS +0105CRONSTADT CHRISTOPHE 11972 6199209199109 9597 8729.1741CALLEM +3953CHARBERYS NICOLE 219721019930819920811389 9850.9841CALLEM +7071BARBINIERE PHILIPPE 11972 71993031992031267210590.4741CSANS +4851LETRIMAN CLAUDE 11973 5199602199502 9894 8921.9641CANGL +0165VAUGRENIER JACQUES 11973 119930919920911389 9852.3841CINFOR +7080BANCHE ANTOINE 11973 3199306199206 9597 8729.6741CSANS +1252VINCENNES ANDRE 11973 6199410199310 9126 8457.3641CSANS +1299SERIGNE LOUIS 11973 4199310199210 9597 8728.2641MSANS +7759WILDERTON LUC 1197311199410199310 9126 8457.3241CSANS +8844LORGUE SYLVIE 21973 119930319920311389 9852.3841MSANS +8332BRANLY BRIGITTE 21973 7199509199409 7803 7680.7241CSANS +8767DEMOISELLES LUC JACQUES 1197310199301199201 9597 8729.7441CANGL +6481MANCEY RENE PAU 1197311199411199506 9597 8727.8341CSANS +9685HERRIOT MARIE CHRISTINE 21973 6199408199308 9126 8456.8241CESP +5412JANVIER KATY 21973 6199210199110 8359 7953.4241.VENTE +3049VICOMTAL ANNE FRANCE 21973 2199305199205 9597 8728.1741MANGL +8606DIDIER MARC 11973 3199308199508 9597 8728.5041MSANS +5438MOREL JEAN JACQUES 11973 91994031993031267210589.0641MSANS +1333CERET ISABELLE 21973 3199608199508 9894 8922.4141CALLEM +8656COUBARD FREDERIC 11973 9199305199205 9597 8729.6641CTECHN +7939MONOD SYLVAIN 11973 5199301199201 9597 8729.2541CSANS +2807BOTTERO PATRICK 11973 4199403199303 9597 8728.5341CSANS +1950VAROISES ELISABETH 21973 619930919920911389 9850.8341MSANS +0981MARCILLY JEAN RENE 11973111992101994011249910472.1941CTECHN +7067ROSES PASCALE ISABELLE 21974 3199406199306 8359 7952.7941CSANS +5670DEVLOO RICHARD 11974 5199512199304 9126 8456.9141MALLEM +0896CHEVAL CHANTAL 2197411199603199503 7803 7681.1141CVENTE +7374BAUX MARTINE 21974 6199607199507 7803 7679.6441CALLEM +2343PANSEROT BRIGITTE 21974 7199406199306 9126 8456.5741CSANS +8458ARMANDY CLARA 21974 419940719930810668 9427.4041CTECHN +5573TAKAOA MARTINE 2197412199306199206 8359 7953.1141.ANGL +1351ROYAN MICHEL 11974 8199606199506 8656 8145.8741CSANS +2308COAT MARIELLE 21974 21994091993091206910240.3741CANGL +1077BARBY HERVE 11974 3199609199509 8656 8146.8341MSANS +8863JUNOT JEAN GILLES 11974 7199610199510 8656 8145.4441CSANS +3894CIEL JACQUES 11974 119940919930910668 9425.6741CINFOR +5086FABRE GEORGES 11974 7199407199307 7803 7680.7141CSANS +3050CROISON RICHARD 11974 9199409199309 9126 8457.3341CSANS +9319CHAT DIDIER 119751119941219931210668 9426.9341CINFOR +2636MONTJUSTIN BERNADETTE 21975 8199609199509 7803 7680.8141CSANS +1156MER JEAN MARIE 1197512199603199503 8656 8145.2141CSANS +2790RAGEUL SERGE REYNALD 11975 5199603199503 8656 8146.7941CSANS +4387BRETEUIL ERIC 11975 1199606199506 8656 8146.2941CALLEM +7191COCHET HUGUES 1197511199609199509 7803 7680.7541CSANS +7798LARGE DOMINIQUE 21975 8199609199509 7803 7680.8641CSANS +1442CANDEOU ARMAND 11975 3199603199503 8656 8147.1041CSANS +6969CHAIGNEAU CHRISTOPHE 1197512199610199510 8656 8146.0241MALLEM +5660HOULET MARIE ELISE 21975 5199603199503 8656 8147.0441MANGL +9225TOURNON MARIE ELISABETH 2197612199607199507 7803 7680.8641CSANS +3312GURGY FRANCK KLEBER 11976 6199606199506 7803 7679.6741CESP +2078CEDRES JACQUES 1197612199509199409 7803 7681.4941CSANS +1381ALPHONSE MARIA ISABELLE 21976 3199607199507 7803 7679.6341CSANS +2376POMPADOUR HELENE 21976 7199606199506 7803 7681.2941CINFOR +2713RUILLE PATRICK 1197612199507199509 7803 7680.1241CALLEM +2134FRANCOEUR ELISABETH 21977 6199610199510 7803 7680.3241CINFOR +7879EGLISE LAURA 21977 8199608199508 7803 7680.6241CCOMPT +6841GEAUNE GILLES 11978 2199507199407 7803 7680.3041CANGL +8261LOC PHILIPPE 11935 11955021990084330331421.1942MSANS +0031DEFEND JEAN YVES 11935 51961081987042273717261.5642MINFOR +7162PIOT YUMIKO 21935 41969041991051932314933.5575CSANS +6005DESIDERATO ASSUNTA 21935111962101994012137316332.6342MSANS +1346NIZON JEAN LOUIS 11936 51971021994011663613343.9542MSANS +6423CHARTIF ANNIE 21937111962081987082572519241.9042MANGL +3151EUBAS DIDIER 11938 81963021981053327724476.0342MSANS +0345KOCK CLAUDINE 21939 91968051995041834514275.4142MSANS +4204POSTILLON NICOLE 21939 31963121992102137316332.0042MSANS +1286BERTIN BERNADETTE 21939101967011990011932314935.1342CTECHN +0588ONZE BERNADETTE 21939 41962101990072273717260.7142MTECHN +0552ARENE PASCAL JACQUES 11939 21963071988101663613342.9742MSANS +8335DRAGON BERNARD 11939111963031987012022115555.3642MSANS +5819CORNEYRETTE MICHEL 11939 41963041983123200223583.0542MSANS +6812MONADE ANNIE 21940 11961121994072137316330.5642MSANS +5797PLATEAU ROGER 11941 71964041993113844228045.2942MSANS +0254FONTAINE DOMINIQUE 11941 41963071992041557012567.5042MANGL +8521PRELLAVICA JEAN 11941101966061989071663613344.4542MSANS +1509MOINE JEAN PIERRE 11941 21960031984102273717260.4542MTECHN +9780LETELLIER JEAN CLAUDE 11941111975071991011369311286.0842SALLEM +0995HECTOR MICHELINE 21941 91971011991071578112722.3742MALLEM +0917PUISAGE JANNIE 21941 81962041992042273717260.7242MSANS +0311LIEVRES ELISABETH 21941111968031990011932314934.1442CTECHN +2094NOTRE JEROME MARIE AUGUSTE11942101970061993071557012567.0042MSANS +3489EGALITE SYLVIE 21942 81962041981112470018541.3642DSANS +2303BUSSY PASCALE 21942101968121991011932314933.8242MMICRO +2502MEAUX JOSEPHINE 21943 41966061994102137316332.2942MSANS +9316DANTON ANNE HELENE 21943 91969091991051932314933.6942MSANS +0398ABREUVOIR JEAN LUC 11943 41962111986012470018540.7542MSANS +6448FORCET VALERIE SYLVIANE 21944 81964091994072137316331.2842MANGL +9339TOULON DENIS 11944 91970121994011663613343.1042MSANS +1107OUZOUER ANNE 21945 11966061992021932314935.2242DTECHN +1368ALIVOU MICHELE 21945101971101989102273717260.0542CSANS +9954LANFRIERE JOSIANE 21945 41996011994011202810240.4142DANGL +1709LUXEMBOURG FABIENNE 21945111972071991101578112721.5342MSANS +5979DESNOUETTES PASCAL ROBERT 11945 31975061990011684813422.8442MSANS +3473AULX OLIVIER 11945 61971081991012334017610.4742MSANS +3451MANEBIT MARIE MADELEINE 21947101972041993121471512025.3442MSANS +7163GIGNAC MYRIAM 21947 11969081989042334017610.2042MSANS +8839CORINA DOUGLAS 11947101967041995042137316332.5642MSANS +7647COCTEAU YVAN 11947 21973051995072547019086.4742CSANS +9097APARTADO BRIGITTE 21948111974101994011621213033.6142CANGL +9822VERONIQUES PATRICIA 21949 419791119920111389 9851.0342MSANS +5016SYLVAFLOR BRIGITTE 21949 51970021994032334017609.4642MSANS +5933BROUILLARD SYLVIE 21949 31969011991072137316331.1542MSANS +1734PLAGE LUDWIKA 21950 61971081991012137316331.0742DSANS +8533LIBERTE PATRICIA 21950121970011995041834514276.1042DANGL +7399FONTVERT ISABELLE 21950 41970121994051834514275.5542MTECHN +7055MONTGIVRAY PIERRE 11951 41972081994062547019085.7942MVENTE +4158CHARTON DANIEL 11951 91980041993041608112915.2642MANGL +7325NIEL RICHARD 11951 71973081989053417325098.0042MANGL +7367BRIAND MICHELE 21951 41973061991011578112722.0142MSANS +0279HEURES PHILIPPE 11951111980041993011527112373.3542MSANS +5487TOURAINE CLAUDE 21951 41972081991012137316332.7242MALLEM +1239JALMOUTIERS CLAUDE 11952 31983031991031693613499.3442CINFOR +4152CHEMST ELISABETH 21952 91972031971031258210512.6242MANGL +7961ABBE KATIA 21952 51986071991041249910472.5942MANGL +9227LEPELLETIER MARIE FRANCE 21952 81973051992102017815518.1942CSANS +2603ESCALE DANIELE 21952101972071990011621213034.0142MANGL +9280SISLEY BRIGITTE 21953 319740719730711515 9931.0742MESP +6356ROZIER MONIQUE 21953 51972081990041621213032.3542MSANS +6175CHENNEVIERES MARIE THERESE 21953111980101991011249910473.1542DSANS +0679FONT EMMANUEL 11953 81984081993081326611018.0942MESP +2032VIALA DANIEL 11954 71973061991011578112723.0642MSANS +7857MASSEL GILLES MARCEL 11954 81976011995072256617145.4842MTECHN +4251CLINCHAMPS ANITA 21954111977101976101279810668.5342MALLEM +4945COURS ERIC 11955 71988101992044121428006.7742.SANS +1834FUBLAINES BRUNO 11956 91976041995042000715438.5042MSANS +3825KRIMAHER JEAN CLAUDE 11956 91984081992061326611017.8242MSANS +9642MORILLOT CATHERINE 21956 319950419940411389 9851.7942MINFOR +7414DUVEEM FRANCOIS 11956 51988041992011168610047.2742MSANS +8488BOUGAINVILLIERS PATRICIA 21957 31978071977071224010317.3642MSANS +3611COURSEGOUL DOMINIQUE 11957 21984081993011215710278.5342MSANS +5494LABROUSTE AINA 21958 81980011993111471512025.4142MTECHN +9526FLEURY MARIE CLAUDE 21958 319880719890710407 9270.6042MSANS +2858LABBE FRANCK 11958121980111994051450311831.3442MMANAG +3479NOISETIERS MONIQUE 21959 31989011991101249910473.6742MCOMPT +0868ODET CORINNE 21959111989031988031249910471.6542MSANS +3022TORSE PATRICK 11959 31978121993012022115555.8642MSANS +3375ORLAMONDE MICHELE 21959121986091993051450311832.4142MTECHN +5711PASTEUR CHARLOTTE 21959 71980051994011471512024.9242MSANS +1466PERRIERE MAUD 21959101979081993071471512025.7442CSANS +9464ROS ANDRE 119601019900419940110024 8998.4042MSANS +9586TRAVERSIERE ALAIN 11960 11984121993041527112373.3742MINFOR +4466GATTIERE BRUNO 11960 41982081992081215710280.1042MSANS +4368GALIGNES GENEVIEVE 21960 61982091988031326611016.2442MSANS +2690CHERBOURG HENRI 11960 91983111992091326611017.5542MSANS +2470LEPLESSIS JEAN FRANCOIS 11961 31984041994011578112722.3742MSANS +7595GLOIRE MARIE LAURE 21961 519940219920111389 9850.6542MTECHN +1338SCAMARONI PATRICIA 21961111981111980111608112916.9742MANGL +2208PLAINES MICHELLE 21961 21982021981021326611017.4742MSANS +2517REMENIER MARTINE 21961 7199409199309 9126 8457.3642CTECHN +9410BARRELET GENEVIEVE 21961 41983021982021326611016.3542CSANS +2551POLIENAS MARCEL 11962 419870319860310791 9502.4942CCOMPT +7760DANG YVES 11962121982011993091949415051.2742MSANS +2116CEZEROU PHILIPPE 11962 71983051992022529918968.4642CMICRO +8052PECH CHRISTIAN 11962 31986021993091839014314.4942MSANS +0931SALSIBURY ANNE MARIE 21962 31982071981071326611018.0142MSANS +8826SAUCERRE ELODIE 21962 81986041985041288210743.9942CSANS +0716BEAU IRMGARD 21962 5198607198507 9085 8417.9142MANGL +1742VERSEAU MICHELINE 21962 71982111981111527112373.3542MALLEM +8835EXPERT FRANCOISE 21962 11983041982041608112917.0042MALLEM +4580TIGNES GHISLAINE 21962 619921019920711389 9851.6442MINFOR +7561SCIEZ MICHEL 11963 71991111990111467711986.1942MANGL +4437OEILLETS JEAN FRANCOIS 11963 619930219920210024 8999.8142CTECHN +9877LIEUDIT RICHARD 11963 51984101993071527112374.6742MSANS +9511KERNEVEL VINCENT 11963 91985051995101450311831.2142MALLEM +7509TARN ERIC 11963 619890219930110407 9271.8242MANGL +1089BERE CHRISTOPHE ALEXANDRE11963 51985071992011288210745.8442CSANS +7426MONTIGNY CHANTAL 21964 11985021984021527112373.3742MSANS +6738BLOC FRANCOIS 11964 61989071993071381911365.6242MANGL +4323RIAS CHRISTIAN PAUL 11964 91985091990111949415051.8942MALLEM +1244CAMBEIRON JEAN RICHARD 11964 41985051993011693613498.3742MSANS +5905CHISSEAUX HUGUES 11964 119910719920710024 8998.6442MSANS +5258LAMBROSCHINI OLIVIER MAURICE 11964121989051995082256617145.0642MSANS +1452IMAM CHRISTIAN 11964 51993111993011723313653.5142CSANS +6093DEVAUX FARID 11964 91988061994011249910473.0242CSANS +3662MIDI JEAN MICHEL 11964 71985021992091616712994.0842MANGL +6965PENNE ERIC 11964 619850419840410791 9503.7242MSANS +0024FLEURS VALERIE 21965 81986101992121450311832.2042CSANS +3927PARC CORINNE 21965 81993111992011202810240.9542MALLEM +9121NAUSSANNES JEAN FRANCIS 11965 81988051992071616712994.4542MANGL +6670GENIE PIERRE 11965101994051993051420611638.9242MESP +9153DESMOULINS PATRICE 11965 11989111994092401918074.6042MSANS +2680CHOUETTES JEAN LOUIS 11965 519891219921211302 9776.1742CANGL +5006ESPERANCE CORINNE 21966 619940919930411389 9852.3842MCOMPT +9852ADOUE DIDIER 1196611199401199301 7590 7564.3542CSANS +4760MURAT CHRISTOPHE BERNARD 11966 81991041992061381911365.1342MALLEM +4744LESCAR ERIC CLAUDE 11966 31989021988021450311830.8542MSANS +9188HULOT MAURICE 11966 11990021991101249910472.7942MANGL +3718SOU ANDRE 11966111991111994011249910472.9642MANGL +1189GROSSO XAVIER 11966111995081994081868714506.1342CSANS +7659METRA MARYSE 21966 91989051988051450311832.4142MALLEM +1281CRIPE GISELE 21966 91987021986021527112374.7042MSANS +7796AMIRAL ELIANE 21966 21994011992011202810239.9642CSANS +6977NOHANT MONIQUE 21966 91986061990111949415051.2242MSANS +7731VERGERS MARIE GENEVIEVE 21966 219941219930411389 9851.6442CSANS +4652LAFAYETTE MICHELINE 21967 31987061988031450311831.8742MSANS +7993CHILPERIC BRIGITTE 21967 619940519920111389 9851.0742CTECHN +2195VELASQUEZ DENISE 219671219940519920111389 9852.2042MSANS +5536TIFFANY CATHERINE 21967 81988051987051450311832.2042MSANS +9529CLAIREFONTAINE CLAUDINE 21967 81991081992061267210588.8542MSANS +1639VILLENEUVE GUY 11967 41994101993041202810241.8542CANGL +1238BOURBESNEUR DIDIER 11967 41991091990092611219510.6742CSANS +9384CORALLINES PATRICK 11967 31990011993031249910471.9242CSANS +4464PICHI PIERRE 11967 2199507199407 7464 7525.8642CANGL +6931VOL MICHEL 11967 61994051993041360611211.0642CANGL +0488DOREE DOMINIQUE 21967 21991111990111723313653.8442MSANS +0529RELUYEN JOELLE 21967101987101988051467711986.0142MSANS +9178PART CHRISTIAN 11967101993061993091267210588.8942CANGL +8565KENNEDY JOCELYNE 21968 11991011990011381911366.3442CSANS +2088ROUSSEL LILIANE 21968 719930819920811389 9850.8342CSANS +6684BRUN CHRISTIAN 11968 11987051992091839014313.2142CANGL +7111VENIZY JACQUES 11968 519940319930310363 9232.9842MANGL +9217POUTIS ALAIN 11968 21989041995071249910473.5942DMICRO +4714MARINA FREDERIQUE 21968 21988121992011249910471.8942MSANS +8715AULDE BRIGITTE 21968 71994051992011202810240.9142CSANS +9713ESCUDIER PIERRE 11968 61988121993041467711986.5342MTECHN +6341SELLEBIED MICHEL 11968 81988011994011249910473.4242MSANS +8663JASSERON ANDRE 11968 21995081994081450311832.7242CESP +5734ODENAS SYLVIE 21969 81991041990041381911366.0742CESP +2288CENSIER MARTINE DANIELLE 21969 4199408199308 8359 7952.9642CINFOR +4540PERS RENE 11969 71991111990111949415051.9742MANGL +5166VERAN BRUNO 11969 319930719920711389 9852.3642CINFOR +3740CLOSEAUX PHILIPPE 11969 6199312199212 9597 8729.9742CESP +5076BELLONTE JOSIANE 2196910199312199212 7590 7562.4942.SANS +6280MAGENTA LAURENCE ANNE 219691019930519920511389 9852.2442MSANS +4916MONTMERLE NELLY 21969121991101992061330611017.1642MESP +1013SEILLAN MIREILLE 21970101994021993021360611211.0942CALLEM +3949GRUN PATRICK 11970 41993111992111330611017.1942MANGL +0280RICHELIEU ROLAND 11970121991111992061202810241.0942MSANS +7899FRERES CHRISTIANE 21970 71994031992011202810239.8342MESP +5404VIARMES ROBERT 11970 41993051994011202810240.0842MINFOR +6508CALEU FREDERIC 11970101992111991111420611637.7842CSANS +6706VILLEMER GERARD YVES 11970 91992051991051202810240.0142CSANS +9352WAUTHIER CHRISTIANE 21970 919921019911010668 9426.2742MSANS +7483ARAGO REGINE 21970 11993061992101420611637.1242CTECHN +8430BRUEYS ROSELYNE 21970 5199302199202 8359 7952.7942MSANS +2207CAMBEFERRIS MARIE ODILE 21970 919940719930411389 9852.0642MANGL +7014CATHERINE ANNE MARIE 21970 519930519920511389 9851.3442CSANS +2499MONTALEMBERT FRANCOISE 219701119921219911211389 9852.4742MANGL +0607CORBERES ISABELLE REGINE 2197011199511199411 9894 8922.7742MSANS +8631MOUSTERIAN MICHEL 11970 519940619930511389 9852.7242CVENTE +4299PAIX MICHEL 11970 31994011993011420611637.1142MSANS +1722ALBERT GEORGES 11970 71990061992091202810240.8242MSANS +7839LORRAINE DANIEL 11970 81993121992121420611639.2242MTECHN +2390VENISE JEROME 11970 6199406199306 9597 8728.5342CSANS +4622BOUTON SERGE 11970 71992111991111420611638.5042MALLEM +8468MONTALEIGNE FRANCK 11970 61993031992031420611637.8042CSANS +4926LEZARDIERE JEAN CHRISTIAN 11970 819930119920111389 9852.3842MSANS +0318MISSIONNAI FRANCOIS 11970101994021993021420611639.2442MSANS +2478CENAC ANNE MARIE 21971 11992071991071420611637.4442MESP +9531FLEURIES PATRICIA ODILE 21971 6199612199512 9894 8921.9442CSANS +2370ARTOIS MARIE MADELEINE 21971 919930219920211389 9851.2442CSANS +9824CLAOU JANINE 219711019941019931010668 9425.7342CANGL +0436BUISSON JOELLE 21971 519950119940110668 9426.4142CSANS +6968RABELAIS CHANTAL 21971 619951219940110668 9426.3242CSANS +6232CASE CHRISTIANE 21971 61994051993051267210588.8542MANGL +5473GERANIUMS JEAN 11971 11990051994011249910472.9242CSANS +1033ISLE JEAN PIERRE 11971 51992081994011249910473.6342CTECHN +6691MONTAGN PIERRE 11971 91991091994011249910472.5942CSANS +3613TRONGET FREDERIC 11971 219940419940110363 9232.4642MSANS +5033GENELLES PASCAL 11971 81991121993061330611018.0142CSANS +5241KENNEDY PHILIPPE ANDRE 11971 219930619920611389 9850.5642CSANS +2276MESANGES JEAN PIERRE 11971 11991081991091202810241.0342MCOMPT +4273HOLLYWOOD THOMAS 11971 41993021992021420611639.1042MANGL +9172PITCHOUM JEAN CLAUDE 11971 119921019930410876 9502.9942CSANS +2512GACHE JEAN CLAUDE 11971 81994091994011202810240.6442CSANS +4896CHILHAC GUY 11971 219930119920111389 9850.7642CANGL +3539MAS JEAN FRANCOIS 11971101992071991071420611637.6042CSANS +4359GAULLE LOIC 11971 419930219920211389 9852.0542CSANS +0794SOCLATE ALAIN 11972101994051993041360611211.0542CSANS +6685CONSOLAT JEAN PAUL 1197211199503199304 9597 8729.5842CSANS +3658BACON STEPHEN 119721119930219920210363 9231.8642MSANS +5829RAINIER YVES HENRI 119721219930119920110363 9231.9642MTECHN +5038ROSE JOCELYN 11972 41994011993011420611638.5042CTECHN +1479NOEL JEAN PIERRE 11972 219931119921111389 9850.8342CSANS +3997RICARD SYLVAIN 11972 61992051991051420611637.5642CANGL +6600LOUP KAZUKO 21972 519931019920811389 9852.2042CSANS +9876VOUZON CHRISTINE 21972 11993101992101723313654.7242CINFOR +2373RAPAILLOU THIERRY 11972101992121994011202810240.0542CSANS +1153RIBERA FRANCOIS 11972 3199406199306 7590 7563.9942CANGL +0976AIR FREDERIC 119721119940219930211389 9850.6242MSANS +1075COLOMBIER JACK 11972 6199401199301 7590 7562.5442CINFOR +3036SOISSONS THIERRY 11972 71992021991091420611637.7442CSANS +7541HIER MONIQUE 21972 11993101994111288210743.9942CSANS +8819RHIN JOSIANNE 2197212199407199307 7803 7679.9442CANGL +4699LENTISQUES FLORENCE 21972 6199501199401 9894 8923.2942CSANS +5011CIGOGNES MARIE FRANCOISE 21972 3199605199505 7803 7681.0242CSANS +7216FARRERE CHRISTIANE 2197212199408199308 8359 7953.2942CSANS +9971SALVADOR REMY 119731219951219941210668 9425.9942CSANS +6878BIGUET YVES 119731219940219930210668 9425.5842CANGL +9980LACHAMP CHANTAL 2197312199306199206 8359 7953.7242MSANS +3279ROITELET CHRISTINE 21973 819941219930411389 9851.8742CESP +9903PROVENCE VINCIANNE 21973 2199411199311 8359 7953.6342CVENTE +6941MAT SYLVIE 21973 919930719920711389 9850.7042CMARKT +2424PLAINE ELIZABETH 21973 419950419940110668 9427.4942MANGL +4221SOLOGNE ERIC 11973 619940619930610668 9427.2442CTECHN +8519ERABLES DANIELLE 21973 419931019921011389 9852.6742MANGL +7323SAUME ISABELLE ANNE 21973 919950319940310668 9426.6242CANGL +2143CUQUES HELENE 21973 6199612199512 9894 8922.0042MESP +5163SOULELHAT CORINNE THERESE 21973 9199407199307 8359 7953.0642CANGL +9032PETILLAT PIERRE 11973 41992091994011249910471.7442CSANS +9059DARONNE JACQUES 11973 419940619930610668 9426.4142CANGL +6626DEVESSOUS JEAN CHARLES 11973 91994071993071206910241.5842CSANS +7108BUISSONNETS HENRI 11973 419930419920711389 9851.6142CSANS +0443FONTAINE YAN 11973 9199406199306 7464 7524.2142CESP +3078CHARBONNIERE JEAN PIERRE 119741019931019920711389 9852.2942CSANS +5301REYNAL JEAN LUC 11974 6199401199212 9597 8729.6742MINFOR +7425RAFFAELLI PHILIPPE 11974 319940719940111389 9851.8842MINFOR +9638SYLPHES PAUL 1197410199407199307 9894 8922.5742CMICRO +9287ROSSAYS MARIE CHRISTINE 219741019960419950411389 9851.3443MANGL +9554PILGRIMS JEAN PIERRE 11974 219931219921111389 9852.0242MSANS +0960BOCAGE JACQUES 11974121993091994011202810240.9442CSANS +7246PEYRIERE MARIE CARMEN 21974 419940719930710668 9426.2242CANGL +3039COMBRAY MARC 11975 4199607199507 7803 7680.7542CSANS +5779SAENS ANNIE 2197510199608199508 7803 7680.8942CANGL +8044FERRY ROSINE 21975 9199507199407 7803 7679.8742CCOMPT +0191KER MARIE HELENE 21975 3199611199511 9256 8533.0242MSANS +6974MANCINI JEANNINE 2197511199408199308 7803 7679.7642CANGL +0518VICTOIRE PATRICIA 21975 3199608199508 7803 7680.8042CSANS +1262TRAUD JACQUES 11975 819940519930510668 9425.9642CMARKT +7772MOZART SOLANGE THERESE 2197610199608199508 7803 7679.4142CALLEM +9670GRESSETS LAUREEN 21977 8199607199507 7803 7681.0442CSANS +8996ADRET CELINE 21977 3199608199508 7803 7680.6242CANGL +3676MENEZ MARC MAXIMILIEN 11933 91966071994011932314935.3843MALLEM +9549BOURGOGNE ANNICK 21936 41968051991102137316331.4643MSANS +9677BROQUERIE CLAUDY 219381219780719910611131 9658.3743VSANS +4456LAC PATRICIA 21938 81962041985062470018542.2243MANGL +6693FENELON VALERIE 21939 61959121986012273717261.0743MTECHN +0887NASTRINGUES BERNARD 11939 81962091992032137316331.2443MESP +7338AMBROISE RENE 11940 91968041995011557012566.9943MSANS +0858TURNEGOUET DIDIER 11942 71982011993011249910473.0043MSANS +8537VERT PATRICK 11942 61976121993011578112722.9343MSANS +3521HOUEL PATRICK 11942111970091995011557012568.2243MSANS +2105ROCAL JEANINE 21944 51970071991071578112723.3343MANGL +6696PLAIDEURS JEAN PIERRE 11945 91972121990011403411520.4243MANGL +1309BELLE MARIE MARTINE 21945 31965011988042470018541.9743MSANS +9127PENFOULIC EMMANUEL 11946 5198901198801 9894 8921.9943MESP +2831CHAMAS MIREILLE 21947 21969031993031834514274.8443MINFOR +1888BONJOUR GUY 11947 91980101993101471512024.6243MANGL +1642POURTEL FRANCOISE 21948121974111994041471512026.1543MANGL +5118QUINTANA NADINE 21948 6199406199304 9126 8457.3343MSANS +7220LANDON JACQUELINE 21948 91970071994092529918967.9843CSANS +5846ROI PATRICIA 21948 11971051991102043315669.5743MINFOR +6443JUIN DAVID 11948 11975061991012137316331.7043MSANS +1072BELLY THIERRY 11949 91979041992011249910472.6143MANGL +3513GAMA VALERIA 21949121969021990071578112722.3343MANGL +8936MARGUERITE MICHELE 21951 41973021993012017815516.0843MSANS +9731GILLES NICOLE 21951 319961119951110668 9426.2743MSANS +3374ROBESPIERRE CORINE 21952121973021991012781920675.1943MSANS +9500EDELWEISS GERARD 11952 21978011992111684813422.4443MANGL +9602PARADOU MICHELE 21952 51975051981091684813422.6843MSANS +4313BERNEDE AGNES 21954111975041991071578112723.7243MANGL +9347LAUZES MICHELE FRANCOISE 21956 91978061992051471512025.7043MANGL +9922BELLA MARIE THERESE 21956 61982041981041326611018.1043MINFOR +9508ROBERT PATRICIA 21957121979071994121911114778.0643MSANS +9342GALLERANDS PAULETTE 21957 419950219930411389 9850.7043MTECHN +8765ELANCOURT BERNARD 11957 71980081993061369311286.1743MSANS +8497RIBOT JOELLE JACQUELINE 21957 21977071992121527112373.0443MSANS +6373RENE CLAUDINE 21958121978041992021471512024.3543MANGL +1513FRANLAINE BLANDINE 21958 91984101985041527112373.9543MSANS +1684CHALEIL MICHELINE 21958 31978061993101471512025.3243MANGL +2983LAVIE JACQUES 11959111988031994011249910471.9743LALLEM +3412CORTIJO AGNES 21959 31983011982011608112915.7843MSANS +4467VADEL JEAN MARIE 11959 51991041994011202810241.3943MSANS +9453CAVILLON MAURICE 11960 61985111992071288210744.4643MALLEM +7623MALESHERBES BRUNO 11961 81984081991061326611016.7443MTECHN +1600BLANCHES MARIE CHARLOTTE 21961121990031993061249910472.0143MALLEM +7714POMMIERS VALERIE 21962 41993081992011249910471.6143MESP +7193CAMBARRAS PHILIPPE 119621119930119920110876 9503.2743MALLEM +0639TANQUEUX FREDERIQUE 21962 61982081989112090215980.8243CSANS +8276LACROIX DIDIER 11962 61991101993041467711986.8943MSANS +5057CINO GERARD 11963 61983111995091693613498.3143MINFOR +0238SARRAZINE MARC 11963 619941119931010363 9233.5743MSANS +7129NIVERT THIERRY MICHEL 11963 519910419940111302 9775.7943MSANS +8602PYRENEES DANIELLE 21964121993091992011202810240.5943DESP +6662PUERTO SYLVIE 21964121985101984101249910473.5643MSANS +7625SCHWEITZER LAURENCE 21964111991091990091202810240.4643DANGL +7052CARREAUX SYLVIE 21964 61985021984021288210744.6743MALLEM +9218SALIS ARMELLE 21965 3198801198601 8656 8146.6143.SANS +3260JABLINES JEAN JACQUES 11965 41990091995092256617145.3043MSANS +9721LAVOIR YVES 11965 619930119921011389 9852.1443DALLEM +3429CAM BERNARD 11965 61987021993051839014313.5743MSANS +1856FLAUBERT PASCAL 11965101985061994111693613498.5543MSANS +0790JARDIN SERGE 11966101987091992101539912453.0643MSANS +2445VIESCAMPS YANNICK 11966 11991111991101381911365.5343MSANS +5684SARRASIN PATRICK 11966 51994101993101267210589.3943CSANS +4794DIAZ PHILIPPE PIERRE 11966 21987111993111693613499.4543MSANS +5479THIREUIL GILLES 11966 31992041992011202810241.0343CSANS +6199HELEN MARTIAL 11967 91987081995011373711326.7043MSANS +9298FOUQUET RAYMOND 11967 419960619950611389 9852.2943DINFOR +7535COURTELINE PHILIPPE 11967 11991021994011249910471.6143MTECHN +4595PANSEROT JEAN JACQUES 11967121989091989061539912452.5143MINFOR +4584SANGUI PHILIPPE 11968 219950119950110363 9231.9543MSANS +1356BERTIN MARYVONNE 21968 41993061992061267210589.6943MMICRO +3761GARD HENRI 11968101989071993091723313654.6543MSANS +6649GUILLAUMET LAURENCE 21968 71994021992011202810240.3543CSANS +2548LYCEE ALAIN 11968 51993121994011202810240.1743CSANS +0307ABBAYE ANNICK 21968 919920919910911389 9850.7443MSANS +0524PEYRILLES YOLANDE 21969 119940719930411389 9852.5943MSANS +3086FABRE JEAN YVES 11969 71989121994041249910473.2443MSANS +2273BREUIL SERGE 11970 719891119920811302 9774.3843MALLEM +5532NIRVANA FRANCIS 11970 419920219920810876 9502.1443MTECHN +0282TOURISSE BERNARD 11970 41994081993081360611211.4743CANGL +8554BOUVIER OLIVIER 11970 81993061992061267210590.5443CANGL +3126PONTAROUX JOCELYNE 21970 619930619930411389 9851.1943MSANS +0208ENCLOS DIDIER 11970 219941019950110363 9233.5443CSANS +5629VENEUX JEAN 11970 319930919920911389 9851.7443CINFOR +9569CASCADES MARYVONNE 21970 91991101990101202810239.7843CSANS +4663DAUBERIE DOMINIQUE 21970 919941019930411389 9851.1543MSANS +3912FOURNAS MARIE 21970 119930819920711389 9850.8343CTECHN +2317CALDANA ODILE 219711019940519920111389 9850.7943MANGL +4841MARIDOR CLAUDIA 21971 4198907199101 8656 8146.1643.SANS +3038FERRARI FRANCOISE 21971 2199206199106 7803 7681.2543.ANGL +3547KERA MICHEL 11971101994101993101360611209.9243CSANS +8801ORRES JEAN JACQUES 11972 91994061993061420611638.1043CINFOR +8995CRUCITA PHILIPPE 11972 11993041994011249910472.5743CINFOR +1636NORVIL BERNARD 119721119930919920911389 9850.9243CSANS +7758AURES JACK 11972 5199309199209 9597 8728.6443CSANS +9063SATIE OLIVIER 11972111994061993061420611639.0643CSANS +9116BREVIAIRES LAURENCE 21972 119930419920411389 9852.3343CINFOR +3743SORALY ALAIN 11972 4199407199307 9126 8455.8443CANGL +9641ASTARAC CATHERINE MONIQUE 219721019940619920111389 9851.6943CALLEM +1350RAMBUTEAU RENEE 21972 61993091992091360611209.6543CSANS +0615ROBERT REMI 11973 51994011993071267210589.9343CTECHN +2872KERPETIT ALAIN 11973121994041993041420611637.8043CSANS +9594BENEDICTINES JACQUES 119731219931119921111389 9851.1543LSANS +5147TERRESROUGES DIDIER 119731119930319930311389 9852.2443CSANS +3464CASTERAN EVELYNE 21973 519950219940210668 9426.1843MSANS +1330INFERIEUR CHRISTIAN 1197411199607199507 7803 7680.0543CSANS +0129DEGANNE WILLIAM 11974 91994071993071206910241.9743CMARKT +9626STENDHAL CLAUDE 11974 51994081994121202810240.0543CSANS +8520COUPERIN JEAN 119741119940519930510668 9425.5843CSANS +7404PERGOLESE RICHARD 11974 31994051993041360611211.5143CANGL +2352ECLUSE BEATRICE 2197411199608199508 7803 7680.6243CCOMPT +6779PERRONET PASCAL 11974 91994061993061360611210.9143CANGL +9456REVOIRS MARC 1197512199507199407 7803 7680.9943CINFOR +9467CONCORDE CLAUDE 11975 919941019931010668 9427.4443CSANS +7348GENOUILLY FREDERIQUE 21975 7199407199307 7803 7680.4443CANGL +8390CEILA DOMINIQUE 11975 9199409199309 9894 8922.7243CSANS +3308BOULANGER RENE 11975 6199410199310 9894 8922.0043CALLEM +8061DENFERT VALERIE FRANCOISE 21975 11995041994041206910241.1243MSANS +9867ROCHOPT MARIE PIERRE 21976 8199609199509 7803 7680.2343CCOMPT +0466MIMOSAS CHRISTIAN 11976 1199408199308 7803 7679.3143CSANS +6069BATIGNOLLES MARTINE 2197710199608199508 7803 7679.2843CSANS +7049CRENON DANIEL 11947 81973041994011621213032.3044MSANS +1304PERI VERONIQUE 2194912199310199210 9597 8729.0944MSANS +3258DARMONT VERONIQUE 21961 21986061992021168610047.0344MSANS +1840COQUART LUCILE 21964 41984101993051381911365.0544MANGL +2897PERCHE ALAIN 11967101990061995011318010939.1344LSANS +6181BIZET MIYUKI 21968 2199302199202 9597 8727.9944MSANS +6750EDGAR HERVE 11971 21992011991011202810240.5844LSANS +0175MARQUIS COLETTE 21974 5199606199506 7803 7680.2744CSANS +1275FRIGOULET YVES 1197410199506199406 9894 8921.6944CSANS +8305BEZENAC FRANCOISE 21953 2199404199304 9126 8455.7045MSANS +4858DUPLEIX MARC RENE 11954111978121982102470018541.8845MANGL +6314ABERDEN EVELYNE 21958 61979111978111684813423.0845MSANS +0464PETIGNONS DOMINIQUE 11961 91984061993031527112374.9745MSANS +3847GUICHARD PHILIPPE 11961 11983081988112090215980.9745MTECHN +8173HOPITAL ANSENIA 21964 319950419940110668 9425.3645MSANS +4339VILLE DOMINIQUE 11971 91994111993111267210589.1245CSANS +1142SPITALIERI FREDERIC 11933111953121993014121428007.2246MALLEM +6086SOEUR JEAN JACQUES 11935 91955061991053417325097.9646MSANS +0246OREE PATRICK 11937 71965101986012470018541.1946MANGL +7398MOUNET CLAUDE 11937 919960119950510024 8999.3946MSANS +2438VISITATION CLAUDE 11938 31964111986012470018542.2446MSANS +3413ETIENNE JEAN MARIE 11940121969051986072470018541.1146MSANS +9044GUEN PAUL 11941 11973051993011518612335.2846MINFOR +4544MONEGLIA ABDELKAD 11941121965101989072947921838.8046MINFOR +5661BELLON PHILIPPE 11943 91965111994013200223584.4346MSANS +4296VENDARGUES YVES 11943 31964111991012273717260.1446MSANS +2281TRIMARAN OLIVIER 11944 81973051990011403411521.4646MINFOR +9015IRIS YVES 11945121973011990011403411522.1346MESP +7856BELLEVILLE GERARD 11946 31965101986012470018540.2946MSANS +9041SADI PIERRE 11946 61977121995062000715437.9146CINFOR +2976BLANQUI GIANCARLO 11946 51968091986072273717261.9446DSANS +4370GROUPE PHILIPPE 11947 21974071990011403411522.0946MTECHN +7697SEYSSINS BERNARD 11948 51968071991012470018541.8646MALLEM +9305SEINE GUY 11949 91970041987012273717259.9046MANGL +5926BOILEAU BERNARD 11951 61972051989012273717261.9046MALLEM +3592PETIT GILLES 11951101974011995032547019085.7046MANGL +7590PLAYA JEAN YVES 11954101977091982102470018541.4746MSANS +8144DARIE JEAN PIERRE 11954 21995011994011420611638.9246MSANS +8637GUILDFORD PHILIPPE 11955 21974061995082547019085.8646MINFOR +7809CEYRESTE FRANCIS 11955 31975021993081608112916.2546MSANS +9226MONDONVILLE MICHEL 11956 51979011992011471512025.1146MTECHN +8675BLANCHISSEURS ANNIE 21958 11979071993041471512024.3346MSANS +0338BARBUSSE ROSELYNE 21958 1198902199209 9597 8729.2546MSANS +4849SANZILLON MARIE NOELLE 21958 81979101978101288210743.8346MSANS +7791PRA BRIGITTE 21958 81981041980041684813422.0846MSANS +3255LENOTRE BERTRAND MARIE 11959 81980111991012022115555.6246MESP +3148EOLIENNE GUILLAUME 11959 11983031991011868714507.9446MSANS +1942CAUSSES MICHEL 11960121987081991061288210745.4746MSANS +8983RAYMOND JEAN LOUIS 11961 11985031991011868714506.7246MSANS +5296BRETAGNE PHILIPPE 11961 41983081991011868714507.7246MSANS +0323QUONIAM GILLES 11961121983051993091450311831.5746MSANS +3231MOULIN HUGUES MARIE 11961111985091995011373711328.2246CSANS +9926PIN PATRICIA 21962 41984051983051288210745.7546MSANS +0400HARAS PHILIPPE 1196312199407199411 9597 8728.1746MANGL +8313ROUILLAC BERNARD 11964 31991021991022529918968.4746MSANS +1947CORNEILLE DOMINIQUE 11965111987021994091693613499.4346MANGL +1364KERSAUX JACQUES 11965 41987091986092090215981.4746CANGL +4571CAILLOU ERIC 11965 91985041992071616712995.9946CSANS +5043BAC MONIQUE 21965 61988081987081539912452.4646CSANS +5037CALLE PHILIPPE ROGER 11966 81994091993091839014312.4546LSANS +3072PONTHION ALAIN 11966 21990091989091467711987.1346MANGL +3441ARMAINVILLIERS YANNICK 11966 11987021994091693613498.8546MANGL +2298PLESSIER ANNE MARIE 21967 2199004199111 8656 8146.6146.ANGL +3281ALBAN ELIANE 21967 21986111992011288210744.0846MSANS +1984ROCH GERARD 11968111992031992041467711986.7246MSANS +6981TROQUEREAU JEAN JACQUES 11968 91992081991081467711986.2646MALLEM +4384LAMORLAYE MICHELE 21968 31993121992011202810240.1746MSANS +4391JUGE BERTRAND 11969101992091993072397418036.9346MSANS +4122CAULAINCOURT YVES 11969101988081987081539912452.1646MINFOR +5356LACAPELLE ALAIN 119691119930419920411389 9852.0246MTECHN +8278CHANTEMERLE GERARD 11969 919920619940710876 9503.4546MSANS +2596DESSUS GUILLAUME 11969 11991091990091467711986.4946MSANS +7596MEYERBEER EDOUARD 11970 11992111992111330611018.1046CMARKT +5724HOCQUETTES AUDE 21971 31991071990071467711986.3146MSANS +1372AUBEPINS CHRISTIAN 11971 21994101993101360611209.8846MALLEM +8783BAUDOIN JEAN FRANCOIS 11971121993081994011202810240.4146CSANS +3416MIREFLEURS NORIKO 21972121994021993021360611211.5646MCOMPT +0948TIERRAINE MARC CAMILLE 11972 319930719920711389 9851.5946MTECHN +0904FOUGERES JEAN MARIE 11972 919920119920311389 9850.8946CTECHN +4010QUARTRAVEL CATHERINE 2197211199501199401 9894 8921.7246MSANS +1528FARMINGTON RENEE 21973 119940419940111389 9851.0346MSANS +8402TREZEE GILLES 11973 919930719920711389 9850.8846CSANS +7279CORNE GUY 11973 71994011993011360611210.3746CSANS +0232PIN JEAN CLAUDE 11973 519960619940110668 9425.4546CTECHN +9635MAGALI CHRISTIAN 11974 4199607199507 8656 8147.2246CALLEM +7035ANGLAS LUCIENNE 21932 21963011988102273717260.1448VSANS +7818HERZOG DOMINIQUE 21937121972101993041557012567.0848DSANS +6478MAREYE JEAN PHILIPPE 11940 21959101983102273717260.8048MSANS +1661VAN EDITH 21940 81974091990012137316330.9748MSANS +1597MATRAT CATHERINE 21940 61967071992121834514275.5948MTECHN +1046MAUNY JEAN CHRISTOPHE 11941 81979021994011471512025.4748MSANS +8249FILLES MICHEL 11942 51962081993093417325097.1948MSANS +0711PICCINI JEAN JACQUES 11943 81963041995072470018542.0048MSANS +0378HALLIERS JEAN PHILIPPE 11943 3199501199401 9597 8729.3648CALLEM +9597VOLTE MARIE THERESE 21946 71968041990012273717260.9448MCOMPT +4768PICAUD BRIGITTE 21947101973101995102043315670.9248DSANS +0554ROLAND ANNE 219471019920719910710024 8998.7748DSANS +3349SERRE PIERRE MARC 11948 61969021991012470018542.1048MALLEM +3355KURFURSTEN PAULE MARIE ODILE 21948 7199501199301 8656 8145.6648MSANS +6449IRUENA DOMINIQUE 11949 71969031990051932314934.2748MESP +3922LAVERSINE YVES 11949 81975101986103634926571.4148CSANS +7286JOUVENET HENRI 11951121981021994011621213032.6548MANGL +2199CABOTS CHRISTIAN 11953121988121995011373711326.7148MINFOR +8300CHARPENTIER CHANTAL 21955 61992011993041249910472.4148MSANS +2397FAMILIAL JANY 11955 61982101994041471512024.3348MANGL +9021BIED CLAUDE 11957 51980061992111911114779.6848MSANS +4703COZ JEAN 11957 41979081993121911114779.7748MSANS +3297STALINGRAD BERTRAND 11959 31981081992102090215980.9748MANGL +2319FRANCOEUR HENRI FELIX 11959 11980081993121804514081.0148MSANS +8833MONTLHERY ELIANE 21960111983041989041527112373.6848MANGL +1084MAGNARD JEAN PIERRE 11960 91984021992012022115556.0248MSANS +4562HAUTE ANNIE 21961 61984061983061249910472.8748MTECHN +4907FRANC BERTRAND 11964 21984081986072090215980.5648CSANS +2492ETANG PASCAL VINCENT 11968121990111989111467711986.6248MANGL +3754RAOUL FRANCOISE 21968 91994031993091450311831.8448MTECHN +7902CELARD BERNARD 11969 31990041989041467711987.9048MANGL +0316FLORENTIN TYRONE 11969111989081989021450311832.4148MANGL +1981DEPARTEMENTALE PIERRE 11970111993041992041420611639.0148CSANS +4735BEL SKEVOS 11970 61991021994011249910473.5448MSANS +0999CONNE DENIS 11971101993041992041420611638.8848CSANS +3832BEACH SERGE 11973 41994121994011202810241.1248MTECHN +4697PURPAN FRANCK 11935 51976041994011578112723.1550MTECHN +1565NEMOURS ANDRE BERTIN 11939101967071990091932314934.3150MANGL +8977MAHATMA HERVE 11942 41981051994011621213032.0650MANGL +8738ZILINA JEAN LOUIS 11942101980061990031249910473.4750MTECHN +6415ECUREUILS ERIC WILLIAM 11942 61969081994011932314934.7050MSANS +9332FRIRION GEORGES 11945 5199409199309 9597 8729.4950MSANS +5001YVES PHILIPPE 11945 41975111988071578112722.8750MSANS +2290ENSOLEIADO JEAN MICHEL 11946 21988051994011288210745.5250MSANS +8492LAGRIVE LAURENT 11947 81982011993011369311287.2950MANGL +3609GUESDE ERIC 11949 11989061992031249910472.1950MSANS +8482TOUT ANDRE 11949 71980041995011621213034.2250MANGL +8866PERCENEIGE PASCAL 11950 41976071995011578112723.7450MSANS +3195VIVE CLAUDE 11950 21981081995011621213032.2050MSANS +2538AICARD SABINE 21954121976061993031608112915.5150MTECHN +5185LUTHEZIEU PATRICK 11955 51988021994011288210744.2650MANGL +3135EDER DIDIER 11957 819880119930310791 9502.9150MTECHN +9006MAURETTES JACQUES 11958 11985041993011369311286.6950MINFOR +8049COLLIERES CHANTAL 21961 11984031983031288210745.2250MTECHN +8766TERROIR GILLES 11963101987121989091450311832.4150CALLEM +2924LAC BRUNO 11963121989051988052090215981.1450MSANS +5549DUMONT MICHEL 11964 51988051991081450311832.4250MALLEM +8382MONSEIGNEUR CHRISTIAN 11964111992011994011249910471.8950MSANS +8129STATION BRUNO 11966 41994051993051202810239.8750MANGL +3420EMERIAU JOSE 1196711199306199206 9597 8729.8450MANGL +9831CLAMOUR YVES 11967 819950919940910668 9427.4950MANGL +9072MENDON GUY 11968 1199605199505 8656 8146.8850MSANS +4669FAURE ERIC 11968 3199505199405 9126 8455.8850CTECHN +4319MOURISCOT PATRICK 11970 9199306199206 9597 8729.2750LSANS +1731FRANKLIN MICHEL 11970 4199401199301 9597 8729.4050CSANS +0510PILOT DANIEL 11972 519961219951211389 9851.5250CSANS +5973LECLERC MAURICE 11974 3199606199506 8656 8146.3750CSANS +9358MONBEL HENRI 11933 91959031993011557012567.1251MVENTE +7641BRETONNE CHANTAL 21936 51962081990012273717260.9451CSANS +7048CASTELNAU LAURENCE 21937 91962031991042273717259.7851CMICRO +5481PASCAL GILLES EMILE 11937101958051979013327724476.1651MSANS +6723SARRAZA FRANCOIS 11938 21962031989082572519240.3551MSANS +6355REPOS JEAN MARC 11938 41960011980013327724476.5251MSANS +1644ACARDIE BEATE 21939 31963091991072273717260.2251CTECHN +5030LOGELBACH ASTRIDE 21940 11962031991042137316332.4551MVENTE +5298GARDE MARIE FRANCE 21940 91969011989011621213034.1951MALLEM +6400SIONIE CATHERINE 21941 3196206196106 4894 6128.0051MTECHN +5537CAPEOU LUCE 21942 519931219920110024 8999.7951DINFOR +7143DEO NOBUKO 21942 41969091991102137316331.9751MSANS +9555CAMBRONNE DANIELE 21943111962051984122572519240.2851CSANS +3792EAUX JEAN 11944 81966031995072137316330.9751MSANS +6932PAULIN ISABELLE 21945 41972041989011621213033.2851MALLEM +1308CHRISTOL MARTINE 21945111968121993061834514274.8451MSANS +2877DANIELLE GERARD 11946111970051992011471512025.1151MSANS +5367ILE FRANCOISE 2194712199010198910 8656 8146.1451.SANS +3253VERG BIRGIT AGNES 21948101969071985042470018540.3951DANGL +5806FRED CATHERINE 21948 41968041990042572519239.8251MANGL +6174BANQUIER CATHERINE 21950111971061989011621213033.7051MSANS +8732FOUNSUT PIERRE ANDRE 11950 11978071995041249910472.1051MCOMPT +4803ALASSEUR AGNES 21950 71974051992091471512026.1051MSANS +9024CHATARDS CAROLINE SOPHIE 21951 31972081987052334017609.4651MALLEM +1259SOUFFLOT FRANCOISE 21952 81981011983091326611017.2551CSANS +7009PARADIS LUDWIKA 21952 71974011973011215710279.1951MSANS +9186LESPIAT EVELYNE 21952111973041990101578112722.1551MSANS +6834FLEMING JOCELYNE 21953 41973021993012017815517.2851MMARKT +5164BEAUVILLAGE COLETTE 21953 91986081985081684813421.4051MSANS +4947ESCALUS CHANTAL 21954 219810519800510024 8998.4151MSANS +8461MARGUERITES CATHERINE 21955111976061994051471512025.0151DSANS +5391FOURCAULT ANITA 21956 61978061992091471512024.4451MSANS +2777ALMUNECAR CHRISTINE 21958 41993071992011249910471.6251MINFOR +9747DROPT MONIQUE 21958 31979031993041471512024.0851MANGL +2758CRAYS KIM LEE TAMARA 21959 11992031991011202810240.1951MSANS +8238SERGENT ISABELLE 21959111983061982061326611016.0351CSANS +4402DIVISION SABINE 21959 71979101993071471512025.1651MALLEM +1231FACE HUBERT 11959 319950319940111389 9852.6751LTECHN +3907ESBLY GUNDA 21960 81980071979071288210745.3451MANGL +4821TAMEYE MERCEDES 21960 119820919810910668 9426.6651MANGL +1175CRESY CHRISTIANE 21961 21990111989111249910471.6651SSANS +6825FEUILLES DENISE 21961 51982051981051326611016.0651MANGL +5368FLANDRE SUZANNE 21962 71983111982111249910472.3351MANGL +0947LORRAINS CHRISTINE 21962101985041984041288210745.1651MALLEM +5318CLAMART ANNE 21962 51982081981081326611018.0051MSANS +8693FILLIETTE JEANNINE 21962 31982091981091194310201.7051MANGL +5069GRAVELLE ILSE BERTI 21962 81992061991011202810241.9051CSANS +5908VERTS CATHERINE MARIE 21962121984111983111608112915.9651MSANS +3068DUNKERQUE ELIANE 21962 31986101985101202810240.4051MSANS +5894CARESTIER MARYSE 21963 41985091984091288210745.1351MALLEM +1739HILARION LAURENCE 21963 61982091981091497412179.3651MSANS +8326MASSAY MARTINE 21963 41984091983091608112915.6951CANGL +6923GUYONNE NATHALIE 21963 81983101982101608112915.7551CVENTE +3533SAVIGNAC SERGE 11963 319890319880310407 9271.2351MSANS +9590GARIBALDI FLORENCE 21963 519940619920111389 9852.0051CANGL +5287HORIZONS MARIE ODILE 21963 21983021982021249910471.5651MSANS +9152PARRERE PHILIPPE ANDRE 11963 61992021991021381911366.2151CSANS +4730CROISETTE MARC 11963 61987111992012529918968.2051MANGL +7896LONGUE MARTINE 21964 91986041985041288210745.7251MSANS +0156CHTANOU YVES 11964 71993011992011839014314.0851MANGL +3013CELLIER REGINE SYLVIANE 21964 719870619860610668 9426.4151MANGL +1040HAUTI MARTINE 21964 11984101983101288210745.3951MINFOR +0730COURBET CHRISTINE 21964101984101983101202810241.7051MSANS +2393ROTONDE ELISABETH 21964 71984071983071202810241.8451MANGL +6940LELIEVRE RYOKO 21964 21985051984051527112373.2351CSANS +5571MARCEAUX ANDREE 21965 31993091992011202810240.2251MSANS +9937MANDARINE GHISLAINE 21965 11994031992011202810240.9151MANGL +6185HERMITTE FRANCOIS 11965 91990051989051949415051.5051CSANS +5405ARTZAMENDI MICHELE 21965 71989081988111949415050.6751MANGL +4260MIROMESNIL MARTINE 21965 71988031987031450311830.5351CSANS +9396BARBUSSE MICHELLE 21966 91986061993011839014313.0951MSANS +8592PLANTIERS MARTINE 21966 71994031993031267210589.5751CSANS +6905HAVRE PATRICK 11967 61988111987112090215981.2251MSANS +0499BEAUMARCHES JEAN PIERRE 11967111990021994051839014313.9551MSANS +9812PECHERIE FLORENCE 21967 219940419920111389 9852.2251CESP +6177RIQUET JANINE 21968 51994031993031267210589.6651CTECHN +1459FRANCE ANNE MARIE 21968 21988091993011381911366.4951CTECHN +9340EPINE RENAUD 11969 11994081993081206910239.8651MSANS +7293OBERKAMPF JEAN JACQUES 11969 81989041993041249910471.7051CCOMPT +0852GUERARD MARIE SOPHIE 2196911199308199208 9894 8923.1651MESP +8275DELZONS MICHELE 219691119930319920311389 9852.7251CALLEM +5873MARCHE MARIE LAURENCE CHRIS2197011199205199105 9597 8729.3051MSANS +8465BERNASSE ISABELLE 219701119920319910311389 9852.6551MANGL +2444BOUGNON MARIE JEANNE 21970 81993111992111267210590.7451CSANS +3440BAZOCHES MICHELE 21970111993101995041206910240.4151MSANS +2864GOAS SERGE 11970 51992101993081267210590.4151CESP +5499CLOHARS GERARD 11970 819900819890810024 8998.8451CSANS +6120MARVIVO EVELYNE 21971 519950219940210668 9426.5351MSANS +5419BEZANLEU CATHERINE 21971 51994031993031267210590.2951MTECHN +0309TUILERIE SOPHIE 21971 21994051993051267210590.6951CSANS +6131CAGNES NICOLE 21971 519940619930610668 9426.5351CCOMPT +8518VILLOUE JOELLE 21971 61992041993051267210590.0951CSANS +8453JONCHERE DOMINIQUE 11971 319940619920110024 8998.7651MSANS +5604NEUILLY AGNES 21972 119920419910410668 9425.8151MSANS +7047ALOUETTES MARIE ANDREE 21972 419920119910111389 9850.9451CSANS +5306BOPENIAN MONIQUE 219721019920919910911389 9851.9151MSANS +9169FLEURIS LILIANE 21972 71993121992121267210588.9251CANGL +8308BUZENVAL VERONIQUE THERESE 21972 5199607199507 7803 7679.4151CALLEM +1210NAUGAIRE MARIE ANTOINETTE 21973 61993081993091267210589.5252MSANS +5105HUGO CATHERINE 2197311199607199507 9894 8921.4651CANGL +3726LIVRYS BRIGITTE 21973121995071995051288210745.4751CSANS +5859MUZY PASCALE 21973 619930719920711389 9850.6151CVENTE +1436SAUVE DOMINIQUE 21973 61994101994121206910241.1351MSANS +2239CHALIGNY KYOKO 21973 31994091993091206910239.8651CSANS +0183LAURIERS PAULE 21974 81995111994121206910241.2551CSANS +9366PINET LAURENCE 21974 819940819930810668 9425.3651MESP +6833VIGNY EVELYNE 21974 51994081995121206910239.9952CVENTE +1571SEINE GUY 11974 3199609199509 7803 7680.8951CANGL +8078LAMARCK JOSIANE 21974 3199602199502 9894 8922.4151CTECHN +0018LOUVERSEY CATHERINE GINETTE 2197510199611199511 9894 8922.1451CSANS +7419VEROCE MICHELLE 21975 3199406199306 7803 7680.1451CSANS +8512ASSOMPTION CHRISTIANE 21975 3199608199508 7803 7680.5951CVENTE +6365EDENFLORE BRIGITTE 21975 1199308199208 7803 7681.4251.ALLEM +2274LOTUS ISABELLE 21975 7199612199512 9894 8923.1351CSANS +5674MAUBLANC NICOLE 21975 9199602199502 9894 8922.8051CSANS +0762GIORDAN ANNE MARIE 21975 1199607199507 9894 8921.3151MINFOR +0696PICAUD JEANNINE 21976 2199607199507 7464 7525.7451CSANS +6681MARCEL FRANCOISE 21976 3199608199508 7803 7680.6251CSANS +0740CHESNAIE PHILIPPE 11977 1199507199407 7803 7681.2551CINFOR +4654CANNES FRANCIS 11977 3199609199509 7803 7679.5851CANGL +7430MULLERON FRANCOIS 11978 5199607199507 7803 7680.8451CSANS +3935LISSAND ISABELLE 21978 4199607199507 7803 7680.6351CSANS +5586SCHUMAN NANCIE 21931111974111991071578112723.0552VSANS +1401RENAUDOT MARYSE 21933 51968071990071621213033.8152MSANS +1061AMBOISE DENIS 11934 11964041993011663613344.2752MSANS +9799GUILLEMETTE JEAN CLAUDE 11935 31955021991082470018540.7552MSANS +3145SABLES PHILIPPE 11936 11959021993073417325098.3651MANGL +3589FOURMONT PASCAL 11936 71959031982063327724477.0651MSANS +2996PAUL MARIE PIERRE 21936 51972121989011621213033.9152MSANS +2578PISY YVES 11938 71962111981102470018542.2252MSANS +1257LAMARK PATRICK 11939 71963121992052470018541.5052MINFOR +6677BRETHENCOURT NOEL 11939 21972111991011578112722.7052MSANS +9734FIGOURNAS DENIS 11940111971041989101932314934.7252MANGL +6502POMMERY ROBERT 11941 81963121993011663613344.0552MSANS +2718CHENES HAFID 11941 11964081994011557012567.3952MSANS +4104LANCY LIONEL 11942121988011995013587826261.1652.SANS +8284MERY PAUL EMILE 11942 61968021994012137316331.8752MCOMPT +3992BOUTICOURT EUGENIO GIOVANNI 11943 51964071987042273717261.8452MALLEM +9819LATTRE GUY 11945 31974071992071369311286.1252MESP +1150CAILLOUX JOSIANE 21945 11965021985042470018541.4752CANGL +6760HAUTINS BRIGITTE 21945 719781219900711131 9659.0652MSANS +2900FOS BERNARD GUY 11946 91974051993091168610046.6952CINFOR +3096CASTELLAR JACQUES 11946 71972041991112137316331.0352MINFOR +3983FLEURIE ISABELLE 11948111973111994011663613343.3052MANGL +9627CITROEN SILVIE 21948 31970041991012990722150.2852CALLEM +2626BUFFON BRUNO PIERRE 11948 51974051993011621213032.8352MANGL +1995GRENELLE PASCAL 11949 81975041991071578112721.7152MSANS +6675EMAN BERNARD 11950 71973081991012739020403.1152VSANS +1203JACOB JEAN PIERRE 11950 619790819780811389 9852.0052MSANS +1502COUBERTIN MICHEL 11951121979031992121608112916.4752MCOMPT +9762APPOLINAIRE JEAN CLAUDE 11951 51971101992112175716600.9252MANGL +6014MAURICE JOEL 11952 419910319900310024 8999.7952CSANS +8272BESANCON CHRISTIANE 21953 2199304199204 9597 8728.9452SSANS +4121VOLTAIRE PHILIPPE 11953 51972071995122043315671.2452CALLEM +3385CARNOT HENERE 11953121978061993051864214469.1452MANGL +9459SAUVETERRE OLIVIER MICHEL LOUIS11954101982061990011608112916.2352MANGL +0260MOURILLON JOELLE 21955 21984011992011249910473.0952MSANS +6808ROBERT PIERRE 11956 61979061992021471512025.3752DVENTE +1754CITADELLE PHILIPPE 119561019830619910311131 9658.9152MANGL +3114PINCES FREDERIC 11956 61976031988011684813422.5952CSANS +2401PAPE MARIE ANNE 21956 31978061992121471512025.9552MSANS +3724AGNOS ERIC 11956 71976041993111578112721.7052CSANS +1438KERLIBOUZEC EVELYNE 21956 71981111980111527112373.3252MINFOR +8247VERSAILLES LAURENT 11956 61980081995091249910472.5552MSANS +0939FLAMBERTINS ALAIN 11957 819950619920110024 8999.0752CSANS +5765FOCH ROBERT 11957 11981031993031608112916.3252MALLEM +9301GARDETTES DOMINIQUE 21957 1199505199405 9126 8456.6952MSANS +8571TIRE ROBERT 11958 11984051992041326611017.9752MSANS +7487THORNTON JEAN LOUIS 11958 31981041994051804514081.0752MANGL +3406AVEL PAULE 21958 419780619770611515 9930.5352MSANS +0124DESPORTES STEPHANE 11959 21979021995091471512025.7252MSANS +6928ASSIER PIERRETTE 21959111993101992011202810241.1352CTECHN +0989FEROLLES WILLIAM 11959 81983041982041326611016.3052MSANS +9802ORGE JEAN CLAUDE 11959 11980081987112256617145.8752MSANS +8376FOUQUE ERIC 11959 2198801198502 8656 8145.6552.SANS +8925COURBET YVES 11960 71987031989112090215980.8752MALLEM +3897ANDELU ALAIN 11960 81991011994011249910471.7452DSANS +3323BOSQUETS CLAUDE 11960 41983031995121433211715.6952CANGL +7089COULOUBRIER DENIS 11960 7199303199203 9126 8455.6552CVENTE +3026AGUILLON LUC 11961 2199601199501 8656 8145.6652MANGL +9585EGLISE ANDRE ROGER 11961101988111993092401918076.1152MSANS +0634MAINE JOSEPH 11961111986011992121288210745.7052CSANS +7284FORTES ANDREE 21961 51991111990111949415051.2152MSANS +3518VIELLE GEORGES 11961101988091992121249910473.6752MSANS +3969FERIGOULAS SYLVIE 21962 71983011982011288210743.9052MALLEM +1749ARCADIA PASCAL 1196210199305199209 9597 8727.8352CANGL +5023PAVIS YVON 11962 4199512199501 9126 8455.5352MALLEM +6853PLAGNE ROBERT 11962 819840619830611131 9657.1252CINFOR +0421HARAVILLIERS MAX 11962 819850819840810791 9502.9852CINFOR +8436PLEIN ROGER 11962 51984081989112090215981.3652CESP +2433SARTRE SERGE 119621219850719920910791 9502.6652CSANS +4413WALDTEUFEL FRANCINE 21962121982051988051608112916.0252MANGL +2214MONTEZE FRANCOISE 21962 3199302199202 9597 8728.3752MALLEM +0233COMMUNE ANNE 21963 2199312199212 9085 8419.4452STECHN +0441SOLARIUM ELISABETH MARIE PIER21963 21993071992011202810240.9952MTECHN +4510LETELLIER HUBERT 11963 31986111986031527112374.5852CSANS +1778EVEQUE BERNARD 11963 51986111992011949415051.3952MSANS +1339SEGUR SERGE 11963 91985091992121527112374.1252MTECHN +4092HEURSAULT AGNES 21963 51982031981031326611016.7552MSANS +9379GOJA MARIE THERESE 21963 71983041982041288210744.2652MINFOR +1533BODIN ISABELLE 21963 419831219821210024 8998.9152MSANS +9862FOSSE BETTINA 21963 91990111989111949415051.9552MSANS +6255VIGNE NICOLE 21963101984111983111608112916.9152MSANS +6101VAUGRENIER CATHERINE 21963101984051989041527112374.9452MINFOR +8653SEQUOIA HENRI 11964 51988031994011249910473.2052MSANS +9919BILY PATRICK GUY 11964 91985091992091949415050.6352MSANS +7059VALLEROY BEATRIX 21964 2199204199104 9597 8729.0752MSANS +5440PORS ANNE MARIE 21965 21986061985061527112373.1752MSANS +2587VICOMTE PATRICIA 21965 11991111992011202810239.8652CESP +9598SULLY CHRISTIAN 11965 91994051992011202810240.1452MANGL +0899MANU JEAN PAUL 11965 519880519870510407 9270.2952MTECHN +0493POET JEAN PAUL 11965 119891219881210407 9270.5652MINFOR +7853LILAS JEAN CLAUDE 11966 31986051985051288210744.5052MANGL +4637LONGCHAMP CATHERINE 21966 91988051993091839014313.0952MSANS +5141LINDFIELD GERARD 119661119870119860110407 9272.2452MANGL +3945PESSOT VERONIQUE 21966 119910719900710024 8998.8952MINFOR +6408PUJOLS CHRISTINE 21966 71987061986061249910473.0952MSANS +5883AUREA JEAN 11966101988061991011249910471.9452CESP +6385CHAILLY LAURENCE 21967 419910719900710024 8998.4152MANGL +8609CEINTURE ANNE MARIE 21967 21991121995071202810240.1452MANGL +1367NOIRES ANNIE 21967 61991101990101330611017.1952MSANS +6827NOISY FRANCIS 11967101988011987011450311831.9752CESP +3823RESISTANCE CHRISTIAN HENRI 119671119890319880610407 9270.8452MSANS +5716CYRAN PATRICK 11967 11987071994111450311832.6852MANGL +2307ARBELLARA NADINE 21967 61988091990111839014313.9352CSANS +0224VEBRET VIRGINIE 21967 9199406199305 9126 8456.1652CANGL +3639BERGERON CHRISTINE 21967 619951219940110668 9426.1852DSANS +5292CREGY MAURICE 11967 719940819930411389 9852.4952MANGL +8369BRENS COLETTE 21968 81991101990101330611017.4152CANGL +2447REBEYROLIE ANNIE 21968 619900319900911389 9851.0352MALLEM +0478MES CHRISTINE 21968 4199309199209 9597 8728.7152CSANS +2875CLION MARIE FRANCE 21968 319930519920511389 9852.4552CSANS +8148CROS FRANCOIS 11968 41988111987111249910472.7352MSANS +9990VERCINGETORIX CHRISTINE 21968 119950419930411389 9851.2852MSANS +2796BLONC JEAN PIERRE 11968 4199301199511 9597 8727.8152MSANS +9996GUIS LUCIEN 119681219931119920110024 8998.5352CSANS +7769NERVAL MICHELE 21968 41990051994011330611017.8352CSANS +6262RACINE ALAIN 11969 719890419880410407 9271.9552CSANS +9102SAUGES BENOIT 11969 11989071993081381911364.8152MSANS +4448NARON PASCAL LOUIS 11969 2199605199505 8656 8145.6952LSANS +3197CHAUMES GUY 11969 819930619920610024 8998.9452MSANS +2201LUYNES SOPHIE JOELLE 21969 5199311199211 9597 8728.2352CANGL +3000PLAINES JEAN MARC 1196910199204199312 7677 7604.9052CINFOR +7547BREGUIERES THERESE 21969 719920419910411389 9851.3352MANGL +9804CADOT MARIE JOSE 21969 81991101990101330611018.2252MSANS +5321JAUNAC SOPHIE 219691019910719900710024 8998.5852MSANS +3824LAVISSE DANIELLE 2196912199405199305 8359 7952.9252CSANS +6505LOUISE PIERRE 11969 419910119900110024 8999.8152CSANS +9873BOULOURI JEAN MICHEL 11969 71990021992091202810241.3652MSANS +9771BREUILHSUD THIERRY 11969 419910719900710024 8997.9652CCOMPT +8931ELVARD CLAUDE 11970 81994031993032107316096.9852MANGL +2755GEROME MAURICE 11970 8199311199212 9597 8728.9552MTECHN +8557CYRNOS BERNARD 11970 5199404199201 9597 8729.9052MSANS +3651COCTEAU GABRIEL 11970 41994011993011267210588.5352CSANS +4459VITALIS ALAIN 1197010199612199512 9894 8921.9152LSANS +9388COURTENAY JEAN JACQUES 11970 91990031995071202810241.1252MVENTE +1310CAILLADE ADRIEN 11970101996111995111616712994.7752CALLEM +5461GOMETZ CHRISTIANE 21970 61994071993071407611559.6252CSANS +0669MAUVALAT DANIELE 21970 6199209199109 9597 8728.7652MSANS +0103TAILLEFER MICHELINE 2197010199608199508 7803 7680.0552CSANS +5577MOUGINS CHANTAL 21970 619940919930411389 9852.6952CSANS +0340LAMBESC MARIE CHRISTINE 21970 3199607199507 7803 7680.6252CSANS +1328PIERRE PATRICE PAUL 1197111199106199006 8656 8145.0352.SANS +3172DENOUVAL DANIEL 11971 419940319920110024 8999.1652MSANS +9639ESPAON MARC 11971 7199407199307 9597 8727.7852CTECHN +6612FONTMERLE JOELLE 21971 919930419920411389 9850.8452CSANS +1855MAILLOL PIERRE 1197110199303199203 9597 8728.0452MSANS +8791RASTINES PHILIP 11971 81993011992011267210589.2852CSANS +2880FLORALIES MARIE THERESE 219711219930919920911389 9852.3352CINFOR +9921SERPENTINE FRANCOISE 21971 419920219910211389 9851.1652CVENTE +6761KING JACQUES 11971 5199606199401 9597 8729.9952CALLEM +8677BREANCON VERONIQUE 21971 919940819930810668 9425.7252MANGL +0030SUVERET PATRICK 1197110199501199304 9597 8728.6652MSANS +4284REGNAULT JEAN MARC 11971 719900619890610024 8999.3652CSANS +3275POMPIDOU DIDIER 11971 6199610199510 8656 8145.3352MSANS +7270BONNEUIL MARC 1197110199107199007 8656 8145.3052.SANS +2988DEREURE BRIGITTE 21971 8199606199506 8656 8145.8752CINFOR +0334GRAVESONN JEAN 119711119911019901010024 8997.7852CANGL +5425PONT FRANCOIS 11971111995041994041267210588.8852CSANS +7132MIDI JEAN PIERRE 11971 5199608199509 8656 8145.4852CANGL +5172BLOMET JEAN PIERRE 11971 81993061992061267210589.5252CSANS +1753QUIETA DOMINIQUE 11971 41991061995101202810241.7652MSANS +8062DOMINO MARC 11971 719910819900810024 8999.4052MSANS +8636ECLUZELLES MICHELE 21971 9199609199509 9894 8921.5952CSANS +5812REPUBLIQUE VERONIQUE 21972 31995101994101206910240.4052CSANS +0712TEYSSIERES MARTINE 21972 6199607199507 7803 7680.8952CSANS +3543DUNETTE LAURENCE 21972 4199608199508 8656 8145.9152MSANS +7967FOUCANCOURT ASTRID 21972 219930619951011389 9850.8852CSANS +6876THERESE MISAKO 21972 719940819930710668 9427.2652MSANS +9406GALLIEN MICHEL 11972 219910719900710024 8997.9052MSANS +7605BAUMES ALEXANDRA 11972 7199501199304 9597 8728.1952MALLEM +1625ARTHUISIERE JACQUES 11972 61995011994011206910240.6652CSANS +6717DOUMER PHILIPPE 1197212199611199401 9597 8728.8052CESP +1677CHABRIER LAURENT JEAN CLAUDE 1197211199504199404 9126 8456.3952CSANS +8299PUY JEAN 119721119931219940111389 9852.6352CANGL +8443COUSTERES MICHEL 11972 2199107199012 8656 8145.4452.SANS +7741NANT FREDERIC 11972 31991061994111202810240.7652MSANS +0657TAUDE FABRICE HENRI 11972 319940219930211389 9851.3752CANGL +9630GOELETTE JEAN LOUIS THIERRY 11972 4199407199307 9597 8728.1352CSANS +1127EXUPERY SIMONE 21972 5199602199502 9894 8921.4152CTECHN +6944LIBERTE CORINNE MARIE 21972 41993071993051267210589.5253CSANS +3755ARNAUD MARIE PIERRE 21972 6199307199207 9597 8729.3052MALLEM +2437CLAUSONNES MARTINE 2197212199411199311 9126 8457.1152MSANS +2896LUNA NADINE MARIE 21972 8199308199208 9597 8728.3252CTECHN +1758KARU LILIANE 21972 3199207199107 9597 8729.7452CINFOR +5392FER RADHIA 21972 3199210199106 8359 7952.9152.SANS +9857EGLISE CLAIRE 21972 7199402199302 9126 8457.1152CSANS +6707INKERMANN GERARD 119731219951119941110668 9426.5952CSANS +4728ESTANISLAO ERIC 11973 1199608199508 7803 7680.7752CSANS +6566GOULAIN BRIGITTE 21973121994121993121206910240.7753CESP +0727PUY THERESE 2197311199610199510 8656 8145.6552LTECHN +0980ARGENTIERE GILLES 1197311199406199306 9126 8456.1552CANGL +4718DOMOY MICHEL 11973 219940819930811389 9852.0052CSANS +0216CALAIS FREDERIQUE 21973 219930919920911389 9850.6152MVENTE +2997FOIRAIL COLAS JEAN LOUP 11973 1199604199504 8656 8145.4852CINFOR +5877EPI LUC 11973 5199308199208 9597 8729.3052CANGL +0287CARTIER JEAN LUC 11973 7199511199411 9894 8923.3852CTECHN +7891MOUSTRAN PAUL 11973 2199303199203 9597 8729.8452CSANS +3815ELYSEE LOUIS 1197311199304199204 9597 8728.6652CSANS +0959REPUBLIQUE ERICK 11973 619930719951111389 9852.2752CESP +2490GLENANS PHILIPPE 11973 41995101994101206910241.8452CSANS +6935PAYRAC JEAN JACQUES 11973 9199310199210 9597 8729.2252MSANS +8784JACQUET FREDERICK 11973 319930919920911389 9852.2452CINFOR +7986COUCHANT YOLANDE 2197312199608199508 7803 7679.4652CALLEM +1549DRYADES PIERRE G 11973 9199408199307 9126 8456.7052CSANS +0968OPIO SYLVIE 21974 6199606199506 8656 8145.3852CSANS +0353DELATTRE FREDERIQUE 21974 9199603199503 8656 8145.8052CINFOR +1122ACACIAS SERGE 11974101995101994101206910240.9452CTECHN +9008MANOIR DANIEL R 11974 9199606199506 9894 8921.4052CSANS +3650AIRES FERNANDO 11974 7199407199307 8656 8146.2552CSANS +7799TOUR JEAN PIERRE 11974 3199508199408 9126 8456.3752CSANS +4614VILLERS CHRISTIAN 11974 119951119941110668 9427.4752CSANS +6384SEURAT JEAN JACQUES 11974 1199504199404 9126 8457.4952CSANS +0504MEYRIN MICHEL 11974 8199607199507 7803 7679.3752CTECHN +3076TAMARIS THIERRY 1197411199405199305 9126 8457.7452CALLEM +5273CAYES PHILIPPE NICOLAS 11974 2199308199208 9597 8729.3452CALLEM +9558BATOUCH PAUL 11974 6199606199506 8656 8145.2452CSANS +6082PEDRO GERARD 11974 6199607199507 7803 7680.3252CSANS +4712CIDEX NICOLE 21974 9199607199507 7803 7680.0052CALLEM +7982VILAR MICHELINE 21974 9199604199504 9894 8921.4052CALLEM +0377RIBE MARTINE 2197411199609199509 8656 8146.6152CVENTE +1910AUBE DOMINIQUE 21974 3199610199510 8656 8146.0152CANGL +1632COURTAU MARIE JOSEE 21974 8199609199509 7803 7679.6352CSANS +0616HIIS BEATRICE 21974 919930919920911389 9850.9852MSANS +5825TIREUSES MARIE FRANCOISE 2197512199609199509 7803 7680.7152CANGL +8598SAND CHRISTIANE 2197511199607199507 9894 8922.0552CSANS +9425VISA GILLES 11975 319951119950211389 9851.7452CALLEM +8440EYGAUX LAURENT 11975 6199603199507 9894 8922.1652CSANS +3240BARBUSSE JEAN PIERRE 11975 6199510199410 8656 8146.2552CANGL +7022LOUPS DOMINIQUE 11975 3199605199505 8656 8146.7752CSANS +3687SULTZER MARYLINE 21975 8199607199507 7803 7681.1752CTECHN +3649TROIS ANGELICA 2197511199608199508 8656 8147.0652CSANS +8797BELHAITRE RENE 11975 4199409199309 9126 8455.7652CSANS +3401SOURCE PAUL 11975 2199612199512 9894 8921.4152CANGL +0533JOUFFROY LUCIENNE 2197511199608199508 9894 8922.0052CTECHN +4412CAPEAU MONIQUE 21976 1199607199507 7803 7680.6252CINFOR +9518COCULOT HELENE 21976 8199508199408 7803 7681.2952CSANS +1220VALLOIS ALAIN 11976 7199607199507 7803 7680.1852CANGL +7054DANGALYS MARTINE 2197712199607199507 7803 7680.7752CSANS +5515MARNE GHISLAINE 21977 6199607199507 7803 7680.0552CSANS +2958CLAIR GISELE 21977 8199608199508 7803 7680.6352CANGL +5379CONCHES DOMINIQUE 21977 6199607199507 7803 7679.4652CANGL +9250DECHAMBRE MICHEL 11977 8199607199507 7803 7679.4552CSANS +7969SALEON ALAIN 11977 8199607199507 7803 7679.3652CANGL +0131EOLE ROXANE RENEE 2197710199607199507 7803 7679.2852CANGL +9710OUEST HENRIE MARCEL 11979 2199607199507 7464 7525.1452CINFOR +0487PRIEUR JEAN FRANCOIS 11956 81983041982041684813423.3153MSANS +7696BELVEDERE XAVIER 11962 81982071995091450311830.6753MINFOR +2063LIOURA PASCAL JEAN 11964 41986111995082256617145.7853MANGL +7927TRAVERSIERE JEAN PIERRE 11965111986081995091450311832.1553MCOMPT +2549VASCO DANIEL 11968 51990091995111450311832.1453MANGL +2675RESIDENCE JEAN MARC 11969 21995111994111450311831.3453CANGL +8649VIGIER OLIVIER 11969 8199612199512 4638 5819.0153MSANS +7524BEDOK STEPHANE AUGUSTE 11969 51995121994121450311832.5653CSANS +3056FRANCE MARION 21971 61996091995091450311831.7553CSANS +9905CORNICHE DANIEL 11972 31996091995091450311832.2057CSANS +4894PORTE RONAN JEAN PIERRE 11972121993091992091450311831.9353CSANS +6471SUCCURSALE LAURE MARIE 21972 71996091995091450311832.1854CALLEM +8530TOURS ANNE YVONNE 21973 31995121994121450311832.3854CSANS +4004MORTON JEAN CLAUDE 11965 81992031991031965617846.6854CANGL +4099MONTELIER DENIS 11971 519940819930811389 9851.1257MSANS +9423CHATEAU CARL 11956 51980091992121471512024.3958MSANS +2026BERT CLAUDE 21957 51979031986021497412181.1158MALLEM +0951MERAY MARIE HELENE 21964 61990051989051249910472.7058MTECHN +5282PINEL LILIANE 21948 71977031992011471512024.4859MINFOR +5545DOM ANNIE 21960121982091995061638413150.2959DSANS +4161BOIS ANNICK 21960 81983021982021326611016.2459MSANS +1624LORRAINE CHRISTIAN 11961 41983081991012781920674.8359MSANS +0982VEYANS MICHEL 11961 21982091991092529918968.7059MINFOR +0123LOCARNO ANNE MARIE 2197411199402199302 8359 7953.1159MSANS +7957AVAUX PHILIPPE 11942 51963041991072273717261.4960CCOMPT +0611SAUVAN JEAN FRANCOIS 11946 71980111994011471512025.0260MTECHN +8634MONTGAZIN ANDRE 11950121974061991012137316331.7560MALLEM +3872AZUR JEAN CLAUDE 11951101970101990101932314935.1760MMICRO +7401PARC PIERRE 11952 91989011994011288210745.9360MSANS +8111STADE BERNARD 11953 21983021984051249910473.4960MANGL +8795MOTU JEAN LUC 11959 81979101994011578112722.8260MSANS +2118BAUDETS MARIE CHRISTINE 21961 31983011982011608112915.3560MTECHN +8422WIEHN BRUNO 11963121988061992021249910472.6660MANGL +3871SOLE MARTINE 219661019910919950510876 9503.4760MINFOR +6169CUOQ CORINNE BRIGITTE 21967 21989121995071249910472.2560MANGL +2571BARAT MARTINE 21968 81994061996012303517377.3560CSANS +4114HOURTINS DOMINIQUE 11977 1199608199508 7803 7680.5960CANGL +1079GUEN HELENE 219391219820419810411131 9657.7561MSANS +0830EGLY DANIELLE 21950 1199406199306 9126 8457.4261MSANS +1903GENEVIEVE HARDY 11953 91978111989112256617146.1661MINFOR +9550INGERSHEIM PHILIPPE 11961 61982041987041608112917.1961MANGL +3284BELLETRUD JEAN 11950 61977101993121369311287.2363MALLEM +2911SOUBISE IVAN 11958 71982031992112529918967.7663MTECHN +5851CREACH FRANCOIS 21963 9199608199508 7803 7680.0863MSANS +6333DUPARCHY LILIANE 21973 3199406199306 9894 8921.6763CSANS +1729CURAT ROBERT 11935 91958051994123417325098.2464MSANS +7436CHALLONNIERE VALERIE 21941 41962041989012137316332.3664MSANS +6301BLUM CHANTAL 21943 71969071991051932314935.2664MSANS +7026SARRETTE MICHEL 11946 21991011990013200223583.2364.ANGL +0646MARIE BRIGITTE 21950111971011992061834514275.6164DMANAG +1101ENFANTS ANTOINETTE 21955 61981011995011527112373.9164MANGL +8770RACHERET LAURENCE 21956 71978061993051608112916.8864MANGL +4751LIONS DAVID 11958 91980071993092090215981.1464MANGL +9291SOULEYAS DOMINIQUE 11958 11980011992101911114779.7764MANGL +2505LUCHON JACQUELINE 21958 21989011993041249910473.4964MSANS +8607VOLVESTRE ELISABETH 21958 11991111990111249910472.9764SALLEM +1586PESSAC JEAN YVES 11961 21989051988051949415050.2864CSANS +5341RIOU ROBERT 11962 61985091993011949415052.4365MCOMPT +8946MOULINET ANNE 21962 81983041982041608112915.6064MSANS +5619MARCQ MONIQUE 21963101995101994101206910241.3064MSANS +8989JUZAN CLAUDE 11965101990091994092401918075.4464CANGL +0763PERAULT CHANTAL 21965 21986041985041527112373.5364MSANS +1526JEREZ NICOLE 21967 519911219920111389 9851.6164.ALLEM +2211KELLERMANN FREDERIQUE 21967 91991111990111202810241.9764MSANS +4302KERCADORET DOMINIQUE 11971 81994071993071206910240.2364CSANS +1236PALETTE ROSE MAY 21971 91994031993031267210588.9264CSANS +8225SEROT MARTINE 21972 11992061992031330611017.7065CALLEM +5326DRAGUIGNAN FRANCOISE 21972 519930619920611389 9852.0564MTECHN +5970DANUBE PHILIPPE 11974 11994071993071206910240.4965CSANS +6556BROUILLET ANTOINE 11937 11986101986012687820055.0565.SANS +1186AOUT JEAN JACQUES 11937 21987011986012431618272.0165.COMPT +7999PIERREFONDS STEPHANE 11938 31964051994011663613342.7665MINFOR +1312GRENOUILLERE PHILIPPE 11939 71964101987016400345693.2465MALLEM +0460MARRONNIERS GERARD 11942 41961061994113587826261.7965MINFOR +4154LOUIS PHILIPPE 11942121965101993012739020403.3065MVENTE +3603MUETTE GEORGES CHARLES 11942 41968071992013844228044.8465MANGL +8992COUDREE PASCAL 11943 91968031988072273717260.3265MSANS +9382CONSTANCE MADELEINE 21944 519830619860211131 9657.1265VSANS +0255MARTINIQUE GERARD 11946 31994121993123882428316.7365MSANS +8195EXELMANS BERNARD 11946 91984051984111215710278.1665MVENTE +3879GOUT JACQUES 11947 51968121992122470018540.5765MSANS +9678HETRES VIANNEY 11947 91968091994094121428006.1765MALLEM +6027STRASBOURD JEAN CLAUDE 11951 21972101987052470018540.1565MALLEM +7805BESSIERES JEAN 11952 51973031988112334017609.4265MSANS +7152REUILLY ANNE 21953 91974071993121471512024.5665MINFOR +4995BERCHET FRANCOISE 2195412199306199206 8656 8145.6065MMANAG +1933ERMITAGE JEAN CLAUDE 11955 11991031994021249910471.6165MSANS +0728VOISEMBERT ISABELLE 21955 61976011991011471512024.2165MSANS +0718CERNAY MARC JEAN MARIE 11959 11988011987013669126843.7365.SANS +2726ORDENER MARIE FRANCOISE 21959 21980071991101369311287.9765MSANS +0225PLELO PHILIPPE 119591119800319790311389 9851.3365MSANS +0630GOBELINS BERNARD 11959 71981031991012781920674.6165MTECHN +1138ISARDS ELIANE 21960 21988101990042581519316.5865.SANS +8716TOURELLES JOSETTE 21961 81983041989112090215980.4365DANGL +3837CONTAMINES ANNIE 21961 81984121992061527112373.2265MANGL +0223FOUSSEAU DOMINIQUE 21961 21996071995082005015476.6165DINFOR +8553OUSTALADO PIERRE 11962 61984011993121326611017.7265MSANS +1723HIGH MURIEL 21962 71983011982011608112917.1865MSANS +2779PLAT MICHEL 11963121984051993102401918074.6765CANGL +7160BOILEAU DENIS 11964111985031990111949415051.9565MANGL +1054MARINET CRISTOFORO 11964101985091993092401918076.4465MALLEM +0034ANGELY JEAN PIERRE 11965 31988081991121249910473.3265MINFOR +0684DIEUDONNE CORINNE 21965101988121987121249910473.7465MSANS +4943SICARD DOMINIQUE 21966 919931019921010363 9233.2765MINFOR +8211CARLE PATRICK 11966 31994011993011621213033.5665MALLEM +1276GREFFIER SERGE 11967 119930619940110024 8999.1365CSANS +5313BIARRITZ CHRISTINE 21967 91990111991012602319433.9065.ALLEM +5161DUBOC NICOLE 219671219880119870111302 9774.4865MANGL +1515SABLEAUX REGINE 21969 71993011992011839014313.2665MSANS +7518LANORVILLE JEAN DAVID ALBERT 119701219960519950511389 9851.7065CSANS +6488CATALAGNE PHILIPPE 11970 71996101995101706413577.4365CSANS +8039LAURENS PATRICIA 21971111993031995011557012567.4165.SANS +7894PEPINIERE MARIE ANNE 21971 41991111991111723313653.7565MSANS +9988MEN JACQUES 11972 71994061993061420611638.1665CANGL +0742TOUTES JEAN FRANCOIS 11972 71993031992031420611637.6665CANGL +3618FREDISANE BRUNO 119751019960619950611389 9852.5465CANGL +7403AUGUSTINES ERICK 11937 61988031987024330331419.2172.ALLEM +7418PATRICIA JEAN CLAUDE 11944 71990071993011369311286.2072.SANS +9902CORSE MARIE JOSE 21958 41988101983101326611018.1872.INFOR +1972FLANDRIN CATHERINE 21963121988101983101288210744.3772.SANS +6223BEAR MICHELINE 21963 51989061992031450311831.6972.SANS +1899CHEVILLY ISABELLE 21963 71989011992061450311832.7272MTECHN +1131BLAISE MIHOKO 21963101990011991061450311831.0372.SANS +7170AIGUEBONNE MARIE 21971 11995101994101206910241.9972CSANS +0384LAMBESC ALBERT 11973 119901019920110024 8999.7672.TECHN +4786VIGEN EVELYNE 21939121962121990102273717261.1873MINFOR +5969COTE MIDORI 21946121994101993102334017610.5973MSANS +6378MYOSOTIS YVES 11949 31992011994113844228045.8873.SANS +3664MAREUIL NADINE 21966 21989061989111288210744.8673.SANS +8858EANOLIAS JACQUELINE 21949 51977071991121911114778.7075CSANS +1090LORETTE YVES ANDRE 11950 61971081995013587826261.5875MSANS +3800KOUTIO ALAIN 11961 91982121989052090215980.3975MINFOR +5591PALALDA MARC 11965 81995061994061267210590.3275MSANS diff --git a/storage/connect/mysql-test/connect/std_data/expenses.txt b/storage/connect/mysql-test/connect/std_data/expenses.txt index 66a94edbb9a..049f132dd5e 100644 --- a/storage/connect/mysql-test/connect/std_data/expenses.txt +++ b/storage/connect/mysql-test/connect/std_data/expenses.txt @@ -1,24 +1,24 @@ -Joe 3Beer 18.00 -Beth 4Food 17.00 -Janet 5Beer 14.00 -Joe 3Food 12.00 -Joe 4Beer 19.00 -Janet 5Car 12.00 -Joe 3Food 19.00 -Beth 4Beer 15.00 -Janet 5Beer 19.00 -Joe 3Car 20.00 -Joe 4Beer 16.00 -Beth 5Food 12.00 -Beth 3Beer 16.00 -Joe 4Food 17.00 -Joe 5Beer 14.00 -Janet 3Car 19.00 -Joe 4Food 17.00 -Beth 5Beer 20.00 -Janet 3Food 18.00 -Joe 4Beer 14.00 -Joe 5Food 12.00 -Janet 3Beer 18.00 -Janet 4Car 17.00 -Janet 5Food 12.00 +Joe 3Beer 18.00 +Beth 4Food 17.00 +Janet 5Beer 14.00 +Joe 3Food 12.00 +Joe 4Beer 19.00 +Janet 5Car 12.00 +Joe 3Food 19.00 +Beth 4Beer 15.00 +Janet 5Beer 19.00 +Joe 3Car 20.00 +Joe 4Beer 16.00 +Beth 5Food 12.00 +Beth 3Beer 16.00 +Joe 4Food 17.00 +Joe 5Beer 14.00 +Janet 3Car 19.00 +Joe 4Food 17.00 +Beth 5Beer 20.00 +Janet 3Food 18.00 +Joe 4Beer 14.00 +Joe 5Food 12.00 +Janet 3Beer 18.00 +Janet 4Car 17.00 +Janet 5Food 12.00 diff --git a/storage/connect/mysql-test/connect/std_data/sexe.csv b/storage/connect/mysql-test/connect/std_data/sexe.csv index 37d63169133..7e5d3ec93cd 100644 --- a/storage/connect/mysql-test/connect/std_data/sexe.csv +++ b/storage/connect/mysql-test/connect/std_data/sexe.csv @@ -1,3 +1,3 @@ -0;Inconnu -1;Masculin -2;Feminin +0;Inconnu +1;Masculin +2;Feminin diff --git a/storage/connect/mysql-test/connect/std_data/sitmat.csv b/storage/connect/mysql-test/connect/std_data/sitmat.csv index e93f121a839..a5178ed2c76 100644 --- a/storage/connect/mysql-test/connect/std_data/sitmat.csv +++ b/storage/connect/mysql-test/connect/std_data/sitmat.csv @@ -1,7 +1,7 @@ -.;Inconnu -C;Celibataire -D;Divorce -L;Union libre -M;Marie -S;Separe -V;Veuf +.;Inconnu +C;Celibataire +D;Divorce +L;Union libre +M;Marie +S;Separe +V;Veuf diff --git a/storage/connect/mysql-test/connect/t/alter.test b/storage/connect/mysql-test/connect/t/alter.test index 49f34996bbd..0eda6355027 100644 --- a/storage/connect/mysql-test/connect/t/alter.test +++ b/storage/connect/mysql-test/connect/t/alter.test @@ -1,139 +1,139 @@ -let $MYSQLD_DATADIR= `select @@datadir`; - ---echo # ---echo # Testing indexing with ALTER on inward table (in-place) ---echo # -CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT; -INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); -SELECT * FROM t1; -CREATE INDEX xc ON t1(c); -DESCRIBE SELECT * FROM t1 WHERE c = 2; -DROP INDEX xc ON t1; -CREATE INDEX xd ON t1(d); -DROP INDEX xd ON t1; -ALTER TABLE t1 ADD INDEX xc (c), ADD INDEX xd (d); -SHOW INDEX FROM t1; -ALTER TABLE t1 DROP INDEX xc, DROP INDEX xd; -SHOW INDEX FROM t1; - ---echo # ---echo # Testing modifying columns inward table (not in-place) ---echo # -ALTER TABLE t1 MODIFY COLUMN c CHAR(5) NOT NULL; -SHOW CREATE TABLE t1; -SELECT * FROM t1; -ALTER TABLE t1 MODIFY COLUMN c INT NOT NULL; - ---echo # ---echo # Fails because indexing must be in-place ---echo # ---error ER_ALTER_OPERATION_NOT_SUPPORTED -ALTER TABLE t1 MODIFY COLUMN c CHAR(10) NOT NULL, ADD INDEX xd (d); - ---echo # ---echo # Testing changing table type (not in-place) ---echo # -ALTER TABLE t1 TABLE_TYPE=CSV HEADER=1 QUOTED=1; -SELECT * FROM t1; -SHOW CREATE TABLE t1; - ---echo # create an outward table used to see the t1 file -CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.csv'; -SELECT * FROM t2; - ---echo # ---echo # Testing changing engine ---echo # -DROP TABLE t1; -CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT; -INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); -ALTER TABLE t1 ADD INDEX xc (c), ADD INDEX xd (d); -ALTER TABLE t1 ENGINE = MYISAM; -SHOW CREATE TABLE t1; -SHOW INDEX FROM t1; -SELECT * FROM t1; -ALTER TABLE t1 ENGINE = CONNECT TABLE_TYPE=DBF; -SHOW CREATE TABLE t1; -SHOW INDEX FROM t1; -SELECT * FROM t1; -DROP TABLE t1, t2; - ---echo # ---echo # Testing ALTER on outward tables ---echo # -CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='tf1.txt' ENDING=1; -INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); -SELECT * FROM t1; -CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='tf1.txt'; -SELECT * FROM t2; - ---echo # ---echo # Indexing works the same ---echo # -ALTER TABLE t1 ADD INDEX xc (c), ADD INDEX xd (d); -SHOW INDEX FROM t1; -SELECT d FROM t1 WHERE c = 2; -ALTER TABLE t1 DROP INDEX xc, DROP INDEX xd; -SHOW INDEX FROM t1; - ---echo # ---echo # Other alterations do not modify the file ---echo # -ALTER TABLE t1 MODIFY COLUMN c CHAR(5) NOT NULL; -SELECT * FROM t2; -SHOW CREATE TABLE t1; -#Wrong result ---error ER_GET_ERRMSG -SELECT * FROM t1; -ALTER TABLE t1 MODIFY COLUMN c INT NOT NULL; - ---echo # ---echo # Changing column order ---echo # -ALTER TABLE t1 MODIFY COLUMN c INT NOT NULL AFTER d; -SELECT * FROM t2; -SHOW CREATE TABLE t1; ---echo # Wrong result -SELECT * FROM t1; -ALTER TABLE t1 MODIFY COLUMN c INT NOT NULL FIRST; ---echo # What should have been done -ALTER TABLE t1 MODIFY c INT NOT NULL FLAG=0 AFTER d, MODIFY d CHAR(10) NOT NULL FLAG=11; -SHOW CREATE TABLE t1; -SELECT * FROM t1; - ---echo # ---echo # Changing to another engine is Ok ---echo # However, the data file is not deleted. ---echo # -ALTER TABLE t1 ENGINE=ARIA; -SHOW CREATE TABLE t1; -set @old_sql_mode=@@sql_mode; -set sql_mode=ignore_bad_table_options; -SHOW CREATE TABLE t1; -set sql_mode=@old_sql_mode; -SELECT * from t1; -SELECT * from t2; - ---echo # ---echo # Changing back to CONNECT fails ---echo # Sure enough, the data file was not deleted. ---echo # ---error ER_UNKNOWN_ERROR -ALTER TABLE t1 ENGINE=CONNECT; - ---echo # ---echo # But changing back to CONNECT succeed ---echo # if the data file does not exist. ---echo # ---remove_file $MYSQLD_DATADIR/test/tf1.txt -ALTER TABLE t1 ENGINE=CONNECT; -SHOW CREATE TABLE t1; -SELECT * from t1; -SELECT * from t2; - -DROP TABLE t1, t2; - -# -# Clean up -# ---remove_file $MYSQLD_DATADIR/test/tf1.txt +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # +--echo # Testing indexing with ALTER on inward table (in-place) +--echo # +CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT; +INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); +SELECT * FROM t1; +CREATE INDEX xc ON t1(c); +DESCRIBE SELECT * FROM t1 WHERE c = 2; +DROP INDEX xc ON t1; +CREATE INDEX xd ON t1(d); +DROP INDEX xd ON t1; +ALTER TABLE t1 ADD INDEX xc (c), ADD INDEX xd (d); +SHOW INDEX FROM t1; +ALTER TABLE t1 DROP INDEX xc, DROP INDEX xd; +SHOW INDEX FROM t1; + +--echo # +--echo # Testing modifying columns inward table (not in-place) +--echo # +ALTER TABLE t1 MODIFY COLUMN c CHAR(5) NOT NULL; +SHOW CREATE TABLE t1; +SELECT * FROM t1; +ALTER TABLE t1 MODIFY COLUMN c INT NOT NULL; + +--echo # +--echo # Fails because indexing must be in-place +--echo # +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER TABLE t1 MODIFY COLUMN c CHAR(10) NOT NULL, ADD INDEX xd (d); + +--echo # +--echo # Testing changing table type (not in-place) +--echo # +ALTER TABLE t1 TABLE_TYPE=CSV HEADER=1 QUOTED=1; +SELECT * FROM t1; +SHOW CREATE TABLE t1; + +--echo # create an outward table used to see the t1 file +CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.csv'; +SELECT * FROM t2; + +--echo # +--echo # Testing changing engine +--echo # +DROP TABLE t1; +CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT; +INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); +ALTER TABLE t1 ADD INDEX xc (c), ADD INDEX xd (d); +ALTER TABLE t1 ENGINE = MYISAM; +SHOW CREATE TABLE t1; +SHOW INDEX FROM t1; +SELECT * FROM t1; +ALTER TABLE t1 ENGINE = CONNECT TABLE_TYPE=DBF; +SHOW CREATE TABLE t1; +SHOW INDEX FROM t1; +SELECT * FROM t1; +DROP TABLE t1, t2; + +--echo # +--echo # Testing ALTER on outward tables +--echo # +CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=fix FILE_NAME='tf1.txt' ENDING=1; +INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); +SELECT * FROM t1; +CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='tf1.txt'; +SELECT * FROM t2; + +--echo # +--echo # Indexing works the same +--echo # +ALTER TABLE t1 ADD INDEX xc (c), ADD INDEX xd (d); +SHOW INDEX FROM t1; +SELECT d FROM t1 WHERE c = 2; +ALTER TABLE t1 DROP INDEX xc, DROP INDEX xd; +SHOW INDEX FROM t1; + +--echo # +--echo # Other alterations do not modify the file +--echo # +ALTER TABLE t1 MODIFY COLUMN c CHAR(5) NOT NULL; +SELECT * FROM t2; +SHOW CREATE TABLE t1; +#Wrong result +--error ER_GET_ERRMSG +SELECT * FROM t1; +ALTER TABLE t1 MODIFY COLUMN c INT NOT NULL; + +--echo # +--echo # Changing column order +--echo # +ALTER TABLE t1 MODIFY COLUMN c INT NOT NULL AFTER d; +SELECT * FROM t2; +SHOW CREATE TABLE t1; +--echo # Wrong result +SELECT * FROM t1; +ALTER TABLE t1 MODIFY COLUMN c INT NOT NULL FIRST; +--echo # What should have been done +ALTER TABLE t1 MODIFY c INT NOT NULL FLAG=0 AFTER d, MODIFY d CHAR(10) NOT NULL FLAG=11; +SHOW CREATE TABLE t1; +SELECT * FROM t1; + +--echo # +--echo # Changing to another engine is Ok +--echo # However, the data file is not deleted. +--echo # +ALTER TABLE t1 ENGINE=ARIA; +SHOW CREATE TABLE t1; +set @old_sql_mode=@@sql_mode; +set sql_mode=ignore_bad_table_options; +SHOW CREATE TABLE t1; +set sql_mode=@old_sql_mode; +SELECT * from t1; +SELECT * from t2; + +--echo # +--echo # Changing back to CONNECT fails +--echo # Sure enough, the data file was not deleted. +--echo # +--error ER_UNKNOWN_ERROR +ALTER TABLE t1 ENGINE=CONNECT; + +--echo # +--echo # But changing back to CONNECT succeed +--echo # if the data file does not exist. +--echo # +--remove_file $MYSQLD_DATADIR/test/tf1.txt +ALTER TABLE t1 ENGINE=CONNECT; +SHOW CREATE TABLE t1; +SELECT * from t1; +SELECT * from t2; + +DROP TABLE t1, t2; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/tf1.txt diff --git a/storage/connect/mysql-test/connect/t/alter_xml.test b/storage/connect/mysql-test/connect/t/alter_xml.test index decf5e76cdf..0b876296e58 100644 --- a/storage/connect/mysql-test/connect/t/alter_xml.test +++ b/storage/connect/mysql-test/connect/t/alter_xml.test @@ -1,29 +1,29 @@ ---source have_libxml2.inc - ---echo # ---echo # Testing changing table type (not in-place) ---echo # -CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1 QUOTED=1; -INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); -SELECT * FROM t1; - ---echo # This would fail if the top node name is not specified. ---echo # This is because the XML top node name defaults to the table name. ---echo # Sure enough the temporary table name begins with '#' and is rejected by XML. ---echo # Therefore the top node name must be specified (along with the row nodes name). -ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='rownode=row'; -SELECT * FROM t1; -SHOW CREATE TABLE t1; - ---echo # Let us see the XML file -CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.xml'; -SELECT * FROM t2; ---echo # NOTE: The first (ignored) row is due to the remaining HEADER=1 option. - ---echo # Testing field option modification -ALTER TABLE t1 MODIFY d CHAR(10) NOT NULL FIELD_FORMAT='@', HEADER=0; -SELECT * FROM t1; -SHOW CREATE TABLE t1; -SELECT * FROM t2; - -DROP TABLE t1, t2; +--source have_libxml2.inc + +--echo # +--echo # Testing changing table type (not in-place) +--echo # +CREATE TABLE t1 (c INT NOT NULL, d CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1 QUOTED=1; +INSERT INTO t1 VALUES (1,'One'), (2,'Two'), (3,'Three'); +SELECT * FROM t1; + +--echo # This would fail if the top node name is not specified. +--echo # This is because the XML top node name defaults to the table name. +--echo # Sure enough the temporary table name begins with '#' and is rejected by XML. +--echo # Therefore the top node name must be specified (along with the row nodes name). +ALTER TABLE t1 TABLE_TYPE=XML TABNAME=t1 OPTION_LIST='rownode=row'; +SELECT * FROM t1; +SHOW CREATE TABLE t1; + +--echo # Let us see the XML file +CREATE TABLE t2 (line VARCHAR(100) NOT NULL) ENGINE=CONNECT FILE_NAME='t1.xml'; +SELECT * FROM t2; +--echo # NOTE: The first (ignored) row is due to the remaining HEADER=1 option. + +--echo # Testing field option modification +ALTER TABLE t1 MODIFY d CHAR(10) NOT NULL FIELD_FORMAT='@', HEADER=0; +SELECT * FROM t1; +SHOW CREATE TABLE t1; +SELECT * FROM t2; + +DROP TABLE t1, t2; diff --git a/storage/connect/mysql-test/connect/t/bin.test b/storage/connect/mysql-test/connect/t/bin.test index 6ef0ffc75ec..e9d1ad58c37 100644 --- a/storage/connect/mysql-test/connect/t/bin.test +++ b/storage/connect/mysql-test/connect/t/bin.test @@ -1,77 +1,77 @@ -let $MYSQLD_DATADIR= `select @@datadir`; - ---copy_file $MTR_SUITE_DIR/std_data/Testbal.dat $MYSQLD_DATADIR/test/Testbal.dat - ---echo # ---echo # Testing errors ---echo # -CREATE TABLE t1 -( - ID INT NOT NULL -) Engine=CONNECT TABLE_TYPE=BIN FILE_NAME='nonexistent.txt'; ---replace_regex /on .*test.nonexistent.txt/on DATADIR\/test\/nonexistent.txt/ -# TODO: check why this is needed for Windows ---replace_result Open(rt) Open(rb) -SELECT * FROM t1; -DROP TABLE t1; - -SET time_zone='+00:00'; -CREATE TABLE t1 -( - fig INT(4) NOT NULL FIELD_FORMAT='C', - name CHAR(10) not null, - birth DATE NOT NULL, - id CHAR(5) NOT NULL FIELD_FORMAT='S', - salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', - dept INT(4) NOT NULL FIELD_FORMAT='S' -) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat'; -SELECT * FROM t1; - ---error ER_GET_ERRMSG -INSERT INTO t1 VALUES (55555,'RONALD','1980-02-26','3333',4444.44,555); -INSERT INTO t1 VALUES (5555,'RONALD','1980-02-26','3333',4444.44,555); -SELECT * FROM t1; - -DROP TABLE t1; - ---echo # ---echo # Testing READONLY tables ---echo # -CREATE TABLE t1 -( - fig INT(4) NOT NULL FIELD_FORMAT='C', - name CHAR(10) not null, - birth DATE NOT NULL, - id CHAR(5) NOT NULL FIELD_FORMAT='S', - salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', - dept INT(4) NOT NULL FIELD_FORMAT='S' -) ENGINE=CONNECT TABLE_TYPE=BIN READONLY=Yes FILE_NAME='Testbal.dat'; ---error ER_OPEN_AS_READONLY -INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); -ALTER TABLE t1 READONLY=NO; -SHOW CREATE TABLE t1; -INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); -SELECT * FROM t1; -ALTER TABLE t1 READONLY=YES; -SHOW CREATE TABLE t1; ---error ER_OPEN_AS_READONLY -INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); -DROP TABLE t1; - - ---echo # ---echo # Testing that the underlying file is created ---echo # -CREATE TABLE t1 -( - c CHAR(4) NOT NULL FIELD_FORMAT='C' -) ENGINE=CONNECT TABLE_TYPE=BIN FILE_NAME='bin2.dat'; -INSERT INTO t1 VALUES (10),(20),(300),(4000); -SELECT * FROM t1; -DROP TABLE t1; - -# -# Clean up -# ---remove_file $MYSQLD_DATADIR/test/Testbal.dat ---remove_file $MYSQLD_DATADIR/test/bin2.dat +let $MYSQLD_DATADIR= `select @@datadir`; + +--copy_file $MTR_SUITE_DIR/std_data/Testbal.dat $MYSQLD_DATADIR/test/Testbal.dat + +--echo # +--echo # Testing errors +--echo # +CREATE TABLE t1 +( + ID INT NOT NULL +) Engine=CONNECT TABLE_TYPE=BIN FILE_NAME='nonexistent.txt'; +--replace_regex /on .*test.nonexistent.txt/on DATADIR\/test\/nonexistent.txt/ +# TODO: check why this is needed for Windows +--replace_result Open(rt) Open(rb) +SELECT * FROM t1; +DROP TABLE t1; + +SET time_zone='+00:00'; +CREATE TABLE t1 +( + fig INT(4) NOT NULL FIELD_FORMAT='C', + name CHAR(10) NOT NULL, + birth DATE NOT NULL FIELD_FORMAT='L', + id CHAR(5) NOT NULL FIELD_FORMAT='L2', + salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', + dept INT(4) NOT NULL FIELD_FORMAT='L2' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat'; +SELECT * FROM t1; + +--error ER_GET_ERRMSG +INSERT INTO t1 VALUES (55555,'RONALD','1980-02-26','3333',4444.44,555); +INSERT INTO t1 VALUES (5555,'RONALD','1980-02-26','3333',4444.44,555); +SELECT * FROM t1; + +DROP TABLE t1; + +--echo # +--echo # Testing READONLY tables +--echo # +CREATE TABLE t1 +( + fig INT(4) NOT NULL FIELD_FORMAT='C', + name CHAR(10) NOT NULL, + birth DATE NOT NULL FIELD_FORMAT='L', + id CHAR(5) NOT NULL FIELD_FORMAT='L2', + salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', + dept INT(4) NOT NULL FIELD_FORMAT='L2' +) ENGINE=CONNECT TABLE_TYPE=BIN READONLY=Yes FILE_NAME='Testbal.dat'; +--error ER_OPEN_AS_READONLY +INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); +ALTER TABLE t1 READONLY=NO; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); +SELECT * FROM t1; +ALTER TABLE t1 READONLY=YES; +SHOW CREATE TABLE t1; +--error ER_OPEN_AS_READONLY +INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); +DROP TABLE t1; + + +--echo # +--echo # Testing that the underlying file is created +--echo # +CREATE TABLE t1 +( + c CHAR(4) NOT NULL FIELD_FORMAT='C' +) ENGINE=CONNECT TABLE_TYPE=BIN FILE_NAME='bin2.dat'; +INSERT INTO t1 VALUES (10),(20),(300),(4000); +SELECT * FROM t1; +DROP TABLE t1; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/Testbal.dat +--remove_file $MYSQLD_DATADIR/test/bin2.dat diff --git a/storage/connect/mysql-test/connect/t/datest.test b/storage/connect/mysql-test/connect/t/datest.test index a986ce15a80..7fe5fcea8ff 100644 --- a/storage/connect/mysql-test/connect/t/datest.test +++ b/storage/connect/mysql-test/connect/t/datest.test @@ -1,16 +1,16 @@ ---echo # ---echo # Testing out of range dates as (var)char ---echo # -CREATE TABLE t1 ( -id INT NOT NULL, -dat CHAR(10) NOT NULL, -tim CHAR(8) DEFAULT '09:35:08', -datim CHAR(19) DEFAULT '1789-08-10 14:20:30') -ENGINE=CONNECT TABLE_TYPE=FIX; -INSERT INTO t1(id,dat) VALUES(1,'1515-04-01'),(2,'2014-07-26'),(3,'2118-11-02'); -SELECT * FROM t1; -SELECT id, DATE(datim) FROM t1 LIMIT 1; -SELECT id, DAYNAME(dat) FROM t1; -SELECT id, DAYNAME(datim) FROM t1 LIMIT 1; -SELECT id, TIME(tim) FROM t1 LIMIT 1; -DROP TABLE t1; +--echo # +--echo # Testing out of range dates as (var)char +--echo # +CREATE TABLE t1 ( +id INT NOT NULL, +dat CHAR(10) NOT NULL, +tim CHAR(8) DEFAULT '09:35:08', +datim CHAR(19) DEFAULT '1789-08-10 14:20:30') +ENGINE=CONNECT TABLE_TYPE=FIX; +INSERT INTO t1(id,dat) VALUES(1,'1515-04-01'),(2,'2014-07-26'),(3,'2118-11-02'); +SELECT * FROM t1; +SELECT id, DATE(datim) FROM t1 LIMIT 1; +SELECT id, DAYNAME(dat) FROM t1; +SELECT id, DAYNAME(datim) FROM t1 LIMIT 1; +SELECT id, TIME(tim) FROM t1 LIMIT 1; +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/fmt.test b/storage/connect/mysql-test/connect/t/fmt.test index 662bc70c8b1..2cea2dba7f9 100644 --- a/storage/connect/mysql-test/connect/t/fmt.test +++ b/storage/connect/mysql-test/connect/t/fmt.test @@ -1,85 +1,85 @@ -let $MYSQLD_DATADIR= `select @@datadir`; ---copy_file $MTR_SUITE_DIR/std_data/funny.txt $MYSQLD_DATADIR/test/funny.txt ---copy_file $MTR_SUITE_DIR/std_data/funny2.txt $MYSQLD_DATADIR/test/funny2.txt - ---echo # ---echo # Testing errors ---echo # -CREATE TABLE t1 -( - ID INT NOT NULL field_format=' %n%d%n' -) Engine=CONNECT table_type=FMT file_name='nonexistent.txt'; ---replace_regex /on .*test.nonexistent.txt/on DATADIR\/test\/nonexistent.txt/ -# TODO: check why this is needed for Windows ---replace_result Open(rt) Open(rb) -SELECT * FROM t1; -DROP TABLE t1; - - ---echo # ---echo # Testing update on FMT tables ---echo # -CREATE TABLE t1 -( - id INT NOT NULL field_format=' %n%d%n' -) ENGINE=CONNECT TABLE_TYPE=FMT FILE_NAME='t1.txt'; ---error ER_GET_ERRMSG -INSERT INTO t1 VALUES (10),(20); -# TODO: -#--error ER_GET_ERRMSG -#UPDATE t1 SET id=20; -#TRUNCATE TABLE t1; -#DELETE FROM t1 WHERE id=10; -#SELECT * FROM t1; -DROP TABLE t1; -#--remove_file $MYSQLD_DATADIR/test/t1.txt - - ---echo # ---echo # Testing manual examples ---echo # -CREATE TABLE t1 -( - ID Integer(5) not null field_format=' %n%d%n', - NAME Char(16) not null field_format=" , '%n%[^']%n'", - DEPNO Integer(4) not null field_format=' , #%n%d%n', - SALARY Double(12,2) not null field_format=' ; %n%f%n' -) Engine=CONNECT table_type=FMT file_name='funny.txt'; -SELECT * FROM t1; -DROP TABLE t1; - -# -# TODO: shoudn't a warning instead of error be returned on bad format? -# -CREATE TABLE t1 -( - ID Integer(5) not null field_format=' %n%d%n', - NAME Char(16) not null field_format=" , '%n%[^']%n'", - DEPNO Integer(4) not null field_format=' , #%n%d%n', - SALARY Double(12,2) not null field_format=' ; %n%f%n' -) Engine=CONNECT table_type=FMT file_name='funny2.txt'; ---error ER_GET_ERRMSG -SELECT * FROM t1; -DROP TABLE t1; - -CREATE TABLE t1 -( - ID Integer(5) not null field_format=' %n%d%n', - NAME Char(16) not null field_format=' , ''%n%[^'']%m', - DEPNO Integer(4) not null field_format=''' , #%n%d%m', - SALARY Double(12,2) not null field_format=' ; %n%f%n' -) Engine=CONNECT table_type=FMT file_name='funny2.txt'; -SELECT * FROM t1; ---error ER_GET_ERRMSG -UPDATE t1 SET SALARY=1234; -# TODO: this query crashes -# UPDATE t1 SET SALARY=1234 WHERE ID=56; -DELETE FROM t1 WHERE ID=56; -SELECT * FROM t1; -DROP TABLE t1; - -# -# Clean up -# ---remove_file $MYSQLD_DATADIR/test/funny.txt ---remove_file $MYSQLD_DATADIR/test/funny2.txt +let $MYSQLD_DATADIR= `select @@datadir`; +--copy_file $MTR_SUITE_DIR/std_data/funny.txt $MYSQLD_DATADIR/test/funny.txt +--copy_file $MTR_SUITE_DIR/std_data/funny2.txt $MYSQLD_DATADIR/test/funny2.txt + +--echo # +--echo # Testing errors +--echo # +CREATE TABLE t1 +( + ID INT NOT NULL field_format=' %n%d%n' +) Engine=CONNECT table_type=FMT file_name='nonexistent.txt'; +--replace_regex /on .*test.nonexistent.txt/on DATADIR\/test\/nonexistent.txt/ +# TODO: check why this is needed for Windows +--replace_result Open(rt) Open(rb) +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # Testing update on FMT tables +--echo # +CREATE TABLE t1 +( + id INT NOT NULL field_format=' %n%d%n' +) ENGINE=CONNECT TABLE_TYPE=FMT FILE_NAME='t1.txt'; +--error ER_GET_ERRMSG +INSERT INTO t1 VALUES (10),(20); +# TODO: +#--error ER_GET_ERRMSG +#UPDATE t1 SET id=20; +#TRUNCATE TABLE t1; +#DELETE FROM t1 WHERE id=10; +#SELECT * FROM t1; +DROP TABLE t1; +#--remove_file $MYSQLD_DATADIR/test/t1.txt + + +--echo # +--echo # Testing manual examples +--echo # +CREATE TABLE t1 +( + ID Integer(5) not null field_format=' %n%d%n', + NAME Char(16) not null field_format=" , '%n%[^']%n'", + DEPNO Integer(4) not null field_format=' , #%n%d%n', + SALARY Double(12,2) not null field_format=' ; %n%f%n' +) Engine=CONNECT table_type=FMT file_name='funny.txt'; +SELECT * FROM t1; +DROP TABLE t1; + +# +# TODO: shoudn't a warning instead of error be returned on bad format? +# +CREATE TABLE t1 +( + ID Integer(5) not null field_format=' %n%d%n', + NAME Char(16) not null field_format=" , '%n%[^']%n'", + DEPNO Integer(4) not null field_format=' , #%n%d%n', + SALARY Double(12,2) not null field_format=' ; %n%f%n' +) Engine=CONNECT table_type=FMT file_name='funny2.txt'; +--error ER_GET_ERRMSG +SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 +( + ID Integer(5) not null field_format=' %n%d%n', + NAME Char(16) not null field_format=' , ''%n%[^'']%m', + DEPNO Integer(4) not null field_format=''' , #%n%d%m', + SALARY Double(12,2) not null field_format=' ; %n%f%n' +) Engine=CONNECT table_type=FMT file_name='funny2.txt'; +SELECT * FROM t1; +--error ER_GET_ERRMSG +UPDATE t1 SET SALARY=1234; +# TODO: this query crashes +# UPDATE t1 SET SALARY=1234 WHERE ID=56; +DELETE FROM t1 WHERE ID=56; +SELECT * FROM t1; +DROP TABLE t1; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/funny.txt +--remove_file $MYSQLD_DATADIR/test/funny2.txt diff --git a/storage/connect/mysql-test/connect/t/general.test b/storage/connect/mysql-test/connect/t/general.test index 66752b32099..34e5d4c7b6d 100644 --- a/storage/connect/mysql-test/connect/t/general.test +++ b/storage/connect/mysql-test/connect/t/general.test @@ -1,16 +1,16 @@ ---echo # ---echo # Testing features not specific to any TABLE_TYPE ---echo # ---error ER_UNKNOWN_ERROR -CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=NON_EXISTING; -#SHOW CREATE TABLE t1; -#DROP TABLE t1; - -CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=FIX; -INSERT INTO t1 VALUES (10); -SELECT * FROM t1; -#--error ER_GET_ERRMSG ---error ER_UNKNOWN_ERROR -ALTER TABLE t1 TABLE_TYPE=NON_EXISTING; -SELECT * FROM t1; -DROP TABLE t1; +--echo # +--echo # Testing features not specific to any TABLE_TYPE +--echo # +--error ER_UNKNOWN_ERROR +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=NON_EXISTING; +#SHOW CREATE TABLE t1; +#DROP TABLE t1; + +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=FIX; +INSERT INTO t1 VALUES (10); +SELECT * FROM t1; +#--error ER_GET_ERRMSG +--error ER_UNKNOWN_ERROR +ALTER TABLE t1 TABLE_TYPE=NON_EXISTING; +SELECT * FROM t1; +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/json.test b/storage/connect/mysql-test/connect/t/json.test index f89f58534e7..1cc2c054db4 100644 --- a/storage/connect/mysql-test/connect/t/json.test +++ b/storage/connect/mysql-test/connect/t/json.test @@ -97,7 +97,7 @@ SELECT * FROM t1 WHERE ISBN = '9782212090819'; CREATE TABLE t2 ( FIRSTNAME CHAR(32), LASTNAME CHAR(32)) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[2]:AUTHOR'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json' OPTION_LIST='Object=[1]:AUTHOR'; SELECT * FROM t2; INSERT INTO t2 VALUES('Charles','Dickens'); SELECT * FROM t1; @@ -162,25 +162,25 @@ DROP TABLE t1; --echo # CREATE TABLE t2 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='WEEK:[0]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[0]:EXPENSE:[X]:AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t2; CREATE TABLE t3 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='WEEK:[1]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[1]:EXPENSE:[X]:AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t3; CREATE TABLE t4 ( WHO CHAR(12), -WEEK INT(2) FIELD_FORMAT='WEEK:[3]:NUMBER', -WHAT CHAR(32) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:WHAT', -AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[3]:EXPENSE:[X]:AMOUNT') +WEEK INT(2) FIELD_FORMAT='WEEK:[2]:NUMBER', +WHAT CHAR(32) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:WHAT', +AMOUNT DOUBLE(8,2) FIELD_FORMAT='WEEK:[2]:EXPENSE:[X]:AMOUNT') ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='expense.json'; SELECT * FROM t4; diff --git a/storage/connect/mysql-test/connect/t/json_udf.inc b/storage/connect/mysql-test/connect/t/json_udf.inc new file mode 100644 index 00000000000..c8b0487d6a7 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/json_udf.inc @@ -0,0 +1,33 @@ +--disable_query_log +# +# Check if server has support for loading plugins +# +if (`SELECT @@have_dynamic_loading != 'YES'`) { + --skip UDF requires dynamic loading +} + +let $is_win = `select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows")`; + +if ($is_win) +{ +--eval CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect.dll'; +--eval CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect.dll'; +--eval CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect.dll'; +--eval CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect.dll'; +--eval CREATE FUNCTION Json_Value returns STRING SONAME 'ha_connect.dll'; +--eval CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect.dll'; +--eval CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect.dll'; +} + +if (!$is_win) +{ +--eval CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect.so'; +--eval CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect.so'; +--eval CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect.so'; +--eval CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect.so'; +--eval CREATE FUNCTION Json_Value returns STRING SONAME 'ha_connect.so'; +--eval CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect.so'; +--eval CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect.so'; +} +--enable_query_log + diff --git a/storage/connect/mysql-test/connect/t/json_udf.test b/storage/connect/mysql-test/connect/t/json_udf.test new file mode 100644 index 00000000000..b4427517ca5 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/json_udf.test @@ -0,0 +1,93 @@ +--source json_udf.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +--copy_file $MTR_SUITE_DIR/std_data/biblio.json $MYSQLD_DATADIR/test/biblio.json +--copy_file $MTR_SUITE_DIR/std_data/employee.dat $MYSQLD_DATADIR/test/employee.dat + +--echo # +--echo # Test UDF's with constant arguments +--echo # +SELECT Json_Array(); +SELECT Json_Object(56,3.1416,'foo',NULL); +SELECT Json_Object(56 qty,3.1416 price,'foo' truc, NULL garanty); +SELECT Json_Array(56,3.1416,'My name is "Foo"',NULL); +--error ER_CANT_INITIALIZE_UDF +SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL)) Array; +SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; +SELECT Json_Array_Add(Json_Value('one value'),'One more'); +--error ER_CANT_INITIALIZE_UDF +SELECT Json_Array_Add('one value','One more'); +SELECT Json_Array_Add('one value' json_,'One more'); +--error ER_CANT_INITIALIZE_UDF +SELECT Json_Value(56,3.1416,'foo',NULL); +SELECT Json_Value(3.1416); +SELECT Json_Value('foo'); +SELECT Json_Value(NULL); +SELECT Json_Value(); +SELECT Json_Object(); +SELECT Json_Object(Json_Array(56,3.1416,'foo'),NULL); +SELECT Json_Array(Json_Array(56,3.1416,'foo'),NULL); +SELECT Json_Array(Json_Object(56 "qty",3.1416 "price",'foo'),NULL); + +--echo # +--echo # Test UDF's with column arguments +--echo # +CREATE TABLE t1 +( + ISBN CHAR(15), + LANG CHAR(2), + SUBJECT CHAR(32), + AUTHOR CHAR(64), + TITLE CHAR(32), + TRANSLATION CHAR(32), + TRANSLATOR CHAR(80), + PUBLISHER CHAR(32), + DATEPUB int(4) +) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; + +SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t1; +SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t1; +--error ER_CANT_INITIALIZE_UDF +SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t1; +SELECT Json_Array_Grp(TITLE) FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 ( + SERIALNO CHAR(5) NOT NULL, + NAME VARCHAR(12) NOT NULL FLAG=6, + SEX SMALLINT(1) NOT NULL, + TITLE VARCHAR(15) NOT NULL FLAG=20, + MANAGER CHAR(5) DEFAULT NULL, + DEPARTMENT CHAr(4) NOT NULL FLAG=41, + SECRETARY CHAR(5) DEFAULT NULL FLAG=46, + SALARY DOUBLE(8,2) NOT NULL FLAG=52 +) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1; + +SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t1 WHERE NAME = 'MERCHANT'; +SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t1 GROUP BY DEPARTMENT; +set connect_json_grp_size=30; +SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t1 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t1 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t1 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t1 GROUP BY DEPARTMENT, TITLE; +--error ER_CANT_INITIALIZE_UDF +SELECT Json_Object_Grp(SALARY) FROM t1; +SELECT Json_Object_Grp(SALARY, NAME) FROM t1; +SELECT Json_Object(DEPARTMENT, Json_Object_Grp(SALARY, NAME) "Json_SALARIES") FROM t1 GROUP BY DEPARTMENT; +SELECT Json_Array_Grp(NAME) from t1; +DROP TABLE t1; + +DROP FUNCTION Json_Array; +DROP FUNCTION Json_Array_Add; +DROP FUNCTION Json_Object; +DROP FUNCTION Json_Object_Nonull; +DROP FUNCTION Json_Value; +DROP FUNCTION Json_Array_Grp; +DROP FUNCTION Json_Object_Grp; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/biblio.json +--remove_file $MYSQLD_DATADIR/test/employee.dat diff --git a/storage/connect/mysql-test/connect/t/mrr.test b/storage/connect/mysql-test/connect/t/mrr.test index 37289ad427f..4b9e64bdaa3 100644 --- a/storage/connect/mysql-test/connect/t/mrr.test +++ b/storage/connect/mysql-test/connect/t/mrr.test @@ -1,66 +1,66 @@ -let $MYSQLD_DATADIR= `select @@datadir`; ---copy_file $MTR_SUITE_DIR/std_data/emp.txt $MYSQLD_DATADIR/test/emp.txt - ---echo # ---echo # Show MRR setting. The way it is done is because the t3 table cannot be directly based on ---echo # the information_schema.session_variables table. Not being a CONNECT table, it would be ---echo # read using an intermediate MYSQL table using the MySQL API and could not reflect the ---echo # current session variable change (the call would create another session) This would be ---echo # correct only for querying GLOBAL variables but is not what we want to do here. ---echo # -CREATE TABLE t2 ( -name VARCHAR(64) NOT NULL, -value VARCHAR(1024) NOT NULL -) ENGINE=CONNECT TABLE_TYPE=DOS; -INSERT INTO t2 SELECT * FROM information_schema.session_variables WHERE variable_name = 'OPTIMIZER_SWITCH'; -# Check that MRR is OFF by default -create table t3 ( -name CHAR(32) NOT NULL, -value CHAR(64) NOT NULL -) ENGINE=CONNECT TABLE_TYPE=XCOL TABNAME=t2 OPTION_LIST='Colname=value'; -SELECT value FROM t3 WHERE value LIKE 'mrr%'; - ---echo # ---echo # Testing indexing with MRR OFF ---echo # -CREATE TABLE t1 -( - matricule INT(4) KEY NOT NULL field_format='Z', - nom VARCHAR(16) NOT NULL, - prenom VARCHAR(20) NOT NULL, - sexe SMALLINT(1) NOT NULL COMMENT 'sexe 1:M 2:F', - aanais INT(4) NOT NULL, - mmnais INT(2) NOT NULL, - ddentree DATE NOT NULL date_format='YYYYMM', - ddnom DATE NOT NULL date_format='YYYYMM', - brut INT(5) NOT NULL, - net DOUBLE(8,2) NOT NULL, - service INT(2) NOT NULL, - sitmat CHAR(1) NOT NULL, - formation CHAR(5) NOT NULL, - INDEX NP(nom,prenom) -) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='emp.txt' ENDING=2; -SELECT * FROM t1 LIMIT 10; ---echo # Without MRR, the rows are retrieved sorted by name -SELECT matricule, nom, prenom, sitmat, net FROM t1 WHERE nom IN ('ETANG','FOCH','CERF','ITALIE','ROI'); - ---echo # ---echo # Testing indexing with MRR ON ---echo # -SET @@LOCAL.OPTIMIZER_SWITCH='mrr=on'; ---echo # Refresh the t2 table to reflect the change -UPDATE t2, information_schema.session_variables SET value = variable_value WHERE variable_name = 'OPTIMIZER_SWITCH'; ---echo # Check that MRR is ON for the session -SELECT value FROM t3 WHERE value LIKE 'mrr%'; ---echo # With MRR, the rows are retrieved sorted by their position in the table -SELECT matricule, nom, prenom, sitmat, net FROM t1 WHERE nom IN ('ETANG','FOCH','CERF','ITALIE','ROI'); - -DROP TABLE t1; -DROP TABLE t2; -DROP TABLE t3; - -# -# Clean up -# -SET @@LOCAL.OPTIMIZER_SWITCH='mrr=off'; ---remove_file $MYSQLD_DATADIR/test/emp.txt +let $MYSQLD_DATADIR= `select @@datadir`; +--copy_file $MTR_SUITE_DIR/std_data/emp.txt $MYSQLD_DATADIR/test/emp.txt + +--echo # +--echo # Show MRR setting. The way it is done is because the t3 table cannot be directly based on +--echo # the information_schema.session_variables table. Not being a CONNECT table, it would be +--echo # read using an intermediate MYSQL table using the MySQL API and could not reflect the +--echo # current session variable change (the call would create another session) This would be +--echo # correct only for querying GLOBAL variables but is not what we want to do here. +--echo # +CREATE TABLE t2 ( +name VARCHAR(64) NOT NULL, +value VARCHAR(1024) NOT NULL +) ENGINE=CONNECT TABLE_TYPE=DOS; +INSERT INTO t2 SELECT * FROM information_schema.session_variables WHERE variable_name = 'OPTIMIZER_SWITCH'; +# Check that MRR is OFF by default +create table t3 ( +name CHAR(32) NOT NULL, +value CHAR(64) NOT NULL +) ENGINE=CONNECT TABLE_TYPE=XCOL TABNAME=t2 OPTION_LIST='Colname=value'; +SELECT value FROM t3 WHERE value LIKE 'mrr%'; + +--echo # +--echo # Testing indexing with MRR OFF +--echo # +CREATE TABLE t1 +( + matricule INT(4) KEY NOT NULL field_format='Z', + nom VARCHAR(16) NOT NULL, + prenom VARCHAR(20) NOT NULL, + sexe SMALLINT(1) NOT NULL COMMENT 'sexe 1:M 2:F', + aanais INT(4) NOT NULL, + mmnais INT(2) NOT NULL, + ddentree DATE NOT NULL date_format='YYYYMM', + ddnom DATE NOT NULL date_format='YYYYMM', + brut INT(5) NOT NULL, + net DOUBLE(8,2) NOT NULL, + service INT(2) NOT NULL, + sitmat CHAR(1) NOT NULL, + formation CHAR(5) NOT NULL, + INDEX NP(nom,prenom) +) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='emp.txt' ENDING=2; +SELECT * FROM t1 LIMIT 10; +--echo # Without MRR, the rows are retrieved sorted by name +SELECT matricule, nom, prenom, sitmat, net FROM t1 WHERE nom IN ('ETANG','FOCH','CERF','ITALIE','ROI'); + +--echo # +--echo # Testing indexing with MRR ON +--echo # +SET @@LOCAL.OPTIMIZER_SWITCH='mrr=on'; +--echo # Refresh the t2 table to reflect the change +UPDATE t2, information_schema.session_variables SET value = variable_value WHERE variable_name = 'OPTIMIZER_SWITCH'; +--echo # Check that MRR is ON for the session +SELECT value FROM t3 WHERE value LIKE 'mrr%'; +--echo # With MRR, the rows are retrieved sorted by their position in the table +SELECT matricule, nom, prenom, sitmat, net FROM t1 WHERE nom IN ('ETANG','FOCH','CERF','ITALIE','ROI'); + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; + +# +# Clean up +# +SET @@LOCAL.OPTIMIZER_SWITCH='mrr=off'; +--remove_file $MYSQLD_DATADIR/test/emp.txt diff --git a/storage/connect/mysql-test/connect/t/mul.test b/storage/connect/mysql-test/connect/t/mul.test index 451b38799ad..97caba02b86 100644 --- a/storage/connect/mysql-test/connect/t/mul.test +++ b/storage/connect/mysql-test/connect/t/mul.test @@ -1,43 +1,43 @@ ---echo # ---echo # Testing multiple 1 ---echo # -CREATE TABLE `t1` ( - `a` char(10) DEFAULT NULL, - `b` char(10) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `table_type`=CSV `sep_char`=';'; -INSERT INTO t1 VALUES('test1','bla'); -SELECT * FROM t1; - -CREATE TABLE `t2` ( - `a` char(10) DEFAULT NULL, - `b` char(10) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `table_type`=CSV `sep_char`=';'; -INSERT INTO t2 VALUES('test2','blub'); -SELECT * FROM t2; - -CREATE TABLE `t_all` ( - `a` char(10) DEFAULT NULL, - `b` char(10) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `table_type`=CSV `file_name`='t*.csv' `sep_char`=';' `multiple`=1; -SELECT * FROM t_all order by `a`; - ---echo # ---echo # Testing multiple 2 ---echo # -CREATE table fnlist ( -fn char(8) not null -) ENGINE=CONNECT DEFAULT CHARSET=latin1 table_type=DOS; -INSERT INTO fnlist VALUES('t1.csv'),('t2.csv'); -SELECT fn FROM fnlist; - -CREATE TABLE `tblist` ( - `a` char(10) DEFAULT NULL, - `b` char(10) DEFAULT NULL -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `table_type`=CSV `file_name`='fnlist.dos' `sep_char`=';' `multiple`=2; -SELECT * FROM tblist; - -DROP TABLE t1; -DROP TABLE t2; -DROP TABLE t_all; -DROP TABLE fnlist; -DROP TABLE tblist; +--echo # +--echo # Testing multiple 1 +--echo # +CREATE TABLE `t1` ( + `a` char(10) DEFAULT NULL, + `b` char(10) DEFAULT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `table_type`=CSV `sep_char`=';'; +INSERT INTO t1 VALUES('test1','bla'); +SELECT * FROM t1; + +CREATE TABLE `t2` ( + `a` char(10) DEFAULT NULL, + `b` char(10) DEFAULT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `table_type`=CSV `sep_char`=';'; +INSERT INTO t2 VALUES('test2','blub'); +SELECT * FROM t2; + +CREATE TABLE `t_all` ( + `a` char(10) DEFAULT NULL, + `b` char(10) DEFAULT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `table_type`=CSV `file_name`='t*.csv' `sep_char`=';' `multiple`=1; +SELECT * FROM t_all order by `a`; + +--echo # +--echo # Testing multiple 2 +--echo # +CREATE table fnlist ( +fn char(8) not null +) ENGINE=CONNECT DEFAULT CHARSET=latin1 table_type=DOS; +INSERT INTO fnlist VALUES('t1.csv'),('t2.csv'); +SELECT fn FROM fnlist; + +CREATE TABLE `tblist` ( + `a` char(10) DEFAULT NULL, + `b` char(10) DEFAULT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `table_type`=CSV `file_name`='fnlist.dos' `sep_char`=';' `multiple`=2; +SELECT * FROM tblist; + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t_all; +DROP TABLE fnlist; +DROP TABLE tblist; diff --git a/storage/connect/mysql-test/connect/t/myconn.inc b/storage/connect/mysql-test/connect/t/myconn.inc index bdd60687d87..54c698e7c0f 100644 --- a/storage/connect/mysql-test/connect/t/myconn.inc +++ b/storage/connect/mysql-test/connect/t/myconn.inc @@ -1,27 +1,27 @@ ---source include/not_embedded.inc - -let $PORT= `select @@port`; - ---disable_query_log ---replace_result $PORT PORT ---error 0,ER_UNKNOWN_ERROR -eval CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/tx1'; -if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1' - AND ENGINE='CONNECT' - AND CREATE_OPTIONS LIKE '%`table_type`=MySQL%'`) -{ - Skip Need MySQL support; -} -DROP TABLE t1; ---enable_query_log - -connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,); -connect (slave,127.0.0.1,root,,test,$SLAVE_MYPORT,); - -connection master; -CREATE DATABASE connect; - -connection slave; -CREATE DATABASE connect; +--source include/not_embedded.inc + +let $PORT= `select @@port`; + +--disable_query_log +--replace_result $PORT PORT +--error 0,ER_UNKNOWN_ERROR +eval CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/tx1'; +if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1' + AND ENGINE='CONNECT' + AND CREATE_OPTIONS LIKE '%`table_type`=MySQL%'`) +{ + Skip Need MySQL support; +} +DROP TABLE t1; +--enable_query_log + +connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,); +connect (slave,127.0.0.1,root,,test,$SLAVE_MYPORT,); + +connection master; +CREATE DATABASE connect; + +connection slave; +CREATE DATABASE connect; diff --git a/storage/connect/mysql-test/connect/t/myconn_cleanup.inc b/storage/connect/mysql-test/connect/t/myconn_cleanup.inc index ba2d99ed8b4..db473e512c1 100644 --- a/storage/connect/mysql-test/connect/t/myconn_cleanup.inc +++ b/storage/connect/mysql-test/connect/t/myconn_cleanup.inc @@ -1,9 +1,9 @@ -connection master; ---disable_warnings -DROP TABLE IF EXISTS connect.t1; -DROP DATABASE IF EXISTS connect; - -connection slave; -DROP TABLE IF EXISTS connect.t1; -DROP DATABASE IF EXISTS connect; ---enable_warnings +connection master; +--disable_warnings +DROP TABLE IF EXISTS connect.t1; +DROP DATABASE IF EXISTS connect; + +connection slave; +DROP TABLE IF EXISTS connect.t1; +DROP DATABASE IF EXISTS connect; +--enable_warnings diff --git a/storage/connect/mysql-test/connect/t/mysql.test b/storage/connect/mysql-test/connect/t/mysql.test index e245587e562..7585c202b8b 100644 --- a/storage/connect/mysql-test/connect/t/mysql.test +++ b/storage/connect/mysql-test/connect/t/mysql.test @@ -1,472 +1,472 @@ --- source include/not_embedded.inc - -# -# TODO: consider a possibility to run this test -# against some remote MySQL server -# - -let $PORT= `select @@port`; - ---disable_query_log ---replace_result $PORT PORT ---error 0,ER_UNKNOWN_ERROR ---eval CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='tx1' OPTION_LIST='host=localhost,user=root,port=$PORT' -if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1' - AND ENGINE='CONNECT' - AND CREATE_OPTIONS LIKE '%`table_type`=MySQL%'`) -{ - Skip Need MySQL support; -} -DROP TABLE t1; ---enable_query_log - -# TODO: remote VARCHAR is displayed as CHAR - -CREATE TABLE t1 (a int, b char(10)); -INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); -SELECT * FROM t1; - ---echo # ---echo # Testing errors ---echo # - -# Bad user name -# Suppress "mysql_real_connect failed:" (printed in _DEBUG build) ---replace_result $PORT PORT "mysql_real_connect failed: " "" ---error ER_UNKNOWN_ERROR ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root1,port=$PORT' - -# Bad database name ---replace_result $PORT PORT "mysql_real_connect failed: " "" ---error ER_UNKNOWN_ERROR ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL DBNAME='unknown' TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' - -# Bad database name, with OPTION_LIST going first. ---replace_result $PORT PORT "mysql_real_connect failed: " "" ---error ER_UNKNOWN_ERROR ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL OPTION_LIST='host=localhost,user=root,port=$PORT' DBNAME='unknown' TABNAME='t1' - -# Bad table name ---replace_result $PORT PORT ---error ER_UNKNOWN_ERROR ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='unknown' OPTION_LIST='host=localhost,user=root,port=$PORT' ---error ER_NO_SUCH_TABLE -SHOW CREATE TABLE t2; - -# Bad column name ---replace_result $PORT PORT ---eval CREATE TABLE t2 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t2; ---error ER_GET_ERRMSG -SELECT * FROM t2; -DROP TABLE t2; - -# The remote table disappeared ---replace_result $PORT PORT ---eval CREATE TABLE t2 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -ALTER TABLE t1 RENAME t1backup; ---error ER_GET_ERRMSG -SELECT * FROM t2; -ALTER TABLE t1backup RENAME t1; -DROP TABLE t2; - - ---echo # ---echo # Testing SELECT, etc. ---echo # - -# Automatic table structure ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2; - - -# Explicit table structure ---replace_result $PORT PORT ---eval CREATE TABLE t2 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2; - - -# Explicit table structure: remote NULL, local NOT NULL ---replace_result $PORT PORT ---eval CREATE TABLE t2 (a INT NOT NULL, b CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2; - - -# Explicit table structure with wrong column types ---replace_result $PORT PORT ---eval CREATE TABLE t2 (a char(10), b int) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2; - -DROP TABLE t1; - ---echo # ---echo # Testing numeric data types ---echo # - -# TODO: tinyint is mapped to smallint -#CREATE TABLE t1 (a tinyint); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: unsigned does not work -#CREATE TABLE t1 (a tinyint unsigned); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -CREATE TABLE t1 (a smallint); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t1; ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2, t1; - -CREATE TABLE t1 (a mediumint); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t1; ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2, t1; - -CREATE TABLE t1 (a int); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t1; ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2, t1; - - -# TODO: bigint is mapped to double(20,0) -CREATE TABLE t1 (a bigint); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t1; ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2, t1; - - -# TODO: ERROR 1439: Display width out of range for 'a' (max = 255) -#CREATE TABLE t1 (a float); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: ERROR 1439: Display width out of range for 'a' (max = 255) -#CREATE TABLE t1 (a double); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: decimal is converted to double -#CREATE TABLE t1 (a decimal(20,5)); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: add test for BIT - ---echo # ---echo # Testing character data types ---echo # - -# TODO: char is mapped to varchar -CREATE TABLE t1 (a char(10)); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t1; ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2, t1; - -CREATE TABLE t1 (a varchar(10)); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t1; ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2, t1; - -# TODO: ERROR 1105: Unsupported column type tinytext -#CREATE TABLE t1 (a tinytext); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: ERROR 1105: Unsupported column type mediumtext -#CREATE TABLE t1 (a mediumtext); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: text is converted to varchar(256) -#CREATE TABLE t1 (a text); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: ERROR 1105: Unsupported column type longtext -#CREATE TABLE t1 (a longtext); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -#TODO: add tests for ENUM -#TODO: add tests for SET - ---echo # ---echo # Testing binary data types ---echo # - -# TODO: ERROR 1105: Unsupported column type binary -#CREATE TABLE t1 (a binary(10)); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: ERROR 1105: Unsupported column type varbinary -#CREATE TABLE t1 (a varbinary(10)); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: ERROR 1105: Unsupported column type tinyblob -#CREATE TABLE t1 (a tinyblob); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: ERROR 1105: Unsupported column type mediumblob -#CREATE TABLE t1 (a mediumblob); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: blob is converted to varchar(256) -#CREATE TABLE t1 (a blob); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: ERROR 1105: Unsupported column type longblob -#CREATE TABLE t1 (a longblob); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: ERROR 1105: Unsupported column type geometry -#CREATE TABLE t1 (a geometry); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - ---echo # ---echo # Testing temporal data types ---echo # - -# TODO: time is converted to date -#CREATE TABLE t1 (a time); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -CREATE TABLE t1 (a date); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' ---replace_result $PORT PORT -SHOW CREATE TABLE t1; ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2, t1; - -# TODO: datetime is converted to date -#CREATE TABLE t1 (a datetime); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: timestamp is converted to date -#CREATE TABLE t1 (a timestamp); -#--replace_result $PORT PORT -#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' -#--replace_result $PORT PORT -#SHOW CREATE TABLE t1; -#--replace_result $PORT PORT -#SHOW CREATE TABLE t2; -#SELECT * FROM t2; -#DROP TABLE t2, t1; - -# TODO: add test for YEAR -# TODO: add tests for fractional seconds - ---echo # ---echo # MDEV-4877 mysqldump dumps all data from a connect table ---echo # -CREATE TABLE t1 (a INT); -INSERT INTO t1 VALUES (10),(20),(30); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@localhost:$PORT/test/t1' -SELECT * FROM t2; ---echo # Start of mysqldump ------ ---replace_result $PORT PORT ---exec $MYSQL_DUMP --compact test t2 ---echo # End of mysqldump ------ -DROP TABLE t2; -DROP TABLE t1; - ---echo # ---echo # Testing getting unsigned types ---echo # -CREATE TABLE t1 ( -a TINYINT UNSIGNED NOT NULL, -b SMALLINT ZEROFILL NOT NULL, -c INT UNSIGNED NOT NULL, -d BIGINT UNSIGNED NOT NULL, -e CHAR(32) NOT NULL DEFAULT 'Hello') ENGINE=CONNECT TABLE_TYPE=FIX; -DESCRIBE t1; -INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615); -SELECT * FROM t1; - -CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME=t1; -DESCRIBE t2; -SELECT * FROM t2; - -DROP TABLE t2; -DROP TABLE t1; - -# -# MDEV-6085 ALTER TABLE looses the connection string -# -CREATE TABLE t1 (a INT); -INSERT INTO t1 VALUES (10),(20),(30); ---replace_result $PORT PORT ---eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@localhost:$PORT/test/t1' -SELECT * FROM t2; -ALTER TABLE t2 MODIFY a TINYINT; ---replace_result $PORT PORT -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2; -DROP TABLE t1; - +-- source include/not_embedded.inc + +# +# TODO: consider a possibility to run this test +# against some remote MySQL server +# + +let $PORT= `select @@port`; + +--disable_query_log +--replace_result $PORT PORT +--error 0,ER_UNKNOWN_ERROR +--eval CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='tx1' OPTION_LIST='host=localhost,user=root,port=$PORT' +if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1' + AND ENGINE='CONNECT' + AND CREATE_OPTIONS LIKE '%`table_type`=MySQL%'`) +{ + Skip Need MySQL support; +} +DROP TABLE t1; +--enable_query_log + +# TODO: remote VARCHAR is displayed as CHAR + +CREATE TABLE t1 (a int, b char(10)); +INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); +SELECT * FROM t1; + +--echo # +--echo # Testing errors +--echo # + +# Bad user name +# Suppress "mysql_real_connect failed:" (printed in _DEBUG build) +--replace_result $PORT PORT "mysql_real_connect failed: " "" +--error ER_UNKNOWN_ERROR +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root1,port=$PORT' + +# Bad database name +--replace_result $PORT PORT "mysql_real_connect failed: " "" +--error ER_UNKNOWN_ERROR +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL DBNAME='unknown' TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' + +# Bad database name, with OPTION_LIST going first. +--replace_result $PORT PORT "mysql_real_connect failed: " "" +--error ER_UNKNOWN_ERROR +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL OPTION_LIST='host=localhost,user=root,port=$PORT' DBNAME='unknown' TABNAME='t1' + +# Bad table name +--replace_result $PORT PORT +--error ER_UNKNOWN_ERROR +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='unknown' OPTION_LIST='host=localhost,user=root,port=$PORT' +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t2; + +# Bad column name +--replace_result $PORT PORT +--eval CREATE TABLE t2 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +--error ER_GET_ERRMSG +SELECT * FROM t2; +DROP TABLE t2; + +# The remote table disappeared +--replace_result $PORT PORT +--eval CREATE TABLE t2 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +ALTER TABLE t1 RENAME t1backup; +--error ER_GET_ERRMSG +SELECT * FROM t2; +ALTER TABLE t1backup RENAME t1; +DROP TABLE t2; + + +--echo # +--echo # Testing SELECT, etc. +--echo # + +# Automatic table structure +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; + + +# Explicit table structure +--replace_result $PORT PORT +--eval CREATE TABLE t2 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; + + +# Explicit table structure: remote NULL, local NOT NULL +--replace_result $PORT PORT +--eval CREATE TABLE t2 (a INT NOT NULL, b CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; + + +# Explicit table structure with wrong column types +--replace_result $PORT PORT +--eval CREATE TABLE t2 (a char(10), b int) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; + +DROP TABLE t1; + +--echo # +--echo # Testing numeric data types +--echo # + +# TODO: tinyint is mapped to smallint +#CREATE TABLE t1 (a tinyint); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: unsigned does not work +#CREATE TABLE t1 (a tinyint unsigned); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +CREATE TABLE t1 (a smallint); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t1; +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2, t1; + +CREATE TABLE t1 (a mediumint); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t1; +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2, t1; + +CREATE TABLE t1 (a int); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t1; +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2, t1; + + +# TODO: bigint is mapped to double(20,0) +CREATE TABLE t1 (a bigint); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t1; +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2, t1; + + +# TODO: ERROR 1439: Display width out of range for 'a' (max = 255) +#CREATE TABLE t1 (a float); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: ERROR 1439: Display width out of range for 'a' (max = 255) +#CREATE TABLE t1 (a double); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: decimal is converted to double +#CREATE TABLE t1 (a decimal(20,5)); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: add test for BIT + +--echo # +--echo # Testing character data types +--echo # + +# TODO: char is mapped to varchar +CREATE TABLE t1 (a char(10)); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t1; +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2, t1; + +CREATE TABLE t1 (a varchar(10)); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t1; +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2, t1; + +# TODO: ERROR 1105: Unsupported column type tinytext +#CREATE TABLE t1 (a tinytext); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: ERROR 1105: Unsupported column type mediumtext +#CREATE TABLE t1 (a mediumtext); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: text is converted to varchar(256) +#CREATE TABLE t1 (a text); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: ERROR 1105: Unsupported column type longtext +#CREATE TABLE t1 (a longtext); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +#TODO: add tests for ENUM +#TODO: add tests for SET + +--echo # +--echo # Testing binary data types +--echo # + +# TODO: ERROR 1105: Unsupported column type binary +#CREATE TABLE t1 (a binary(10)); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: ERROR 1105: Unsupported column type varbinary +#CREATE TABLE t1 (a varbinary(10)); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: ERROR 1105: Unsupported column type tinyblob +#CREATE TABLE t1 (a tinyblob); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: ERROR 1105: Unsupported column type mediumblob +#CREATE TABLE t1 (a mediumblob); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: blob is converted to varchar(256) +#CREATE TABLE t1 (a blob); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: ERROR 1105: Unsupported column type longblob +#CREATE TABLE t1 (a longblob); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: ERROR 1105: Unsupported column type geometry +#CREATE TABLE t1 (a geometry); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +--echo # +--echo # Testing temporal data types +--echo # + +# TODO: time is converted to date +#CREATE TABLE t1 (a time); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +CREATE TABLE t1 (a date); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +--replace_result $PORT PORT +SHOW CREATE TABLE t1; +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2, t1; + +# TODO: datetime is converted to date +#CREATE TABLE t1 (a datetime); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: timestamp is converted to date +#CREATE TABLE t1 (a timestamp); +#--replace_result $PORT PORT +#--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=localhost,user=root,port=$PORT' +#--replace_result $PORT PORT +#SHOW CREATE TABLE t1; +#--replace_result $PORT PORT +#SHOW CREATE TABLE t2; +#SELECT * FROM t2; +#DROP TABLE t2, t1; + +# TODO: add test for YEAR +# TODO: add tests for fractional seconds + +--echo # +--echo # MDEV-4877 mysqldump dumps all data from a connect table +--echo # +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20),(30); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@localhost:$PORT/test/t1' +SELECT * FROM t2; +--echo # Start of mysqldump ------ +--replace_result $PORT PORT +--exec $MYSQL_DUMP --compact test t2 +--echo # End of mysqldump ------ +DROP TABLE t2; +DROP TABLE t1; + +--echo # +--echo # Testing getting unsigned types +--echo # +CREATE TABLE t1 ( +a TINYINT UNSIGNED NOT NULL, +b SMALLINT ZEROFILL NOT NULL, +c INT UNSIGNED NOT NULL, +d BIGINT UNSIGNED NOT NULL, +e CHAR(32) NOT NULL DEFAULT 'Hello') ENGINE=CONNECT TABLE_TYPE=FIX; +DESCRIBE t1; +INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615); +SELECT * FROM t1; + +CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME=t1; +DESCRIBE t2; +SELECT * FROM t2; + +DROP TABLE t2; +DROP TABLE t1; + +# +# MDEV-6085 ALTER TABLE looses the connection string +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20),(30); +--replace_result $PORT PORT +--eval CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@localhost:$PORT/test/t1' +SELECT * FROM t2; +ALTER TABLE t2 MODIFY a TINYINT; +--replace_result $PORT PORT +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; +DROP TABLE t1; + diff --git a/storage/connect/mysql-test/connect/t/mysql_discovery.test b/storage/connect/mysql-test/connect/t/mysql_discovery.test index 057244a2a97..cd266750274 100644 --- a/storage/connect/mysql-test/connect/t/mysql_discovery.test +++ b/storage/connect/mysql-test/connect/t/mysql_discovery.test @@ -1,33 +1,33 @@ --- source myconn.inc - -connection slave; - -CREATE TABLE t1 ( - `id` int(20) primary key, - `group` int NOT NULL default 1, - `a\\b` int NOT NULL default 2, - `a\\` int unsigned, - `name` varchar(32) default 'name') - DEFAULT CHARSET=latin1; - -connection master; - ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; - ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; -INSERT INTO t1 (id, name) VALUES (1, 'foo'); -INSERT INTO t1 (id, name) VALUES (2, 'fee'); ---sorted_result -SELECT * FROM t1; -DROP TABLE t1; - -connection slave; ---sorted_result -SELECT * FROM t1; -DROP TABLE t1; - --- source myconn_cleanup.inc - +-- source myconn.inc + +connection slave; + +CREATE TABLE t1 ( + `id` int(20) primary key, + `group` int NOT NULL default 1, + `a\\b` int NOT NULL default 2, + `a\\` int unsigned, + `name` varchar(32) default 'name') + DEFAULT CHARSET=latin1; + +connection master; + +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; + +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +INSERT INTO t1 (id, name) VALUES (1, 'foo'); +INSERT INTO t1 (id, name) VALUES (2, 'fee'); +--sorted_result +SELECT * FROM t1; +DROP TABLE t1; + +connection slave; +--sorted_result +SELECT * FROM t1; +DROP TABLE t1; + +-- source myconn_cleanup.inc + diff --git a/storage/connect/mysql-test/connect/t/mysql_exec.test b/storage/connect/mysql-test/connect/t/mysql_exec.test index e56072a63e1..9226592eded 100644 --- a/storage/connect/mysql-test/connect/t/mysql_exec.test +++ b/storage/connect/mysql-test/connect/t/mysql_exec.test @@ -1,45 +1,45 @@ --- source myconn.inc - ---echo # ---echo # Checking Sending Commands ---echo # -connection master; - ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 ( - command VARCHAR(128) NOT NULL, - warnings INT(4) NOT NULL FLAG=3, - number INT(5) NOT NULL FLAG=1, - message VARCHAR(255) FLAG=2) - ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test' OPTION_LIST='Execsrc=1,maxerr=2'; - -SELECT * FROM t1 WHERE command IN ('Warning','Note', - 'drop table if exists t1', - 'create table t1 (id int key auto_increment, msg varchar(32) not null)', - "insert into t1(msg) values('One'),(NULL),('Three')", - "insert into t1 values(2,'Deux') on duplicate key update msg = 'Two'", - "insert into t1(message) values('Four'),('Five'),('Six')", - 'insert into t1(id) values(NULL)', - "update t1 set msg = 'Four' where id = 4", - 'select * from t1'); - ---echo # ---echo # Checking Using Procedure ---echo # -DROP PROCEDURE IF EXISTS p1; -CREATE PROCEDURE p1(cmd varchar(512)) - READS SQL DATA - SELECT * FROM t1 WHERE command IN ('Warning','Note',cmd); - -CALL p1('insert into t1(id) values(NULL)'); -CALL p1('update t1 set msg = "Five" where id = 5'); -DROP PROCEDURE p1; -DROP TABLE t1; - -connection slave; ---sorted_result -SELECT * FROM t1; -DROP TABLE t1; - --- source myconn_cleanup.inc - +-- source myconn.inc + +--echo # +--echo # Checking Sending Commands +--echo # +connection master; + +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 ( + command VARCHAR(128) NOT NULL, + warnings INT(4) NOT NULL FLAG=3, + number INT(5) NOT NULL FLAG=1, + message VARCHAR(255) FLAG=2) + ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test' OPTION_LIST='Execsrc=1,maxerr=2'; + +SELECT * FROM t1 WHERE command IN ('Warning','Note', + 'drop table if exists t1', + 'create table t1 (id int key auto_increment, msg varchar(32) not null)', + "insert into t1(msg) values('One'),(NULL),('Three')", + "insert into t1 values(2,'Deux') on duplicate key update msg = 'Two'", + "insert into t1(message) values('Four'),('Five'),('Six')", + 'insert into t1(id) values(NULL)', + "update t1 set msg = 'Four' where id = 4", + 'select * from t1'); + +--echo # +--echo # Checking Using Procedure +--echo # +DROP PROCEDURE IF EXISTS p1; +CREATE PROCEDURE p1(cmd varchar(512)) + READS SQL DATA + SELECT * FROM t1 WHERE command IN ('Warning','Note',cmd); + +CALL p1('insert into t1(id) values(NULL)'); +CALL p1('update t1 set msg = "Five" where id = 5'); +DROP PROCEDURE p1; +DROP TABLE t1; + +connection slave; +--sorted_result +SELECT * FROM t1; +DROP TABLE t1; + +-- source myconn_cleanup.inc + diff --git a/storage/connect/mysql-test/connect/t/mysql_grant.test b/storage/connect/mysql-test/connect/t/mysql_grant.test index 8eb6a90c917..7c75103ed3b 100644 --- a/storage/connect/mysql-test/connect/t/mysql_grant.test +++ b/storage/connect/mysql-test/connect/t/mysql_grant.test @@ -1,78 +1,78 @@ --- source include/not_embedded.inc - -let $PORT= `select @@port`; - ---disable_query_log ---replace_result $PORT PORT ---error 0,ER_UNKNOWN_ERROR ---eval CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='tx1' OPTION_LIST='host=localhost,user=root,port=$PORT' -if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1' - AND ENGINE='CONNECT' - AND CREATE_OPTIONS LIKE '%`table_type`=MySQL%'`) -{ - Skip Need MySQL support; -} -DROP TABLE t1; ---enable_query_log - ---echo # ---echo # Testing FILE privilege ---echo # -GRANT ALL PRIVILEGES ON *.* TO user@localhost; -REVOKE FILE ON *.* FROM user@localhost; ---connect(user,localhost,user,,) ---connection user -SELECT user(); ---replace_result $PORT PORT ---error ER_ACCESS_DENIED_ERROR ---eval CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=MySQL OPTION_LIST='host=localhost,user=root1,port=$PORT' ---connection default -SELECT user(); -CREATE TABLE t1remote (a INT NOT NULL); -INSERT INTO t1remote VALUES (10),(20),(30); ---replace_result $PORT PORT ---eval CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=MySQL TABNAME=t1remote OPTION_LIST='host=localhost,user=root,port=$PORT' -SELECT * FROM t1; ---connection user -SELECT user(); ---error ER_ACCESS_DENIED_ERROR -SELECT * FROM t1; ---error ER_ACCESS_DENIED_ERROR -INSERT INTO t1 VALUES ('xxx'); ---error ER_ACCESS_DENIED_ERROR -DELETE FROM t1 WHERE a='xxx'; ---error ER_ACCESS_DENIED_ERROR -UPDATE t1 SET a='yyy' WHERE a='xxx'; ---error ER_ACCESS_DENIED_ERROR -TRUNCATE TABLE t1; ---error ER_ACCESS_DENIED_ERROR -ALTER TABLE t1 READONLY=1; ---error ER_ACCESS_DENIED_ERROR -CREATE VIEW v1 AS SELECT * FROM t1; - ---echo # Testing a VIEW created with FILE privileges but accessed with no FILE ---connection default -SELECT user(); -CREATE VIEW v1 AS SELECT * FROM t1; ---connection user -SELECT user(); ---error ER_ACCESS_DENIED_ERROR -SELECT * FROM v1; ---error ER_ACCESS_DENIED_ERROR -INSERT INTO v1 VALUES (2); ---error ER_ACCESS_DENIED_ERROR -UPDATE v1 SET a=123; ---error ER_ACCESS_DENIED_ERROR -DELETE FROM v1; - ---disconnect user ---connection default -SELECT user(); -DROP VIEW v1; -DROP TABLE t1, t1remote; -DROP USER user@localhost; ---echo # ---echo # Testing FILE privileges done ---echo # - +-- source include/not_embedded.inc + +let $PORT= `select @@port`; + +--disable_query_log +--replace_result $PORT PORT +--error 0,ER_UNKNOWN_ERROR +--eval CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='tx1' OPTION_LIST='host=localhost,user=root,port=$PORT' +if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1' + AND ENGINE='CONNECT' + AND CREATE_OPTIONS LIKE '%`table_type`=MySQL%'`) +{ + Skip Need MySQL support; +} +DROP TABLE t1; +--enable_query_log + +--echo # +--echo # Testing FILE privilege +--echo # +GRANT ALL PRIVILEGES ON *.* TO user@localhost; +REVOKE FILE ON *.* FROM user@localhost; +--connect(user,localhost,user,,) +--connection user +SELECT user(); +--replace_result $PORT PORT +--error ER_ACCESS_DENIED_ERROR +--eval CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=MySQL OPTION_LIST='host=localhost,user=root1,port=$PORT' +--connection default +SELECT user(); +CREATE TABLE t1remote (a INT NOT NULL); +INSERT INTO t1remote VALUES (10),(20),(30); +--replace_result $PORT PORT +--eval CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=MySQL TABNAME=t1remote OPTION_LIST='host=localhost,user=root,port=$PORT' +SELECT * FROM t1; +--connection user +SELECT user(); +--error ER_ACCESS_DENIED_ERROR +SELECT * FROM t1; +--error ER_ACCESS_DENIED_ERROR +INSERT INTO t1 VALUES ('xxx'); +--error ER_ACCESS_DENIED_ERROR +DELETE FROM t1 WHERE a='xxx'; +--error ER_ACCESS_DENIED_ERROR +UPDATE t1 SET a='yyy' WHERE a='xxx'; +--error ER_ACCESS_DENIED_ERROR +TRUNCATE TABLE t1; +--error ER_ACCESS_DENIED_ERROR +ALTER TABLE t1 READONLY=1; +--error ER_ACCESS_DENIED_ERROR +CREATE VIEW v1 AS SELECT * FROM t1; + +--echo # Testing a VIEW created with FILE privileges but accessed with no FILE +--connection default +SELECT user(); +CREATE VIEW v1 AS SELECT * FROM t1; +--connection user +SELECT user(); +--error ER_ACCESS_DENIED_ERROR +SELECT * FROM v1; +--error ER_ACCESS_DENIED_ERROR +INSERT INTO v1 VALUES (2); +--error ER_ACCESS_DENIED_ERROR +UPDATE v1 SET a=123; +--error ER_ACCESS_DENIED_ERROR +DELETE FROM v1; + +--disconnect user +--connection default +SELECT user(); +DROP VIEW v1; +DROP TABLE t1, t1remote; +DROP USER user@localhost; +--echo # +--echo # Testing FILE privileges done +--echo # + diff --git a/storage/connect/mysql-test/connect/t/mysql_new.test b/storage/connect/mysql-test/connect/t/mysql_new.test index 08f27b6b19b..c93f0407ca4 100644 --- a/storage/connect/mysql-test/connect/t/mysql_new.test +++ b/storage/connect/mysql-test/connect/t/mysql_new.test @@ -1,325 +1,325 @@ --- source myconn.inc - -# -# This test is run against a remote MySQL server -# - -connection slave; - -CREATE TABLE t1 (a int, b char(10)); -INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); -SELECT * FROM t1; - ---echo # ---echo # Testing errors ---echo # -connection master; - -# Bad user name -# Suppress "mysql_real_connect failed:" (printed in _DEBUG build) ---replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" ---error ER_UNKNOWN_ERROR -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://unknown@127.0.0.1:$SLAVE_MYPORT/test/t1'; - -# Bad database name ---replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" ---error ER_UNKNOWN_ERROR -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/unknown/t1'; - -# Bad database name, with OPTION_LIST going first. ---replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" ---error ER_UNKNOWN_ERROR -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' DBNAME='unknown' TABNAME='t1'; - -# Bad table name ---replace_result $SLAVE_MYPORT SLAVE_PORT ---error ER_UNKNOWN_ERROR -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/unknown'; ---error ER_NO_SUCH_TABLE -SHOW CREATE TABLE t1; - -# Bad column name ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; ---error ER_GET_ERRMSG -SELECT * FROM t1; -DROP TABLE t1; - -# The remote table disappeared ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; - -connection slave; -ALTER TABLE t1 RENAME t1backup; - -connection master; ---error ER_GET_ERRMSG -SELECT * FROM t1; - -connection slave; -ALTER TABLE t1backup RENAME t1; - -connection master; -DROP TABLE t1; - ---echo # ---echo # Testing SELECT, etc. ---echo # - -# Automatic table structure ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; -SELECT * FROM t1; -DROP TABLE t1; - -# Explicit table structure ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' - OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT'; ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; -SELECT * FROM t1; -DROP TABLE t1; - -# Explicit table structure: remote NULL, local NOT NULL ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 (a INT NOT NULL, b CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=MYSQL - OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT'; ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; -SELECT * FROM t1; -DROP TABLE t1; - -# Explicit table structure with wrong column types ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 (a char(10), b int) ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; -SELECT * FROM t1; -DROP TABLE t1; - -connection slave; -DROP TABLE t1; - ---echo # ---echo # Testing numeric data types ---echo # - -# TODO: mediumint is converted to int, float is converted to double, decimal is converted to double -CREATE TABLE t1 (a tinyint, b smallint, c mediumint, d int, e bigint, f float, g double, h decimal(20,5)); -SHOW CREATE TABLE t1; -INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.14159265,3141.59265); - -connection master; ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT'; ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; -SELECT * FROM t1; -DROP TABLE t1; - -connection slave; -DROP TABLE t1; - -# TODO: unsigned does not work -#CREATE TABLE t1 (a tinyint unsigned); -#SHOW CREATE TABLE t1; - -#connection master; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT'; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1; - -#connection slave; -#DROP TABLE t1; - -# TODO: add test for BIT - ---echo # ---echo # Testing character data types ---echo # - -CREATE TABLE t1 (a char(12), b varchar(12)); -SHOW CREATE TABLE t1; -INSERT INTO t1 VALUES('Welcome','Hello, World'); -SELECT * FROM t1; - -connection master; ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT'; ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; -SELECT * FROM t1; -DROP TABLE t1; - -connection slave; -DROP TABLE t1; - -# TODO: ERROR 1105: Unsupported column type tinytext -#CREATE TABLE t1 (a tinytext); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: ERROR 1105: Unsupported column type mediumtext -#CREATE TABLE t1 (a mediumtext); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: text is converted to varchar(256) -#CREATE TABLE t1 (a text); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: ERROR 1105: Unsupported column type longtext -#CREATE TABLE t1 (a longtext); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -#TODO: add tests for ENUM -#TODO: add tests for SET - -#--echo # -#--echo # Testing binary data types -#--echo # - -# TODO: ERROR 1105: Unsupported column type binary -#CREATE TABLE t1 (a binary(10)); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: ERROR 1105: Unsupported column type varbinary -#CREATE TABLE t1 (a varbinary(10)); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: ERROR 1105: Unsupported column type tinyblob -#CREATE TABLE t1 (a tinyblob); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: ERROR 1105: Unsupported column type mediumblob -#CREATE TABLE t1 (a mediumblob); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: blob is converted to varchar(256) -#CREATE TABLE t1 (a blob); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: ERROR 1105: Unsupported column type longblob -#CREATE TABLE t1 (a longblob); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - -# TODO: ERROR 1105: Unsupported column type geometry -#CREATE TABLE t1 (a geometry); -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#--replace_result $SLAVE_MYPORT SLAVE_PORT -#SHOW CREATE TABLE t1; -#SELECT * FROM t1; -#DROP TABLE t1, t1; - ---echo # ---echo # Testing temporal data types ---echo # - -CREATE TABLE t1 (a date, b datetime, c time, d timestamp, e year); -SHOW CREATE TABLE t1; -INSERT INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23'); -SELECT * FROM t1; - -connection master; ---replace_result $SLAVE_MYPORT SLAVE_PORT -eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL - CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT'; ---replace_result $SLAVE_MYPORT SLAVE_PORT -SHOW CREATE TABLE t1; -SELECT * FROM t1; -DROP TABLE t1; - -connection slave; -DROP TABLE t1; - --- source myconn_cleanup.inc - +-- source myconn.inc + +# +# This test is run against a remote MySQL server +# + +connection slave; + +CREATE TABLE t1 (a int, b char(10)); +INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03'); +SELECT * FROM t1; + +--echo # +--echo # Testing errors +--echo # +connection master; + +# Bad user name +# Suppress "mysql_real_connect failed:" (printed in _DEBUG build) +--replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" +--error ER_UNKNOWN_ERROR +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://unknown@127.0.0.1:$SLAVE_MYPORT/test/t1'; + +# Bad database name +--replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" +--error ER_UNKNOWN_ERROR +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/unknown/t1'; + +# Bad database name, with OPTION_LIST going first. +--replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " "" +--error ER_UNKNOWN_ERROR +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' DBNAME='unknown' TABNAME='t1'; + +# Bad table name +--replace_result $SLAVE_MYPORT SLAVE_PORT +--error ER_UNKNOWN_ERROR +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/unknown'; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t1; + +# Bad column name +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +--error ER_GET_ERRMSG +SELECT * FROM t1; +DROP TABLE t1; + +# The remote table disappeared +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; + +connection slave; +ALTER TABLE t1 RENAME t1backup; + +connection master; +--error ER_GET_ERRMSG +SELECT * FROM t1; + +connection slave; +ALTER TABLE t1backup RENAME t1; + +connection master; +DROP TABLE t1; + +--echo # +--echo # Testing SELECT, etc. +--echo # + +# Automatic table structure +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +# Explicit table structure +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' + OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +# Explicit table structure: remote NULL, local NOT NULL +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 (a INT NOT NULL, b CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=MYSQL + OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +# Explicit table structure with wrong column types +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 (a char(10), b int) ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +connection slave; +DROP TABLE t1; + +--echo # +--echo # Testing numeric data types +--echo # + +# TODO: mediumint is converted to int, float is converted to double, decimal is converted to double +CREATE TABLE t1 (a tinyint, b smallint, c mediumint, d int, e bigint, f float, g double, h decimal(20,5)); +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.14159265,3141.59265); + +connection master; +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +connection slave; +DROP TABLE t1; + +# TODO: unsigned does not work +#CREATE TABLE t1 (a tinyint unsigned); +#SHOW CREATE TABLE t1; + +#connection master; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT'; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1; + +#connection slave; +#DROP TABLE t1; + +# TODO: add test for BIT + +--echo # +--echo # Testing character data types +--echo # + +CREATE TABLE t1 (a char(12), b varchar(12)); +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES('Welcome','Hello, World'); +SELECT * FROM t1; + +connection master; +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +connection slave; +DROP TABLE t1; + +# TODO: ERROR 1105: Unsupported column type tinytext +#CREATE TABLE t1 (a tinytext); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: ERROR 1105: Unsupported column type mediumtext +#CREATE TABLE t1 (a mediumtext); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: text is converted to varchar(256) +#CREATE TABLE t1 (a text); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: ERROR 1105: Unsupported column type longtext +#CREATE TABLE t1 (a longtext); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +#TODO: add tests for ENUM +#TODO: add tests for SET + +#--echo # +#--echo # Testing binary data types +#--echo # + +# TODO: ERROR 1105: Unsupported column type binary +#CREATE TABLE t1 (a binary(10)); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: ERROR 1105: Unsupported column type varbinary +#CREATE TABLE t1 (a varbinary(10)); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: ERROR 1105: Unsupported column type tinyblob +#CREATE TABLE t1 (a tinyblob); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: ERROR 1105: Unsupported column type mediumblob +#CREATE TABLE t1 (a mediumblob); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: blob is converted to varchar(256) +#CREATE TABLE t1 (a blob); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: ERROR 1105: Unsupported column type longblob +#CREATE TABLE t1 (a longblob); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +# TODO: ERROR 1105: Unsupported column type geometry +#CREATE TABLE t1 (a geometry); +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='t1' OPTION_LIST='host=127.0.0.1,user=root,port=$SLAVE_MYPORT' +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#--replace_result $SLAVE_MYPORT SLAVE_PORT +#SHOW CREATE TABLE t1; +#SELECT * FROM t1; +#DROP TABLE t1, t1; + +--echo # +--echo # Testing temporal data types +--echo # + +CREATE TABLE t1 (a date, b datetime, c time, d timestamp, e year); +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES('2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23','2003-05-27 10:45:23'); +SELECT * FROM t1; + +connection master; +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MYSQL + CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT'; +--replace_result $SLAVE_MYPORT SLAVE_PORT +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +connection slave; +DROP TABLE t1; + +-- source myconn_cleanup.inc + diff --git a/storage/connect/mysql-test/connect/t/null.test b/storage/connect/mysql-test/connect/t/null.test index 3d1e33eb77c..d2c784144a5 100644 --- a/storage/connect/mysql-test/connect/t/null.test +++ b/storage/connect/mysql-test/connect/t/null.test @@ -1,87 +1,87 @@ -let $MYSQLD_DATADIR= `select @@datadir`; - ---echo # ---echo # Testing FIX null columns ---echo # -CREATE TABLE t1 -( - id INT NOT NULL, - nb INT, - msg VARCHAR(12) -) ENGINE=CONNECT TABLE_TYPE=FIX; ---error ER_BAD_NULL_ERROR -INSERT INTO t1 values(NULL,1,'Hello'); -INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); -SELECT * FROM t1; -SELECT* FROM t1 WHERE id IS NULL; -SELECT * FROM t1 WHERE nb IS NULL; -SELECT * FROM t1 WHERE msg IS NOT NULL; -DROP TABLE t1; - ---echo # ---echo # Testing CSV null columns ---echo # -CREATE TABLE t1 -( - id INT NOT NULL, - nb INT, - msg VARCHAR(12) -) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1; ---error ER_BAD_NULL_ERROR -INSERT INTO t1 values(NULL,1,'Hello'); -INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); -SELECT * FROM t1; -SELECT* FROM t1 WHERE id IS NULL; -SELECT * FROM t1 WHERE nb IS NULL; -SELECT * FROM t1 WHERE msg IS NOT NULL; -DROP TABLE t1; - ---echo # ---echo # Testing BIN null columns ---echo # -CREATE TABLE t1 -( - id INT NOT NULL, - nb INT, - msg VARCHAR(12) -) ENGINE=CONNECT TABLE_TYPE=BIN; ---error ER_BAD_NULL_ERROR -INSERT INTO t1 values(NULL,1,'Hello'); -INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); -SELECT * FROM t1; -SELECT* FROM t1 WHERE id IS NULL; -SELECT * FROM t1 WHERE nb IS NULL; -SELECT * FROM t1 WHERE msg IS NOT NULL; -DROP TABLE t1; - ---echo # ---echo # Testing DBF null columns ---echo # -CREATE TABLE t1 -( - id INT NOT NULL, - nb INT, - msg VARCHAR(12) -) ENGINE=CONNECT TABLE_TYPE=DBF; ---error ER_BAD_NULL_ERROR -INSERT INTO t1 values(NULL,1,'Hello'); -INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); -SELECT * FROM t1; -SELECT* FROM t1 WHERE id IS NULL; -SELECT * FROM t1 WHERE nb IS NULL; -SELECT * FROM t1 WHERE msg IS NOT NULL; -DROP TABLE t1; - ---echo # ---echo # Testing INI null columns ---echo # -CREATE TABLE t1 -( - `sec` char(8) NOT NULL flag=1, - `key` char(12) -) ENGINE=CONNECT TABLE_TYPE=INI; -INSERT INTO t1(sec) values('S1'); -SELECT * FROM t1; -INSERT INTO t1 values('S1','Newval'); -SELECT * FROM t1; -DROP TABLE t1; +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # +--echo # Testing FIX null columns +--echo # +CREATE TABLE t1 +( + id INT NOT NULL, + nb INT, + msg VARCHAR(12) +) ENGINE=CONNECT TABLE_TYPE=FIX; +--error ER_BAD_NULL_ERROR +INSERT INTO t1 values(NULL,1,'Hello'); +INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); +SELECT * FROM t1; +SELECT* FROM t1 WHERE id IS NULL; +SELECT * FROM t1 WHERE nb IS NULL; +SELECT * FROM t1 WHERE msg IS NOT NULL; +DROP TABLE t1; + +--echo # +--echo # Testing CSV null columns +--echo # +CREATE TABLE t1 +( + id INT NOT NULL, + nb INT, + msg VARCHAR(12) +) ENGINE=CONNECT TABLE_TYPE=CSV HEADER=1; +--error ER_BAD_NULL_ERROR +INSERT INTO t1 values(NULL,1,'Hello'); +INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); +SELECT * FROM t1; +SELECT* FROM t1 WHERE id IS NULL; +SELECT * FROM t1 WHERE nb IS NULL; +SELECT * FROM t1 WHERE msg IS NOT NULL; +DROP TABLE t1; + +--echo # +--echo # Testing BIN null columns +--echo # +CREATE TABLE t1 +( + id INT NOT NULL, + nb INT, + msg VARCHAR(12) +) ENGINE=CONNECT TABLE_TYPE=BIN; +--error ER_BAD_NULL_ERROR +INSERT INTO t1 values(NULL,1,'Hello'); +INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); +SELECT * FROM t1; +SELECT* FROM t1 WHERE id IS NULL; +SELECT * FROM t1 WHERE nb IS NULL; +SELECT * FROM t1 WHERE msg IS NOT NULL; +DROP TABLE t1; + +--echo # +--echo # Testing DBF null columns +--echo # +CREATE TABLE t1 +( + id INT NOT NULL, + nb INT, + msg VARCHAR(12) +) ENGINE=CONNECT TABLE_TYPE=DBF; +--error ER_BAD_NULL_ERROR +INSERT INTO t1 values(NULL,1,'Hello'); +INSERT INTO t1 values(10,4,NULL),(20,2,'Hello'),(0,0,'Zero'); +SELECT * FROM t1; +SELECT* FROM t1 WHERE id IS NULL; +SELECT * FROM t1 WHERE nb IS NULL; +SELECT * FROM t1 WHERE msg IS NOT NULL; +DROP TABLE t1; + +--echo # +--echo # Testing INI null columns +--echo # +CREATE TABLE t1 +( + `sec` char(8) NOT NULL flag=1, + `key` char(12) +) ENGINE=CONNECT TABLE_TYPE=INI; +INSERT INTO t1(sec) values('S1'); +SELECT * FROM t1; +INSERT INTO t1 values('S1','Newval'); +SELECT * FROM t1; +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/occur.test b/storage/connect/mysql-test/connect/t/occur.test index 36a4caafda1..7d7bca87f66 100644 --- a/storage/connect/mysql-test/connect/t/occur.test +++ b/storage/connect/mysql-test/connect/t/occur.test @@ -1,61 +1,61 @@ --- source include/not_embedded.inc - -let $MYSQLD_DATADIR= `select @@datadir`; -let $PORT= `select @@port`; ---copy_file $MTR_SUITE_DIR/std_data/employee.dat $MYSQLD_DATADIR/test/employee.dat - -CREATE TABLE employee ( -serialno CHAR(5) NOT NULL, -name VARCHAR(12) NOT NULL FLAG=6, -sex TINYINT(1) NOT NULL, -title VARCHAR(15) NOT NULL FLAG=20, -manager CHAR(5) DEFAULT NULL, -department CHAR(4) NOT NULL FLAG=41, -secretary CHAR(5) DEFAULT NULL FLAG=46, -salary DOUBLE(8,2) NOT NULL FLAG=52 -) ENGINE=connect TABLE_TYPE=fix FILE_NAME='employee.dat' ENDING=1; -SELECT * FROM employee; - ---replace_result $PORT PORT ---eval CREATE TABLE occurs (name CHAR(12), sex CHAR(1), title CHAR(15), department CHAR(4), salary DOUBLE(8,2), id_of CHAR(12), id CHAR(5) NOT NULL) ENGINE=CONNECT TABLE_TYPE=OCCUR TABNAME=employee OPTION_LIST='OccurCol=ID,RankCol=ID_OF,Colist=serialno;manager;secretary,port=$PORT'; -SELECT * FROM occurs; - -DROP TABLE occurs; -DROP TABLE employee; - -CREATE TABLE pets ( -name VARCHAR(12) NOT NULL, -dog INT NOT NULL DEFAULT 0, -cat INT NOT NULL DEFAULT 0, -rabbit INT NOT NULL DEFAULT 0, -bird INT NOT NULL DEFAULT 0, -fish INT NOT NULL DEFAULT 0) ENGINE=MYISAM; -INSERT INTO pets(name,dog) VALUES('John',2); -INSERT INTO pets(name,cat) VALUES('Bill',1); -INSERT INTO pets(name,dog,cat) VALUES('Mary',1,1); -INSERT INTO pets(name,rabbit) VALUES('Lisbeth',2); -INSERT INTO pets(name,cat,bird) VALUES('Kevin',2,6); -INSERT INTO pets(name,dog,fish) VALUES('Donald',1,3); -SELECT * FROM pets; - ---replace_result $PORT PORT ---eval CREATE TABLE xpet (name VARCHAR(12) NOT NULL, race CHAR(6) NOT NULL, number INT) ENGINE=CONNECT TABLE_TYPE=OCCUR TABNAME=pets OPTION_LIST='OccurCol=number,RankCol=race,Colist=dog;cat;rabbit;bird;fish,port=$PORT' - -SELECT * FROM xpet; -SELECT name FROM xpet; -SELECT name FROM xpet WHERE race = 'cat' AND number = 0; -SELECT name, SUM(number) pets FROM xpet GROUP BY name; - -ALTER TABLE xpet MODIFY number INT NOT NULL; - -SELECT * FROM xpet; -SELECT * FROM xpet WHERE number > 1; -SELECT DISTINCT name FROM xpet WHERE number > 1; -SELECT name FROM xpet; -SELECT name, race FROM xpet; -SELECT name, count(*) FROM xpet GROUP BY name, LEAST(number,1); -SELECT name, number, count(*) FROM xpet GROUP BY name, number; - -DROP TABLE xpet; -DROP TABLE pets; ---remove_file $MYSQLD_DATADIR/test/employee.dat +-- source include/not_embedded.inc + +let $MYSQLD_DATADIR= `select @@datadir`; +let $PORT= `select @@port`; +--copy_file $MTR_SUITE_DIR/std_data/employee.dat $MYSQLD_DATADIR/test/employee.dat + +CREATE TABLE employee ( +serialno CHAR(5) NOT NULL, +name VARCHAR(12) NOT NULL FLAG=6, +sex TINYINT(1) NOT NULL, +title VARCHAR(15) NOT NULL FLAG=20, +manager CHAR(5) DEFAULT NULL, +department CHAR(4) NOT NULL FLAG=41, +secretary CHAR(5) DEFAULT NULL FLAG=46, +salary DOUBLE(8,2) NOT NULL FLAG=52 +) ENGINE=connect TABLE_TYPE=fix FILE_NAME='employee.dat' ENDING=1; +SELECT * FROM employee; + +--replace_result $PORT PORT +--eval CREATE TABLE occurs (name CHAR(12), sex CHAR(1), title CHAR(15), department CHAR(4), salary DOUBLE(8,2), id_of CHAR(12), id CHAR(5) NOT NULL) ENGINE=CONNECT TABLE_TYPE=OCCUR TABNAME=employee OPTION_LIST='OccurCol=ID,RankCol=ID_OF,Colist=serialno;manager;secretary,port=$PORT'; +SELECT * FROM occurs; + +DROP TABLE occurs; +DROP TABLE employee; + +CREATE TABLE pets ( +name VARCHAR(12) NOT NULL, +dog INT NOT NULL DEFAULT 0, +cat INT NOT NULL DEFAULT 0, +rabbit INT NOT NULL DEFAULT 0, +bird INT NOT NULL DEFAULT 0, +fish INT NOT NULL DEFAULT 0) ENGINE=MYISAM; +INSERT INTO pets(name,dog) VALUES('John',2); +INSERT INTO pets(name,cat) VALUES('Bill',1); +INSERT INTO pets(name,dog,cat) VALUES('Mary',1,1); +INSERT INTO pets(name,rabbit) VALUES('Lisbeth',2); +INSERT INTO pets(name,cat,bird) VALUES('Kevin',2,6); +INSERT INTO pets(name,dog,fish) VALUES('Donald',1,3); +SELECT * FROM pets; + +--replace_result $PORT PORT +--eval CREATE TABLE xpet (name VARCHAR(12) NOT NULL, race CHAR(6) NOT NULL, number INT) ENGINE=CONNECT TABLE_TYPE=OCCUR TABNAME=pets OPTION_LIST='OccurCol=number,RankCol=race,Colist=dog;cat;rabbit;bird;fish,port=$PORT' + +SELECT * FROM xpet; +SELECT name FROM xpet; +SELECT name FROM xpet WHERE race = 'cat' AND number = 0; +SELECT name, SUM(number) pets FROM xpet GROUP BY name; + +ALTER TABLE xpet MODIFY number INT NOT NULL; + +SELECT * FROM xpet; +SELECT * FROM xpet WHERE number > 1; +SELECT DISTINCT name FROM xpet WHERE number > 1; +SELECT name FROM xpet; +SELECT name, race FROM xpet; +SELECT name, count(*) FROM xpet GROUP BY name, LEAST(number,1); +SELECT name, number, count(*) FROM xpet GROUP BY name, number; + +DROP TABLE xpet; +DROP TABLE pets; +--remove_file $MYSQLD_DATADIR/test/employee.dat diff --git a/storage/connect/mysql-test/connect/t/odbc_sqlite3.test b/storage/connect/mysql-test/connect/t/odbc_sqlite3.test index 433e97149c6..a22fa3a7832 100644 --- a/storage/connect/mysql-test/connect/t/odbc_sqlite3.test +++ b/storage/connect/mysql-test/connect/t/odbc_sqlite3.test @@ -1,90 +1,90 @@ ---source have_odbc_sqlite3.inc - -# -# To run this test, install SQLite3 ODBC Driver from -# http://www.ch-werner.de/sqliteodbc/ -# -# Note, the test does not need a DSN to be created -# (only the driver is required) -# -# -# On Windows: -# ----------- -# Download and run the installer file sqliteodbc.exe -# Version sqliteodbc-0.991 is known to Work. -# After running the installer the test should start working automatically. -# -# On Linux: -# -------- -# 1. Download the source tarball, e.g.: sqliteodbc-0.993.tar.gz -# 2. Unpack the sources: -# tar -zxf sqliteodbc-0.993.tar.gz -# 3. Compile the source and install: -# cd sqliteodbc-0.993 -# ./configure --prefix=/opt/sqliteodbc -# make -# sudo make install -# -# (you can use a different --prefix, according to your preferences) -# -# 4. Add these lines into /etc/odbcinst.ini -# -#[SQLite3 ODBC Driver] -#Description=SQLite3 ODBC Driver -#Driver=/opt/sqliteodbc/libsqlite3odbc.so -#Setup=/opt/sqliteodbc/libsqlite3odbc.so -# -# Adjust the directory "/opt/sqliteodbc/" according to --prefix -# that you chose on step #3. -# -# - -SET NAMES utf8; - -let $MYSQLD_DATADIR= `select @@datadir`; - - -# -# For some reasons Windows does not allow to remove the data base -# file after "DROP TABLE t1". So unlike in odbc_xls.test we won't copy -# the data file, we'll use directly the file in std_data. -# As we do not do any modifications in the database, this should be OK. -# -let $Database=$MTR_SUITE_DIR/std_data/test.sqlite3; ---replace_result $MTR_SUITE_DIR MTR_SUITE_DIR ---eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8; ---replace_result $MTR_SUITE_DIR MTR_SUITE_DIR -SHOW CREATE TABLE t1; -SELECT * FROM t1; - -CREATE TABLE t2 AS SELECT * FROM t1; -SHOW CREATE TABLE t2; -SELECT * FROM t2; -DROP TABLE t2; - -CREATE VIEW v1 AS SELECT * FROM t1; -SELECT * FROM v1; - -DROP VIEW v1; -DROP TABLE t1; - ---replace_result $MTR_SUITE_DIR MTR_SUITE_DIR ---eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 -SELECT * FROM t1; -DROP TABLE t1; - ---replace_result $MTR_SUITE_DIR MTR_SUITE_DIR ---eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 -SELECT * FROM t1; -DROP TABLE t1; - - ---replace_result $MTR_SUITE_DIR MTR_SUITE_DIR ---eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 -SELECT * FROM t1 ORDER BY Table_name; -DROP TABLE t1; - ---replace_result $MTR_SUITE_DIR MTR_SUITE_DIR ---eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 -SELECT * FROM t1 ORDER BY Table_name; -DROP TABLE t1; +--source have_odbc_sqlite3.inc + +# +# To run this test, install SQLite3 ODBC Driver from +# http://www.ch-werner.de/sqliteodbc/ +# +# Note, the test does not need a DSN to be created +# (only the driver is required) +# +# +# On Windows: +# ----------- +# Download and run the installer file sqliteodbc.exe +# Version sqliteodbc-0.991 is known to Work. +# After running the installer the test should start working automatically. +# +# On Linux: +# -------- +# 1. Download the source tarball, e.g.: sqliteodbc-0.993.tar.gz +# 2. Unpack the sources: +# tar -zxf sqliteodbc-0.993.tar.gz +# 3. Compile the source and install: +# cd sqliteodbc-0.993 +# ./configure --prefix=/opt/sqliteodbc +# make +# sudo make install +# +# (you can use a different --prefix, according to your preferences) +# +# 4. Add these lines into /etc/odbcinst.ini +# +#[SQLite3 ODBC Driver] +#Description=SQLite3 ODBC Driver +#Driver=/opt/sqliteodbc/libsqlite3odbc.so +#Setup=/opt/sqliteodbc/libsqlite3odbc.so +# +# Adjust the directory "/opt/sqliteodbc/" according to --prefix +# that you chose on step #3. +# +# + +SET NAMES utf8; + +let $MYSQLD_DATADIR= `select @@datadir`; + + +# +# For some reasons Windows does not allow to remove the data base +# file after "DROP TABLE t1". So unlike in odbc_xls.test we won't copy +# the data file, we'll use directly the file in std_data. +# As we do not do any modifications in the database, this should be OK. +# +let $Database=$MTR_SUITE_DIR/std_data/test.sqlite3; +--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR +--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8; +--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR +SHOW CREATE TABLE t1; +SELECT * FROM t1; + +CREATE TABLE t2 AS SELECT * FROM t1; +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; + +CREATE VIEW v1 AS SELECT * FROM t1; +SELECT * FROM v1; + +DROP VIEW v1; +DROP TABLE t1; + +--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR +--eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 +SELECT * FROM t1; +DROP TABLE t1; + +--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR +--eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABNAME='t1' TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 +SELECT * FROM t1; +DROP TABLE t1; + + +--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR +--eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Columns TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 +SELECT * FROM t1 ORDER BY Table_name; +DROP TABLE t1; + +--replace_result $MTR_SUITE_DIR MTR_SUITE_DIR +--eval CREATE TABLE t1 ENGINE=CONNECT CATFUNC=Tables TABLE_TYPE=ODBC CONNECTION='Driver=SQLite3 ODBC Driver;Database=$Database;NoWCHAR=yes' CHARSET=utf8 DATA_CHARSET=utf8 +SELECT * FROM t1 ORDER BY Table_name; +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/part_file.test b/storage/connect/mysql-test/connect/t/part_file.test index 6efd2b9b580..8ee43a917ec 100644 --- a/storage/connect/mysql-test/connect/t/part_file.test +++ b/storage/connect/mysql-test/connect/t/part_file.test @@ -1,166 +1,166 @@ ---source include/have_partition.inc -let $MYSQLD_DATADIR= `select @@datadir`; - -set @@global.connect_exact_info=ON; - ---echo # This will be used to see what data files are created -CREATE TABLE dr1 ( - fname VARCHAR(256) NOT NULL FLAG=2, - ftype CHAR(8) NOT NULL FLAG=3 -# ,FSIZE INT(6) NOT NULL FLAG=5 removed because Unix size != Windows size -) engine=CONNECT table_type=DIR file_name='t1#P#*.*'; - ---echo # ---echo # Testing partitioning on inward table ---echo # -CREATE TABLE t1 ( - id INT NOT NULL, - msg VARCHAR(32) -) ENGINE=CONNECT TABLE_TYPE=CSV AVG_ROW_LENGTH=10 -PARTITION BY RANGE(id) ( -PARTITION first VALUES LESS THAN(10), -PARTITION middle VALUES LESS THAN(50), -PARTITION last VALUES LESS THAN(MAXVALUE)); -INSERT INTO t1 VALUES(4, 'four'),(24, 'twenty four'); -INSERT INTO t1 VALUES(7,'seven'),(10,'ten'),(40,'forty'),(60,'sixty'),(81,'eighty one'); -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM t1; -EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id > 50; -SELECT * FROM t1 WHERE id > 50; -#TODO: Differences between Linux and Windows -#SHOW TABLE STATUS LIKE 't1'; ---error ER_GET_ERRMSG -UPDATE t1 set id = 41 WHERE msg = 'four'; -UPDATE t1 set msg = 'quatre' WHERE id = 4; -SELECT * FROM dr1 ORDER BY fname, ftype; ---echo # ---echo # Altering partitioning on inward table ---echo # -ALTER TABLE t1 -PARTITION by range(id) ( -PARTITION first VALUES LESS THAN(11), -PARTITION middle VALUES LESS THAN(50), -PARTITION last VALUES LESS THAN(MAXVALUE)); -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM dr1 ORDER BY fname, ftype; -EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id=10; -SELECT * FROM t1 WHERE id=10; -DELETE FROM t1 WHERE id in (4,60); -SELECT * FROM t1; -DROP TABLE t1; -# TODO: this fails on Linux -#SELECT * FROM dr1; - ---echo # ---echo # Testing partitioning on a void outward table ---echo # -ALTER TABLE dr1 FILE_NAME='part*.*'; -CREATE TABLE t1 ( - rwid INT(6) DEFAULT 0 SPECIAL=ROWID, - rnum INT(6) DEFAULT 0 SPECIAL=ROWNUM, - prtn VARCHAR(64) DEFAULT '' SPECIAL=PARTID, - tbn VARCHAR(64) DEFAULT '' SPECIAL=TABID, - fid VARCHAR(256) DEFAULT '' SPECIAL=FNAME, - id INT KEY NOT NULL, - msg VARCHAR(32) -) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='part%s.txt'; ---replace_result $MYSQLD_DATADIR "DATADIR/" -ALTER TABLE t1 -PARTITION by range columns(id) ( -PARTITION `1` VALUES LESS THAN(10), -PARTITION `2` VALUES LESS THAN(50), -PARTITION `3` VALUES LESS THAN(MAXVALUE)); -SHOW INDEX FROM t1; -# TODO: this fails on Linux -#SELECT * FROM dr1 ORDER BY fname, ftype; -INSERT INTO t1(id,msg) VALUES(4, 'four'); -SELECT * FROM dr1 ORDER BY fname, ftype; -INSERT INTO t1(id,msg) VALUES(7,'seven'),(10,'ten'),(40,'forty'),(60,'sixty'),(81,'eighty one'); -INSERT INTO t1(id,msg) VALUES(72,'seventy two'),(20,'twenty'),(1,'one'),(35,'thirty five'),(8,'eight'); -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM t1; -SELECT * FROM t1 order by id; -EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id = 10; -SELECT * FROM t1 WHERE id = 10; -EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id >= 10; -SELECT * FROM t1 WHERE id >= 10; -SELECT count(*) FROM t1 WHERE id < 10; -SELECT case when id < 10 then 1 when id < 50 then 2 else 3 end as pn, count(*) FROM t1 group by pn; -SELECT prtn, count(*) FROM t1 group by prtn; -EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id > 50; -SELECT * FROM t1 WHERE id = 35; -SELECT * FROM dr1 ORDER BY fname, ftype; ---echo # This does not change the partition file data and is WRONG -ALTER TABLE t1 -PARTITION by range columns(id) ( -PARTITION `1` VALUES LESS THAN(11), -PARTITION `2` VALUES LESS THAN(70), -PARTITION `3` VALUES LESS THAN(MAXVALUE)); -SELECT CASE WHEN id < 11 THEN 1 WHEN id < 70 THEN 2 ELSE 3 END AS pn, COUNT(*) FROM t1 GROUP BY pn; -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM dr1 ORDER BY fname, ftype; ---echo # ---echo # This is the correct way to change partitioning: ---echo # Save table values, erase the table, then re-insert saved values in modified table ---echo # -CREATE TABLE t2 ( - id INT NOT NULL, - msg VARCHAR(32) -) ENGINE=CONNECT TABLE_TYPE=FIX; -INSERT INTO t2 SELECT id, msg FROM t1; -DELETE FROM t1; -INSERT INTO t1(id,msg) SELECT * FROM t2; -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM t1; -SELECT * FROM dr1 ORDER BY fname, ftype; -DROP TABLE t2; -DROP TABLE t1; - ---echo # ---echo # Testing partitioning on a populated outward table ---echo # -CREATE TABLE t1 ( - id INT NOT NULL, - msg VARCHAR(32) -) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='part%s.txt' -PARTITION by range columns(id) ( -PARTITION `1` VALUES LESS THAN(11), -PARTITION `2` VALUES LESS THAN(70), -PARTITION `3` VALUES LESS THAN(MAXVALUE)); -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM t1 WHERE id < 11; -SELECT * FROM t1 WHERE id >= 70; -SELECT * FROM dr1 ORDER BY fname, ftype; - ---echo # ---echo # Testing indexing on a partitioned table ---echo # -CREATE INDEX XID ON t1(id); -SHOW INDEX FROM t1; -SELECT * FROM dr1 ORDER BY fname, ftype; -EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id = 10; -DROP INDEX XID ON t1; -SHOW INDEX FROM t1; -SELECT * FROM dr1 ORDER BY fname, ftype; -ALTER TABLE t1 ADD PRIMARY KEY (id); -SHOW INDEX FROM t1; -SELECT * FROM dr1 ORDER BY fname, ftype; -EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id = 10; -ALTER TABLE t1 DROP PRIMARY KEY; -SHOW INDEX FROM t1; -SELECT * FROM dr1 ORDER BY fname, ftype; -DROP TABLE t1; -DROP TABLE dr1; - -# -# Clean up -# -set @@global.connect_exact_info=OFF; - ---remove_file $MYSQLD_DATADIR/test/part1.txt ---remove_file $MYSQLD_DATADIR/test/part2.txt ---remove_file $MYSQLD_DATADIR/test/part3.txt -#--remove_file $MYSQLD_DATADIR/test/part%s.fnx -#--remove_file $MYSQLD_DATADIR/test/part1.fnx -#--remove_file $MYSQLD_DATADIR/test/part2.fnx -#--remove_file $MYSQLD_DATADIR/test/part3.fnx +--source include/have_partition.inc +let $MYSQLD_DATADIR= `select @@datadir`; + +set @@global.connect_exact_info=ON; + +--echo # This will be used to see what data files are created +CREATE TABLE dr1 ( + fname VARCHAR(256) NOT NULL FLAG=2, + ftype CHAR(8) NOT NULL FLAG=3 +# ,FSIZE INT(6) NOT NULL FLAG=5 removed because Unix size != Windows size +) engine=CONNECT table_type=DIR file_name='t1#P#*.*'; + +--echo # +--echo # Testing partitioning on inward table +--echo # +CREATE TABLE t1 ( + id INT NOT NULL, + msg VARCHAR(32) +) ENGINE=CONNECT TABLE_TYPE=CSV AVG_ROW_LENGTH=10 +PARTITION BY RANGE(id) ( +PARTITION first VALUES LESS THAN(10), +PARTITION middle VALUES LESS THAN(50), +PARTITION last VALUES LESS THAN(MAXVALUE)); +INSERT INTO t1 VALUES(4, 'four'),(24, 'twenty four'); +INSERT INTO t1 VALUES(7,'seven'),(10,'ten'),(40,'forty'),(60,'sixty'),(81,'eighty one'); +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM t1; +EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id > 50; +SELECT * FROM t1 WHERE id > 50; +#TODO: Differences between Linux and Windows +#SHOW TABLE STATUS LIKE 't1'; +--error ER_GET_ERRMSG +UPDATE t1 set id = 41 WHERE msg = 'four'; +UPDATE t1 set msg = 'quatre' WHERE id = 4; +SELECT * FROM dr1 ORDER BY fname, ftype; +--echo # +--echo # Altering partitioning on inward table +--echo # +ALTER TABLE t1 +PARTITION by range(id) ( +PARTITION first VALUES LESS THAN(11), +PARTITION middle VALUES LESS THAN(50), +PARTITION last VALUES LESS THAN(MAXVALUE)); +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM dr1 ORDER BY fname, ftype; +EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id=10; +SELECT * FROM t1 WHERE id=10; +DELETE FROM t1 WHERE id in (4,60); +SELECT * FROM t1; +DROP TABLE t1; +# TODO: this fails on Linux +#SELECT * FROM dr1; + +--echo # +--echo # Testing partitioning on a void outward table +--echo # +ALTER TABLE dr1 FILE_NAME='part*.*'; +CREATE TABLE t1 ( + rwid INT(6) DEFAULT 0 SPECIAL=ROWID, + rnum INT(6) DEFAULT 0 SPECIAL=ROWNUM, + prtn VARCHAR(64) DEFAULT '' SPECIAL=PARTID, + tbn VARCHAR(64) DEFAULT '' SPECIAL=TABID, + fid VARCHAR(256) DEFAULT '' SPECIAL=FNAME, + id INT KEY NOT NULL, + msg VARCHAR(32) +) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='part%s.txt'; +--replace_result $MYSQLD_DATADIR "DATADIR/" +ALTER TABLE t1 +PARTITION by range columns(id) ( +PARTITION `1` VALUES LESS THAN(10), +PARTITION `2` VALUES LESS THAN(50), +PARTITION `3` VALUES LESS THAN(MAXVALUE)); +SHOW INDEX FROM t1; +# TODO: this fails on Linux +#SELECT * FROM dr1 ORDER BY fname, ftype; +INSERT INTO t1(id,msg) VALUES(4, 'four'); +SELECT * FROM dr1 ORDER BY fname, ftype; +INSERT INTO t1(id,msg) VALUES(7,'seven'),(10,'ten'),(40,'forty'),(60,'sixty'),(81,'eighty one'); +INSERT INTO t1(id,msg) VALUES(72,'seventy two'),(20,'twenty'),(1,'one'),(35,'thirty five'),(8,'eight'); +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM t1; +SELECT * FROM t1 order by id; +EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id = 10; +SELECT * FROM t1 WHERE id = 10; +EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id >= 10; +SELECT * FROM t1 WHERE id >= 10; +SELECT count(*) FROM t1 WHERE id < 10; +SELECT case when id < 10 then 1 when id < 50 then 2 else 3 end as pn, count(*) FROM t1 group by pn; +SELECT prtn, count(*) FROM t1 group by prtn; +EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id > 50; +SELECT * FROM t1 WHERE id = 35; +SELECT * FROM dr1 ORDER BY fname, ftype; +--echo # This does not change the partition file data and is WRONG +ALTER TABLE t1 +PARTITION by range columns(id) ( +PARTITION `1` VALUES LESS THAN(11), +PARTITION `2` VALUES LESS THAN(70), +PARTITION `3` VALUES LESS THAN(MAXVALUE)); +SELECT CASE WHEN id < 11 THEN 1 WHEN id < 70 THEN 2 ELSE 3 END AS pn, COUNT(*) FROM t1 GROUP BY pn; +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM dr1 ORDER BY fname, ftype; +--echo # +--echo # This is the correct way to change partitioning: +--echo # Save table values, erase the table, then re-insert saved values in modified table +--echo # +CREATE TABLE t2 ( + id INT NOT NULL, + msg VARCHAR(32) +) ENGINE=CONNECT TABLE_TYPE=FIX; +INSERT INTO t2 SELECT id, msg FROM t1; +DELETE FROM t1; +INSERT INTO t1(id,msg) SELECT * FROM t2; +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM t1; +SELECT * FROM dr1 ORDER BY fname, ftype; +DROP TABLE t2; +DROP TABLE t1; + +--echo # +--echo # Testing partitioning on a populated outward table +--echo # +CREATE TABLE t1 ( + id INT NOT NULL, + msg VARCHAR(32) +) ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='part%s.txt' +PARTITION by range columns(id) ( +PARTITION `1` VALUES LESS THAN(11), +PARTITION `2` VALUES LESS THAN(70), +PARTITION `3` VALUES LESS THAN(MAXVALUE)); +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM t1 WHERE id < 11; +SELECT * FROM t1 WHERE id >= 70; +SELECT * FROM dr1 ORDER BY fname, ftype; + +--echo # +--echo # Testing indexing on a partitioned table +--echo # +CREATE INDEX XID ON t1(id); +SHOW INDEX FROM t1; +SELECT * FROM dr1 ORDER BY fname, ftype; +EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id = 10; +DROP INDEX XID ON t1; +SHOW INDEX FROM t1; +SELECT * FROM dr1 ORDER BY fname, ftype; +ALTER TABLE t1 ADD PRIMARY KEY (id); +SHOW INDEX FROM t1; +SELECT * FROM dr1 ORDER BY fname, ftype; +EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id = 10; +ALTER TABLE t1 DROP PRIMARY KEY; +SHOW INDEX FROM t1; +SELECT * FROM dr1 ORDER BY fname, ftype; +DROP TABLE t1; +DROP TABLE dr1; + +# +# Clean up +# +set @@global.connect_exact_info=OFF; + +--remove_file $MYSQLD_DATADIR/test/part1.txt +--remove_file $MYSQLD_DATADIR/test/part2.txt +--remove_file $MYSQLD_DATADIR/test/part3.txt +#--remove_file $MYSQLD_DATADIR/test/part%s.fnx +#--remove_file $MYSQLD_DATADIR/test/part1.fnx +#--remove_file $MYSQLD_DATADIR/test/part2.fnx +#--remove_file $MYSQLD_DATADIR/test/part3.fnx diff --git a/storage/connect/mysql-test/connect/t/part_table.test b/storage/connect/mysql-test/connect/t/part_table.test index c5358d63c8e..d839337ba6f 100644 --- a/storage/connect/mysql-test/connect/t/part_table.test +++ b/storage/connect/mysql-test/connect/t/part_table.test @@ -1,92 +1,92 @@ ---source include/not_embedded.inc ---source include/have_partition.inc - -set @@global.connect_exact_info=ON; - -# -# These will be used by the t1 table partition table -# -CREATE TABLE xt1 ( -id INT KEY NOT NULL, -msg VARCHAR(32)) -ENGINE=MyISAM; -INSERT INTO xt1 VALUES(4, 'four'),(7,'seven'),(1,'one'),(8,'eight'); -SELECT * FROM xt1; - -CREATE TABLE xt2 ( -id INT KEY NOT NULL, -msg VARCHAR(32)); -INSERT INTO xt2 VALUES(10,'ten'),(40,'forty'),(11,'eleven'),(35,'thirty five'); -SELECT * FROM xt2; - -CREATE TABLE xt3 ( -id INT KEY NOT NULL, -msg VARCHAR(32)) -ENGINE=CONNECT TABLE_TYPE=CSV AVG_ROW_LENGTH=10; -INSERT INTO xt3 VALUES(60,'sixty'),(81,'eighty one'),(72,'seventy two'); -SELECT * FROM xt3; - -# -# Based on PROXY the table is not indexable -# -CREATE TABLE t1 ( -id INT NOT NULL, -msg VARCHAR(32)) -ENGINE=CONNECT TABLE_TYPE=PROXY TABNAME='xt%s' -PARTITION BY RANGE COLUMNS(id) ( -PARTITION `1` VALUES LESS THAN(10), -PARTITION `2` VALUES LESS THAN(50), -PARTITION `3` VALUES LESS THAN(MAXVALUE)); -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM t1; -DELETE FROM t1; ---error ER_UNKNOWN_ERROR -ALTER TABLE t1 ADD INDEX XID(id); -INSERT INTO t1 VALUES(4, 'four'); -INSERT INTO t1 VALUES(7,'seven'),(10,'ten'),(40,'forty'),(60,'sixty'),(81,'eighty one'); -INSERT INTO t1 VALUES(72,'seventy two'),(11,'eleven'),(1,'one'),(35,'thirty five'),(8,'eight'); -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM t1; -EXPLAIN PARTITIONS -SELECT * FROM t1 WHERE id = 81; -DELETE FROM t1; -DROP TABLE t1; - -# -# Based on MYSQL the table is indexable -# -CREATE TABLE t1 ( -id INT KEY NOT NULL, -msg VARCHAR(32)) -ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='xt%s' -PARTITION BY RANGE COLUMNS(id) ( -PARTITION `1` VALUES LESS THAN(10), -PARTITION `2` VALUES LESS THAN(50), -PARTITION `3` VALUES LESS THAN(MAXVALUE)); -SHOW INDEX FROM t1; -INSERT INTO t1 VALUES(4, 'four'); -INSERT INTO t1 VALUES(40, 'forty'); -INSERT INTO t1 VALUES(72,'seventy two'); -INSERT INTO t1 VALUES(7,'seven'),(10,'ten'),(60,'sixty'),(81,'eighty one'),(11,'eleven'),(1,'one'),(35,'thirty five'),(8,'eight'); -SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; -SELECT * FROM t1; -EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id = 81; -SELECT * FROM t1 WHERE id = 7; -SELECT * FROM t1 WHERE id = 35; -UPDATE t1 SET msg = 'number' WHERE id in (60,72); -UPDATE t1 SET msg = 'soixante' WHERE id = 60; -SELECT * FROM t1 WHERE id > 50; -UPDATE t1 SET msg = 'big' WHERE id > 50; -UPDATE t1 SET msg = 'sept' WHERE id = 7; -SELECT * FROM t1; -DELETE FROM t1 WHERE id in (60,72); -SELECT * FROM t1; -DROP TABLE t1; -DROP TABLE xt1; -DROP TABLE xt2; -DROP TABLE xt3; - -# -# Clean up -# -set @@global.connect_exact_info=OFF; +--source include/not_embedded.inc +--source include/have_partition.inc + +set @@global.connect_exact_info=ON; + +# +# These will be used by the t1 table partition table +# +CREATE TABLE xt1 ( +id INT KEY NOT NULL, +msg VARCHAR(32)) +ENGINE=MyISAM; +INSERT INTO xt1 VALUES(4, 'four'),(7,'seven'),(1,'one'),(8,'eight'); +SELECT * FROM xt1; + +CREATE TABLE xt2 ( +id INT KEY NOT NULL, +msg VARCHAR(32)); +INSERT INTO xt2 VALUES(10,'ten'),(40,'forty'),(11,'eleven'),(35,'thirty five'); +SELECT * FROM xt2; + +CREATE TABLE xt3 ( +id INT KEY NOT NULL, +msg VARCHAR(32)) +ENGINE=CONNECT TABLE_TYPE=CSV AVG_ROW_LENGTH=10; +INSERT INTO xt3 VALUES(60,'sixty'),(81,'eighty one'),(72,'seventy two'); +SELECT * FROM xt3; + +# +# Based on PROXY the table is not indexable +# +CREATE TABLE t1 ( +id INT NOT NULL, +msg VARCHAR(32)) +ENGINE=CONNECT TABLE_TYPE=PROXY TABNAME='xt%s' +PARTITION BY RANGE COLUMNS(id) ( +PARTITION `1` VALUES LESS THAN(10), +PARTITION `2` VALUES LESS THAN(50), +PARTITION `3` VALUES LESS THAN(MAXVALUE)); +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM t1; +DELETE FROM t1; +--error ER_UNKNOWN_ERROR +ALTER TABLE t1 ADD INDEX XID(id); +INSERT INTO t1 VALUES(4, 'four'); +INSERT INTO t1 VALUES(7,'seven'),(10,'ten'),(40,'forty'),(60,'sixty'),(81,'eighty one'); +INSERT INTO t1 VALUES(72,'seventy two'),(11,'eleven'),(1,'one'),(35,'thirty five'),(8,'eight'); +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM t1; +EXPLAIN PARTITIONS +SELECT * FROM t1 WHERE id = 81; +DELETE FROM t1; +DROP TABLE t1; + +# +# Based on MYSQL the table is indexable +# +CREATE TABLE t1 ( +id INT KEY NOT NULL, +msg VARCHAR(32)) +ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='xt%s' +PARTITION BY RANGE COLUMNS(id) ( +PARTITION `1` VALUES LESS THAN(10), +PARTITION `2` VALUES LESS THAN(50), +PARTITION `3` VALUES LESS THAN(MAXVALUE)); +SHOW INDEX FROM t1; +INSERT INTO t1 VALUES(4, 'four'); +INSERT INTO t1 VALUES(40, 'forty'); +INSERT INTO t1 VALUES(72,'seventy two'); +INSERT INTO t1 VALUES(7,'seven'),(10,'ten'),(60,'sixty'),(81,'eighty one'),(11,'eleven'),(1,'one'),(35,'thirty five'),(8,'eight'); +SELECT partition_name, table_rows FROM information_schema.partitions WHERE table_name = 't1'; +SELECT * FROM t1; +EXPLAIN PARTITIONS SELECT * FROM t1 WHERE id = 81; +SELECT * FROM t1 WHERE id = 7; +SELECT * FROM t1 WHERE id = 35; +UPDATE t1 SET msg = 'number' WHERE id in (60,72); +UPDATE t1 SET msg = 'soixante' WHERE id = 60; +SELECT * FROM t1 WHERE id > 50; +UPDATE t1 SET msg = 'big' WHERE id > 50; +UPDATE t1 SET msg = 'sept' WHERE id = 7; +SELECT * FROM t1; +DELETE FROM t1 WHERE id in (60,72); +SELECT * FROM t1; +DROP TABLE t1; +DROP TABLE xt1; +DROP TABLE xt2; +DROP TABLE xt3; + +# +# Clean up +# +set @@global.connect_exact_info=OFF; diff --git a/storage/connect/mysql-test/connect/t/pivot.test b/storage/connect/mysql-test/connect/t/pivot.test index d26e6cec628..09544f27afa 100644 --- a/storage/connect/mysql-test/connect/t/pivot.test +++ b/storage/connect/mysql-test/connect/t/pivot.test @@ -1,163 +1,163 @@ --- source include/not_embedded.inc - -let $MYSQLD_DATADIR= `select @@datadir`; -let $PORT= `select @@port`; ---copy_file $MTR_SUITE_DIR/std_data/expenses.txt $MYSQLD_DATADIR/test/expenses.txt - ---echo # ---echo # Testing the PIVOT table type ---echo # -CREATE TABLE expenses ( -Who CHAR(10) NOT NULL, -Week INT(2) NOT NULL, -What CHAR(12) NOT NULL, -Amount DOUBLE(8,2)) -ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='expenses.txt' ENDING=2; -SELECT * FROM expenses; - ---echo # ---echo # Pivoting from What ---echo # -CREATE TABLE pivex ( -Who CHAR(10) NOT NULL, -Week INT(2) NOT NULL, -Beer DOUBLE(8,2) FLAG=1, -Car DOUBLE(8,2) FLAG=1, -Food DOUBLE(8,2) FLAG=1) -ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=expenses; ---replace_result $PORT PORT ---eval ALTER TABLE pivex OPTION_LIST='port=$PORT' -SELECT * FROM pivex; - ---echo # ---echo # Restricting the columns in a Pivot Table ---echo # -ALTER TABLE pivex DROP COLUMN week; -SELECT * FROM pivex; - ---echo # ---echo # Using a source definition ---echo # -DROP TABLE pivex; -CREATE TABLE pivex ( -Who CHAR(10) NOT NULL, -Week INT(2) NOT NULL, -Beer DOUBLE(8,2) FLAG=1, -Car DOUBLE(8,2) FLAG=1, -Food DOUBLE(8,2) FLAG=1) -ENGINE=CONNECT TABLE_TYPE=PIVOT -SRCDEF='select who, week, what, sum(amount) as amount from expenses where week in (4,5) group by who, week, what'; ---replace_result $PORT PORT ---eval ALTER TABLE pivex OPTION_LIST='PivotCol=what,FncCol=amount,port=$PORT' -SELECT * FROM pivex; - ---echo # ---echo # Pivoting from Week ---echo # -DROP TABLE pivex; -CREATE TABLE pivex ( -Who CHAR(10) NOT NULL, -What CHAR(12) NOT NULL, -`3` DOUBLE(8,2) FLAG=1, -`4` DOUBLE(8,2) FLAG=1, -`5` DOUBLE(8,2) FLAG=1) -ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=expenses; ---replace_result $PORT PORT ---eval ALTER TABLE pivex OPTION_LIST='PivotCol=Week,port=$PORT' -SELECT * FROM pivex; - ---echo # ---echo # Using scalar functions and expresssions ---echo # -DROP TABLE pivex; -CREATE TABLE pivex ( -Who CHAR(10) NOT NULL, -What CHAR(12) NOT NULL, -First DOUBLE(8,2) FLAG=1, -Middle DOUBLE(8,2) FLAG=1, -Last DOUBLE(8,2) FLAG=1) -ENGINE=CONNECT TABLE_TYPE=PIVOT -SRCDEF='select who, what, case when week=3 then ''First'' when week=5 then ''Last'' else ''Middle'' end as wk, sum(amount) * 6.56 as amnt from expenses group by who, what, wk'; ---replace_result $PORT PORT ---eval ALTER TABLE pivex OPTION_LIST='PivotCol=wk,FncCol=amnt,port=$PORT' -SELECT * FROM pivex; -DROP TABLE pivex; -DROP TABLE expenses; - ---echo # ---echo # Make the PETS table ---echo # -CREATE TABLE pets ( -Name VARCHAR(12) NOT NULL, -Race CHAR(6) NOT NULL, -Number INT NOT NULL) ENGINE=MYISAM; -INSERT INTO pets VALUES('John','dog',2); -INSERT INTO pets VALUES('Bill','cat',1); -INSERT INTO pets VALUES('Mary','dog',1); -INSERT INTO pets VALUES('Mary','cat',1); -INSERT INTO pets VALUES('Lisbeth','rabbit',2); -INSERT INTO pets VALUES('Kevin','cat',2); -INSERT INTO pets VALUES('Kevin','bird',6); -INSERT INTO pets VALUES('Donald','dog',1); -INSERT INTO pets VALUES('Donald','fish',3); -SELECT * FROM pets; - ---echo # ---echo # Pivot the PETS table ---echo # -CREATE TABLE pivet ( -name VARCHAR(12) NOT NULL, -dog INT NOT NULL DEFAULT 0 FLAG=1, -cat INT NOT NULL DEFAULT 0 FLAG=1, -rabbit INT NOT NULL DEFAULT 0 FLAG=1, -bird INT NOT NULL DEFAULT 0 FLAG=1, -fish INT NOT NULL DEFAULT 0 FLAG=1) -ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=pets OPTION_LIST='PivotCol=race,groupby=1'; -SELECT * FROM pivet; -DROP TABLE pivet; - ---echo # ---echo # Testing the "data" column list ---echo # -CREATE TABLE pivet ( -name VARCHAR(12) NOT NULL, -dog INT NOT NULL DEFAULT 0 FLAG=1, -cat INT NOT NULL DEFAULT 0 FLAG=1) -ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=pets OPTION_LIST='PivotCol=race,groupby=1'; ---error ER_GET_ERRMSG -SELECT * FROM pivet; -ALTER TABLE pivet OPTION_LIST='PivotCol=race,groupby=1,accept=1'; -SELECT * FROM pivet; -DROP TABLE pivet; - ---echo # ---echo # Adding a "dump" column ---echo # -CREATE TABLE pivet ( -name VARCHAR(12) NOT NULL, -dog INT NOT NULL DEFAULT 0 FLAG=1, -cat INT NOT NULL DEFAULT 0 FLAG=1, -other INT NOT NULL DEFAULT 0 FLAG=2) -ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=pets OPTION_LIST='PivotCol=race,groupby=1'; -SELECT * FROM pivet; - -DROP TABLE pivet; -DROP TABLE pets; - ---echo # ---echo # MDEV-5734 ---echo # -CREATE TABLE fruit ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(32) NOT NULL, - `cnt` int(11) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1; -INSERT INTO fruit VALUES (1,'apple',1),(2,'banana',1),(3,'apple',2),(4,'cherry',4),(5,'durazno',2); -SELECT * FROM fruit; -CREATE TABLE fruit_pivot ENGINE=CONNECT TABLE_TYPE=pivot TABNAME=fruit; -SELECT * FROM fruit_pivot; - -DROP TABLE fruit_pivot; -DROP TABLE fruit; ---remove_file $MYSQLD_DATADIR/test/expenses.txt +-- source include/not_embedded.inc + +let $MYSQLD_DATADIR= `select @@datadir`; +let $PORT= `select @@port`; +--copy_file $MTR_SUITE_DIR/std_data/expenses.txt $MYSQLD_DATADIR/test/expenses.txt + +--echo # +--echo # Testing the PIVOT table type +--echo # +CREATE TABLE expenses ( +Who CHAR(10) NOT NULL, +Week INT(2) NOT NULL, +What CHAR(12) NOT NULL, +Amount DOUBLE(8,2)) +ENGINE=CONNECT TABLE_TYPE=FIX FILE_NAME='expenses.txt' ENDING=2; +SELECT * FROM expenses; + +--echo # +--echo # Pivoting from What +--echo # +CREATE TABLE pivex ( +Who CHAR(10) NOT NULL, +Week INT(2) NOT NULL, +Beer DOUBLE(8,2) FLAG=1, +Car DOUBLE(8,2) FLAG=1, +Food DOUBLE(8,2) FLAG=1) +ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=expenses; +--replace_result $PORT PORT +--eval ALTER TABLE pivex OPTION_LIST='port=$PORT' +SELECT * FROM pivex; + +--echo # +--echo # Restricting the columns in a Pivot Table +--echo # +ALTER TABLE pivex DROP COLUMN week; +SELECT * FROM pivex; + +--echo # +--echo # Using a source definition +--echo # +DROP TABLE pivex; +CREATE TABLE pivex ( +Who CHAR(10) NOT NULL, +Week INT(2) NOT NULL, +Beer DOUBLE(8,2) FLAG=1, +Car DOUBLE(8,2) FLAG=1, +Food DOUBLE(8,2) FLAG=1) +ENGINE=CONNECT TABLE_TYPE=PIVOT +SRCDEF='select who, week, what, sum(amount) as amount from expenses where week in (4,5) group by who, week, what'; +--replace_result $PORT PORT +--eval ALTER TABLE pivex OPTION_LIST='PivotCol=what,FncCol=amount,port=$PORT' +SELECT * FROM pivex; + +--echo # +--echo # Pivoting from Week +--echo # +DROP TABLE pivex; +CREATE TABLE pivex ( +Who CHAR(10) NOT NULL, +What CHAR(12) NOT NULL, +`3` DOUBLE(8,2) FLAG=1, +`4` DOUBLE(8,2) FLAG=1, +`5` DOUBLE(8,2) FLAG=1) +ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=expenses; +--replace_result $PORT PORT +--eval ALTER TABLE pivex OPTION_LIST='PivotCol=Week,port=$PORT' +SELECT * FROM pivex; + +--echo # +--echo # Using scalar functions and expresssions +--echo # +DROP TABLE pivex; +CREATE TABLE pivex ( +Who CHAR(10) NOT NULL, +What CHAR(12) NOT NULL, +First DOUBLE(8,2) FLAG=1, +Middle DOUBLE(8,2) FLAG=1, +Last DOUBLE(8,2) FLAG=1) +ENGINE=CONNECT TABLE_TYPE=PIVOT +SRCDEF='select who, what, case when week=3 then ''First'' when week=5 then ''Last'' else ''Middle'' end as wk, sum(amount) * 6.56 as amnt from expenses group by who, what, wk'; +--replace_result $PORT PORT +--eval ALTER TABLE pivex OPTION_LIST='PivotCol=wk,FncCol=amnt,port=$PORT' +SELECT * FROM pivex; +DROP TABLE pivex; +DROP TABLE expenses; + +--echo # +--echo # Make the PETS table +--echo # +CREATE TABLE pets ( +Name VARCHAR(12) NOT NULL, +Race CHAR(6) NOT NULL, +Number INT NOT NULL) ENGINE=MYISAM; +INSERT INTO pets VALUES('John','dog',2); +INSERT INTO pets VALUES('Bill','cat',1); +INSERT INTO pets VALUES('Mary','dog',1); +INSERT INTO pets VALUES('Mary','cat',1); +INSERT INTO pets VALUES('Lisbeth','rabbit',2); +INSERT INTO pets VALUES('Kevin','cat',2); +INSERT INTO pets VALUES('Kevin','bird',6); +INSERT INTO pets VALUES('Donald','dog',1); +INSERT INTO pets VALUES('Donald','fish',3); +SELECT * FROM pets; + +--echo # +--echo # Pivot the PETS table +--echo # +CREATE TABLE pivet ( +name VARCHAR(12) NOT NULL, +dog INT NOT NULL DEFAULT 0 FLAG=1, +cat INT NOT NULL DEFAULT 0 FLAG=1, +rabbit INT NOT NULL DEFAULT 0 FLAG=1, +bird INT NOT NULL DEFAULT 0 FLAG=1, +fish INT NOT NULL DEFAULT 0 FLAG=1) +ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=pets OPTION_LIST='PivotCol=race,groupby=1'; +SELECT * FROM pivet; +DROP TABLE pivet; + +--echo # +--echo # Testing the "data" column list +--echo # +CREATE TABLE pivet ( +name VARCHAR(12) NOT NULL, +dog INT NOT NULL DEFAULT 0 FLAG=1, +cat INT NOT NULL DEFAULT 0 FLAG=1) +ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=pets OPTION_LIST='PivotCol=race,groupby=1'; +--error ER_GET_ERRMSG +SELECT * FROM pivet; +ALTER TABLE pivet OPTION_LIST='PivotCol=race,groupby=1,accept=1'; +SELECT * FROM pivet; +DROP TABLE pivet; + +--echo # +--echo # Adding a "dump" column +--echo # +CREATE TABLE pivet ( +name VARCHAR(12) NOT NULL, +dog INT NOT NULL DEFAULT 0 FLAG=1, +cat INT NOT NULL DEFAULT 0 FLAG=1, +other INT NOT NULL DEFAULT 0 FLAG=2) +ENGINE=CONNECT TABLE_TYPE=PIVOT TABNAME=pets OPTION_LIST='PivotCol=race,groupby=1'; +SELECT * FROM pivet; + +DROP TABLE pivet; +DROP TABLE pets; + +--echo # +--echo # MDEV-5734 +--echo # +CREATE TABLE fruit ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(32) NOT NULL, + `cnt` int(11) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1; +INSERT INTO fruit VALUES (1,'apple',1),(2,'banana',1),(3,'apple',2),(4,'cherry',4),(5,'durazno',2); +SELECT * FROM fruit; +CREATE TABLE fruit_pivot ENGINE=CONNECT TABLE_TYPE=pivot TABNAME=fruit; +SELECT * FROM fruit_pivot; + +DROP TABLE fruit_pivot; +DROP TABLE fruit; +--remove_file $MYSQLD_DATADIR/test/expenses.txt diff --git a/storage/connect/mysql-test/connect/t/tbl.test b/storage/connect/mysql-test/connect/t/tbl.test index bdd928366ef..43c506c9403 100644 --- a/storage/connect/mysql-test/connect/t/tbl.test +++ b/storage/connect/mysql-test/connect/t/tbl.test @@ -1,53 +1,53 @@ --- source include/not_embedded.inc - -let $MYSQLD_DATADIR= `select @@datadir`; -let $PORT= `select @@port`; - ---echo # ---echo # Checking TBL tables ---echo # -CREATE TABLE t1 ( -a INT NOT NULL, -message CHAR(10)) ENGINE=connect; -INSERT INTO t1 VALUES (1,'Testing'),(2,'dos table'),(3,'t1'); -SELECT * FROM t1; - -CREATE TABLE t2 ( -a INT NOT NULL, -message CHAR(10)) ENGINE=connect TABLE_TYPE=BIN; -INSERT INTO t2 VALUES (1,'Testing'),(2,NULL),(3,'t2'); -SELECT * FROM t2; - -CREATE TABLE t3 ( -a INT NOT NULL, -message CHAR(10)) ENGINE=connect TABLE_TYPE=CSV; -INSERT INTO t3 VALUES (1,'Testing'),(2,'csv table'),(3,'t3'); -SELECT * FROM t3; - -CREATE TABLE t4 ( -ta INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -message CHAR(20)) ENGINE=MyISAM; -INSERT INTO t4 (message) VALUES ('Testing'),('myisam table'),('t4'); -SELECT * FROM t4; - ---replace_result $PORT PORT ---eval CREATE TABLE total (tabname CHAR(8) NOT NULL SPECIAL='TABID', ta TINYINT NOT NULL FLAG=1, message CHAR(20)) engine=CONNECT table_type=TBL table_list='t1,t2,t3,t4' option_list='port=$PORT' - -select * from total; -select * from total where tabname = 't2'; -select * from total where tabname = 't2' and ta = 3; -select * from total where tabname in ('t1','t4'); -select * from total where ta = 3 and tabname in ('t1','t2'); -select * from total where tabname <> 't2'; -select * from total where tabname != 't2' and ta = 3; -select * from total where tabname not in ('t2','t3'); -select * from total where ta = 3 and tabname in ('t2','t3'); -select * from total where ta = 3 or tabname in ('t2','t4'); -select * from total where not tabname = 't2'; -select * from total where tabname = 't2' or tabname = 't1'; - -DROP TABLE total; -DROP TABLE t1; -DROP TABLE t2; -DROP TABLE t3; -DROP TABLE t4; +-- source include/not_embedded.inc + +let $MYSQLD_DATADIR= `select @@datadir`; +let $PORT= `select @@port`; + +--echo # +--echo # Checking TBL tables +--echo # +CREATE TABLE t1 ( +a INT NOT NULL, +message CHAR(10)) ENGINE=connect; +INSERT INTO t1 VALUES (1,'Testing'),(2,'dos table'),(3,'t1'); +SELECT * FROM t1; + +CREATE TABLE t2 ( +a INT NOT NULL, +message CHAR(10)) ENGINE=connect TABLE_TYPE=BIN; +INSERT INTO t2 VALUES (1,'Testing'),(2,NULL),(3,'t2'); +SELECT * FROM t2; + +CREATE TABLE t3 ( +a INT NOT NULL, +message CHAR(10)) ENGINE=connect TABLE_TYPE=CSV; +INSERT INTO t3 VALUES (1,'Testing'),(2,'csv table'),(3,'t3'); +SELECT * FROM t3; + +CREATE TABLE t4 ( +ta INT NOT NULL AUTO_INCREMENT PRIMARY KEY, +message CHAR(20)) ENGINE=MyISAM; +INSERT INTO t4 (message) VALUES ('Testing'),('myisam table'),('t4'); +SELECT * FROM t4; + +--replace_result $PORT PORT +--eval CREATE TABLE total (tabname CHAR(8) NOT NULL SPECIAL='TABID', ta TINYINT NOT NULL FLAG=1, message CHAR(20)) engine=CONNECT table_type=TBL table_list='t1,t2,t3,t4' option_list='port=$PORT' + +select * from total; +select * from total where tabname = 't2'; +select * from total where tabname = 't2' and ta = 3; +select * from total where tabname in ('t1','t4'); +select * from total where ta = 3 and tabname in ('t1','t2'); +select * from total where tabname <> 't2'; +select * from total where tabname != 't2' and ta = 3; +select * from total where tabname not in ('t2','t3'); +select * from total where ta = 3 and tabname in ('t2','t3'); +select * from total where ta = 3 or tabname in ('t2','t4'); +select * from total where not tabname = 't2'; +select * from total where tabname = 't2' or tabname = 't1'; + +DROP TABLE total; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; diff --git a/storage/connect/mysql-test/connect/t/unsigned.test b/storage/connect/mysql-test/connect/t/unsigned.test index 4374566086d..44eb832f8ae 100644 --- a/storage/connect/mysql-test/connect/t/unsigned.test +++ b/storage/connect/mysql-test/connect/t/unsigned.test @@ -1,35 +1,35 @@ ---echo # ---echo # Testing unsigned types ---echo # -DROP TABLE IF EXISTS t1; -CREATE TABLE t1 ( -a TINYINT UNSIGNED NOT NULL, -b SMALLINT ZEROFILL NOT NULL, -c INT UNSIGNED NOT NULL, -d BIGINT UNSIGNED NOT NULL, -e CHAR(32) NOT NULL DEFAULT '???') ENGINE=CONNECT TABLE_TYPE=FIX; -DESCRIBE t1; -INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615); -SELECT * FROM t1; -UPDATE t1 SET e = d; -SELECT * FROM t1; -UPDATE t1 SET c = d; -SELECT * FROM t1; -UPDATE t1 SET c = e; -SELECT * FROM t1; -UPDATE t1 SET d = e; -SELECT * FROM t1; - -DROP TABLE IF EXISTS t2; -CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=PROXY TABNAME=t1; -DESCRIBE t2; -SELECT * FROM t2; - -# Moved to mysql.test (cannot be executed if embedded) -#DROP TABLE t2; -#CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME=t1; -#DESCRIBE t2; -#SELECT * FROM t2; - -DROP TABLE t2; -DROP TABLE t1; +--echo # +--echo # Testing unsigned types +--echo # +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 ( +a TINYINT UNSIGNED NOT NULL, +b SMALLINT ZEROFILL NOT NULL, +c INT UNSIGNED NOT NULL, +d BIGINT UNSIGNED NOT NULL, +e CHAR(32) NOT NULL DEFAULT '???') ENGINE=CONNECT TABLE_TYPE=FIX; +DESCRIBE t1; +INSERT INTO t1(a,b,c,d) VALUES(255,65535,4294967295,18446744073709551615); +SELECT * FROM t1; +UPDATE t1 SET e = d; +SELECT * FROM t1; +UPDATE t1 SET c = d; +SELECT * FROM t1; +UPDATE t1 SET c = e; +SELECT * FROM t1; +UPDATE t1 SET d = e; +SELECT * FROM t1; + +DROP TABLE IF EXISTS t2; +CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=PROXY TABNAME=t1; +DESCRIBE t2; +SELECT * FROM t2; + +# Moved to mysql.test (cannot be executed if embedded) +#DROP TABLE t2; +#CREATE TABLE t2 ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME=t1; +#DESCRIBE t2; +#SELECT * FROM t2; + +DROP TABLE t2; +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/upd.test b/storage/connect/mysql-test/connect/t/upd.test index f6461bfed96..a3716694c4a 100644 --- a/storage/connect/mysql-test/connect/t/upd.test +++ b/storage/connect/mysql-test/connect/t/upd.test @@ -1,153 +1,153 @@ -let $MYSQLD_DATADIR= `select @@datadir`; ---copy_file $MTR_SUITE_DIR/std_data/employee.dat $MYSQLD_DATADIR/test/employee.dat - -CREATE TABLE employee -( -serialno CHAR(5) NOT NULL, -name VARCHAR(12) NOT NULL FLAG=6, -sex TINYINT(1) NOT NULL, -title VARCHAR(15) NOT NULL FLAG=20, -manager CHAR(5) NOT NULL, -department CHAR(4) NOT NULL FLAG=41, -secretary CHAR(5) NOT NULL FLAG=46, -salary DOUBLE(8,2) NOT NULL FLAG=52 -) ENGINE=connect TABLE_TYPE=fix FILE_NAME='employee.dat' ENDING=1; -SELECT * FROM employee; - -DELIMITER //; -CREATE PROCEDURE test.tst_up() DETERMINISTIC -BEGIN -SELECT * FROM t1; -UPDATE t1 SET salary = salary + 1, title = 'RESEARCH' WHERE title = 'SCIENTIST'; -UPDATE t1 SET salary = salary + 1, title = 'TECHNICIAN' WHERE title = 'ENGINEER'; -UPDATE t1 SET title = 'PUPPET' WHERE name = 'TONGHO'; -UPDATE t1 SET salary = 0. WHERE title = 'XXX'; -SELECT * FROM t1; -DELETE FROM t1 WHERE title = 'SECRETARY'; -DELETE FROM t1 WHERE title = 'DIRECTOR'; -DELETE FROM t1 WHERE title = 'TYPIST'; -SELECT * FROM t1; -DELETE FROM t1 LIMIT 3; -INSERT INTO t1(serialno, name, title, salary) VALUES('66666','NEWMAN','ENGINEER',10000.80); -SELECT * FROM t1; -DROP TABLE t1; -END// -DELIMITER ;// - ---echo # ---echo # Testing DOS table changes ---echo # -CREATE TABLE t1 ENGINE=connect AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing DOS table changes ---echo # -CREATE TABLE t1 ENGINE=connect mapped=yes AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing FIX table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=fix AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing FIX table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=fix mapped=yes AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing FIX table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=fix huge=yes AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing CSV table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=csv AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing CSV table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=csv mapped=yes AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing DBF table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=dbf AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing DBF table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=dbf mapped=yes AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing BIN table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=bin AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing BIN table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=bin mapped=yes AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing BIN table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=bin huge=yes AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing VEC table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=vec MAX_ROWS=30 AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing VEC table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=vec mapped=yes MAX_ROWS=30 AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing VEC table changes ---echo # -CREATE TABLE t1 ENGINE=connect TABLE_TYPE=vec huge=yes MAX_ROWS=30 AS SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing INI table changes ---echo # -CREATE TABLE t1 -( -serialno CHAR(5) NOT NULL FLAG=1, -name VARCHAR(12) NOT NULL, -sex TINYINT(1), -title VARCHAR(15) NOT NULL, -manager CHAR(5), -department CHAR(4), -secretary CHAR(5), -salary DOUBLE(8,2) NOT NULL -) ENGINE=connect TABLE_TYPE=ini; -INSERT INTO t1 SELECT * FROM employee; -CALL test.tst_up(); - ---echo # ---echo # Testing XML table changes (must be in a separate test) ---echo # -#CREATE TABLE t1 ENGINE=connect TABLE_TYPE=xml option_list='rownode=dd' AS SELECT * FROM employee; -#CALL test.tst_up(); - -DROP PROCEDURE test.tst_up; -DROP TABLE employee; - ---remove_file $MYSQLD_DATADIR/test/employee.dat +let $MYSQLD_DATADIR= `select @@datadir`; +--copy_file $MTR_SUITE_DIR/std_data/employee.dat $MYSQLD_DATADIR/test/employee.dat + +CREATE TABLE employee +( +serialno CHAR(5) NOT NULL, +name VARCHAR(12) NOT NULL FLAG=6, +sex TINYINT(1) NOT NULL, +title VARCHAR(15) NOT NULL FLAG=20, +manager CHAR(5) NOT NULL, +department CHAR(4) NOT NULL FLAG=41, +secretary CHAR(5) NOT NULL FLAG=46, +salary DOUBLE(8,2) NOT NULL FLAG=52 +) ENGINE=connect TABLE_TYPE=fix FILE_NAME='employee.dat' ENDING=1; +SELECT * FROM employee; + +DELIMITER //; +CREATE PROCEDURE test.tst_up() DETERMINISTIC +BEGIN +SELECT * FROM t1; +UPDATE t1 SET salary = salary + 1, title = 'RESEARCH' WHERE title = 'SCIENTIST'; +UPDATE t1 SET salary = salary + 1, title = 'TECHNICIAN' WHERE title = 'ENGINEER'; +UPDATE t1 SET title = 'PUPPET' WHERE name = 'TONGHO'; +UPDATE t1 SET salary = 0. WHERE title = 'XXX'; +SELECT * FROM t1; +DELETE FROM t1 WHERE title = 'SECRETARY'; +DELETE FROM t1 WHERE title = 'DIRECTOR'; +DELETE FROM t1 WHERE title = 'TYPIST'; +SELECT * FROM t1; +DELETE FROM t1 LIMIT 3; +INSERT INTO t1(serialno, name, title, salary) VALUES('66666','NEWMAN','ENGINEER',10000.80); +SELECT * FROM t1; +DROP TABLE t1; +END// +DELIMITER ;// + +--echo # +--echo # Testing DOS table changes +--echo # +CREATE TABLE t1 ENGINE=connect AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing DOS table changes +--echo # +CREATE TABLE t1 ENGINE=connect mapped=yes AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing FIX table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=fix AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing FIX table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=fix mapped=yes AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing FIX table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=fix huge=yes AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing CSV table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=csv AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing CSV table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=csv mapped=yes AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing DBF table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=dbf AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing DBF table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=dbf mapped=yes AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing BIN table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=bin AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing BIN table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=bin mapped=yes AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing BIN table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=bin huge=yes AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing VEC table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=vec MAX_ROWS=30 AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing VEC table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=vec mapped=yes MAX_ROWS=30 AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing VEC table changes +--echo # +CREATE TABLE t1 ENGINE=connect TABLE_TYPE=vec huge=yes MAX_ROWS=30 AS SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing INI table changes +--echo # +CREATE TABLE t1 +( +serialno CHAR(5) NOT NULL FLAG=1, +name VARCHAR(12) NOT NULL, +sex TINYINT(1), +title VARCHAR(15) NOT NULL, +manager CHAR(5), +department CHAR(4), +secretary CHAR(5), +salary DOUBLE(8,2) NOT NULL +) ENGINE=connect TABLE_TYPE=ini; +INSERT INTO t1 SELECT * FROM employee; +CALL test.tst_up(); + +--echo # +--echo # Testing XML table changes (must be in a separate test) +--echo # +#CREATE TABLE t1 ENGINE=connect TABLE_TYPE=xml option_list='rownode=dd' AS SELECT * FROM employee; +#CALL test.tst_up(); + +DROP PROCEDURE test.tst_up; +DROP TABLE employee; + +--remove_file $MYSQLD_DATADIR/test/employee.dat diff --git a/storage/connect/mysql-test/connect/t/updelx.test b/storage/connect/mysql-test/connect/t/updelx.test index ab336d4b168..19d0d790a30 100644 --- a/storage/connect/mysql-test/connect/t/updelx.test +++ b/storage/connect/mysql-test/connect/t/updelx.test @@ -1,96 +1,96 @@ --- source include/not_embedded.inc -let $MYSQLD_DATADIR= `select @@datadir`; - ---echo # ---echo # Testing indexed UPDATE and DELETE for all table types ---echo # - ---echo # CSV table -CREATE TABLE t1 ( -id INT KEY NOT NULL, -msg VARCHAR(32)) -ENGINE=CONNECT TABLE_TYPE=CSV AVG_ROW_LENGTH=6; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -ALTER TABLE t1 MAPPED=NO BLOCK_SIZE=6; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -DROP TABLE t1; - ---echo # DOS table -CREATE TABLE t1 ( -id INT(4) KEY NOT NULL, -msg VARCHAR(16)) -ENGINE=CONNECT TABLE_TYPE=DOS; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -ALTER TABLE t1 MAPPED=NO BLOCK_SIZE=4; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -DROP TABLE t1; - ---echo # FIX table -CREATE TABLE t1 ( -id INT(4) KEY NOT NULL, -msg VARCHAR(16) CHARSET BINARY DISTRIB=CLUSTERED) -ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=4; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -ALTER TABLE t1 MAPPED=NO HUGE=YES; --- source updelx.inc -DROP TABLE t1; - ---echo # BIN table -CREATE TABLE t1 ( -id INT(4) KEY NOT NULL, -msg VARCHAR(16) CHARSET BINARY DISTRIB=CLUSTERED) -ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=8; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -ALTER TABLE t1 MAPPED=NO HUGE=YES; --- source updelx.inc -DROP TABLE t1; - ---echo # DBF table -CREATE TABLE t1 ( -id INT(4) KEY NOT NULL, -msg VARCHAR(16)) -ENGINE=CONNECT TABLE_TYPE=DBF BLOCK_SIZE=12; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -#ALTER TABLE t1 MAPPED=NO HUGE=YES; -#-- source updelx.inc -DROP TABLE t1; - ---echo # VEC table -CREATE TABLE t1 ( -id INT(4) KEY NOT NULL, -msg VARCHAR(16)) -ENGINE=CONNECT TABLE_TYPE=VEC BLOCK_SIZE=6 MAX_ROWS=16; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -ALTER TABLE t1 MAPPED=NO HUGE=YES; --- source updelx.inc -DROP TABLE t1; - ---echo # Split VEC table (outward) -CREATE TABLE t1 ( -id INT(4) KEY NOT NULL, -msg VARCHAR(16)) -ENGINE=CONNECT TABLE_TYPE=VEC BLOCK_SIZE=6 FILE_NAME='tx.vec'; --- source updelx.inc -ALTER TABLE t1 MAPPED=YES; --- source updelx.inc -DROP TABLE t1; - -# Cleanup ---remove_file $MYSQLD_DATADIR/test/tx1.vec ---remove_file $MYSQLD_DATADIR/test/tx2.vec +-- source include/not_embedded.inc +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # +--echo # Testing indexed UPDATE and DELETE for all table types +--echo # + +--echo # CSV table +CREATE TABLE t1 ( +id INT KEY NOT NULL, +msg VARCHAR(32)) +ENGINE=CONNECT TABLE_TYPE=CSV AVG_ROW_LENGTH=6; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +ALTER TABLE t1 MAPPED=NO BLOCK_SIZE=6; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +DROP TABLE t1; + +--echo # DOS table +CREATE TABLE t1 ( +id INT(4) KEY NOT NULL, +msg VARCHAR(16)) +ENGINE=CONNECT TABLE_TYPE=DOS; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +ALTER TABLE t1 MAPPED=NO BLOCK_SIZE=4; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +DROP TABLE t1; + +--echo # FIX table +CREATE TABLE t1 ( +id INT(4) KEY NOT NULL, +msg VARCHAR(16) CHARSET BINARY DISTRIB=CLUSTERED) +ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=4; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +ALTER TABLE t1 MAPPED=NO HUGE=YES; +-- source updelx.inc +DROP TABLE t1; + +--echo # BIN table +CREATE TABLE t1 ( +id INT(4) KEY NOT NULL, +msg VARCHAR(16) CHARSET BINARY DISTRIB=CLUSTERED) +ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=8; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +ALTER TABLE t1 MAPPED=NO HUGE=YES; +-- source updelx.inc +DROP TABLE t1; + +--echo # DBF table +CREATE TABLE t1 ( +id INT(4) KEY NOT NULL, +msg VARCHAR(16)) +ENGINE=CONNECT TABLE_TYPE=DBF BLOCK_SIZE=12; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +#ALTER TABLE t1 MAPPED=NO HUGE=YES; +#-- source updelx.inc +DROP TABLE t1; + +--echo # VEC table +CREATE TABLE t1 ( +id INT(4) KEY NOT NULL, +msg VARCHAR(16)) +ENGINE=CONNECT TABLE_TYPE=VEC BLOCK_SIZE=6 MAX_ROWS=16; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +ALTER TABLE t1 MAPPED=NO HUGE=YES; +-- source updelx.inc +DROP TABLE t1; + +--echo # Split VEC table (outward) +CREATE TABLE t1 ( +id INT(4) KEY NOT NULL, +msg VARCHAR(16)) +ENGINE=CONNECT TABLE_TYPE=VEC BLOCK_SIZE=6 FILE_NAME='tx.vec'; +-- source updelx.inc +ALTER TABLE t1 MAPPED=YES; +-- source updelx.inc +DROP TABLE t1; + +# Cleanup +--remove_file $MYSQLD_DATADIR/test/tx1.vec +--remove_file $MYSQLD_DATADIR/test/tx2.vec diff --git a/storage/connect/mysql-test/connect/t/updelx2.test b/storage/connect/mysql-test/connect/t/updelx2.test index bf5434636ee..8b90851a127 100644 --- a/storage/connect/mysql-test/connect/t/updelx2.test +++ b/storage/connect/mysql-test/connect/t/updelx2.test @@ -1,22 +1,22 @@ --- source include/not_embedded.inc - ---echo # ---echo # Testing multiple indexed UPDATE and DELETE ---echo # -CREATE TABLE t1 ( -id INT(4) NOT NULL, -msg VARCHAR(16) NOT NULL, -INDEX IDM(id,msg)) -ENGINE=CONNECT TABLE_TYPE=DOS; -INSERT INTO t1 VALUES(1,'one'),(4, 'four'),(7,'seven'),(8,'eight'),(10,'ten'),(11,'eleven'),(40,'forty'),(35,'thirty five'),(60,'sixty'),(72,'seventy two'),(81,'eighty one'); -INSERT INTO t1 VALUES(1,'un'),(4, 'quatre'),(7,'sept'),(8,'huit'),(10,'dix'),(11,'onze'),(40,'quarante'),(35,'trente cinq'),(60,'soixante'),(72,'soixante douze'),(81,'quatrevingt un'); -SELECT * FROM t1 IGNORE INDEX (IDM); -UPDATE t1 SET msg = 'dieci' WHERE id = 10; -SELECT * FROM t1 IGNORE INDEX (IDM); -UPDATE t1 SET msg = 'septante deux' WHERE id = 72; -SELECT * FROM t1 IGNORE INDEX (IDM); -UPDATE t1 SET id=2, msg='deux' WHERE id=4 AND msg='quatre'; -SELECT * FROM t1 IGNORE INDEX (IDM); -DELETE FROM t1 WHERE id IN (8,40); -SELECT * FROM t1 IGNORE INDEX (IDM); -DROP TABLE t1; +-- source include/not_embedded.inc + +--echo # +--echo # Testing multiple indexed UPDATE and DELETE +--echo # +CREATE TABLE t1 ( +id INT(4) NOT NULL, +msg VARCHAR(16) NOT NULL, +INDEX IDM(id,msg)) +ENGINE=CONNECT TABLE_TYPE=DOS; +INSERT INTO t1 VALUES(1,'one'),(4, 'four'),(7,'seven'),(8,'eight'),(10,'ten'),(11,'eleven'),(40,'forty'),(35,'thirty five'),(60,'sixty'),(72,'seventy two'),(81,'eighty one'); +INSERT INTO t1 VALUES(1,'un'),(4, 'quatre'),(7,'sept'),(8,'huit'),(10,'dix'),(11,'onze'),(40,'quarante'),(35,'trente cinq'),(60,'soixante'),(72,'soixante douze'),(81,'quatrevingt un'); +SELECT * FROM t1 IGNORE INDEX (IDM); +UPDATE t1 SET msg = 'dieci' WHERE id = 10; +SELECT * FROM t1 IGNORE INDEX (IDM); +UPDATE t1 SET msg = 'septante deux' WHERE id = 72; +SELECT * FROM t1 IGNORE INDEX (IDM); +UPDATE t1 SET id=2, msg='deux' WHERE id=4 AND msg='quatre'; +SELECT * FROM t1 IGNORE INDEX (IDM); +DELETE FROM t1 WHERE id IN (8,40); +SELECT * FROM t1 IGNORE INDEX (IDM); +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/xcol.test b/storage/connect/mysql-test/connect/t/xcol.test index 8f0edc2b268..e0183f01db8 100644 --- a/storage/connect/mysql-test/connect/t/xcol.test +++ b/storage/connect/mysql-test/connect/t/xcol.test @@ -1,41 +1,41 @@ ---echo # ---echo # Make the children list table ---echo # -CREATE TABLE chlist ( -mother char(12) NOT NULL COMMENT 'The mother of the listed children', -children varchar(30) DEFAULT NULL COMMENT 'The comma separated list of children' -) ENGINE=CONNECT; -INSERT INTO chlist VALUES('Sophia','Vivian, Antony'); -INSERT INTO chlist VALUES('Lisbeth','Lucy,Charles,Diana'); -INSERT INTO chlist VALUES('Corinne',NULL); -INSERT INTO chlist VALUES('Claude','Marc'); -INSERT INTO chlist VALUES('Janet','Arthur,Sandra,Peter,John'); -SELECT * FROM chlist; - ---echo # ---echo # Checking XCOL tables ---echo # -CREATE TABLE child ENGINE=CONNECT TABLE_TYPE=XCOL TABNAME=chlist OPTION_LIST='colname=children'; -SELECT * FROM child; -SELECT * FROM child ORDER BY mother; -SELECT * FROM child ORDER BY children; -SELECT mother FROM child; -SELECT mother, COUNT(*) FROM child GROUP BY mother; -SELECT mother, COUNT(children) FROM child GROUP BY mother; - ---echo # ---echo # Test using special columns ---echo # -CREATE TABLE `child2` ( - `row` int NOT NULL SPECIAL=ROWID, - `num` int NOT NULL SPECIAL=ROWNUM, - `mother` varchar(12) NOT NULL COMMENT 'The mother of the children', - `child` varchar(12) NOT NULL COMMENT 'The child name' FLAG=2 -) ENGINE=CONNECT TABLE_TYPE=XCOL TABNAME=chlist `OPTION_LIST`='colname=child'; -SELECT * FROM child2; ---echo # List only first child -SELECT mother, child FROM child2 where num = 1; - -DROP TABLE child; -DROP TABLE chlist; -DROP TABLE child2; +--echo # +--echo # Make the children list table +--echo # +CREATE TABLE chlist ( +mother char(12) NOT NULL COMMENT 'The mother of the listed children', +children varchar(30) DEFAULT NULL COMMENT 'The comma separated list of children' +) ENGINE=CONNECT; +INSERT INTO chlist VALUES('Sophia','Vivian, Antony'); +INSERT INTO chlist VALUES('Lisbeth','Lucy,Charles,Diana'); +INSERT INTO chlist VALUES('Corinne',NULL); +INSERT INTO chlist VALUES('Claude','Marc'); +INSERT INTO chlist VALUES('Janet','Arthur,Sandra,Peter,John'); +SELECT * FROM chlist; + +--echo # +--echo # Checking XCOL tables +--echo # +CREATE TABLE child ENGINE=CONNECT TABLE_TYPE=XCOL TABNAME=chlist OPTION_LIST='colname=children'; +SELECT * FROM child; +SELECT * FROM child ORDER BY mother; +SELECT * FROM child ORDER BY children; +SELECT mother FROM child; +SELECT mother, COUNT(*) FROM child GROUP BY mother; +SELECT mother, COUNT(children) FROM child GROUP BY mother; + +--echo # +--echo # Test using special columns +--echo # +CREATE TABLE `child2` ( + `row` int NOT NULL SPECIAL=ROWID, + `num` int NOT NULL SPECIAL=ROWNUM, + `mother` varchar(12) NOT NULL COMMENT 'The mother of the children', + `child` varchar(12) NOT NULL COMMENT 'The child name' FLAG=2 +) ENGINE=CONNECT TABLE_TYPE=XCOL TABNAME=chlist `OPTION_LIST`='colname=child'; +SELECT * FROM child2; +--echo # List only first child +SELECT mother, child FROM child2 where num = 1; + +DROP TABLE child; +DROP TABLE chlist; +DROP TABLE child2; diff --git a/storage/connect/mysql-test/connect/t/xml_html.test b/storage/connect/mysql-test/connect/t/xml_html.test new file mode 100644 index 00000000000..1c84b46ec38 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/xml_html.test @@ -0,0 +1,39 @@ +--source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +SET NAMES utf8; + +--copy_file $MTR_SUITE_DIR/std_data/beers.xml $MYSQLD_DATADIR/test/beers.xml +--copy_file $MTR_SUITE_DIR/std_data/coffee.htm $MYSQLD_DATADIR/test/coffee.htm + +--echo # +--echo # Testing HTML like XML file +--echo # +CREATE TABLE beers ( +`Name` CHAR(16) FIELD_FORMAT='brandName', +`Origin` CHAR(16) FIELD_FORMAT='origin', +`Description` CHAR(32) FIELD_FORMAT='details') +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml' +TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td'; +SELECT * FROM beers; +DROP TABLE beers; + +--echo # +--echo # Testing HTML file +--echo # +CREATE TABLE coffee ( +`Name` CHAR(16), +`Cups` INT(8), +`Type` CHAR(16), +`Sugar` CHAR(4)) +ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm' +TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML'; +SELECT * FROM coffee; +DROP TABLE coffee; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/beers.xml +--remove_file $MYSQLD_DATADIR/test/coffee.htm diff --git a/storage/connect/mysql-test/connect/t/xml_mdev5261.test b/storage/connect/mysql-test/connect/t/xml_mdev5261.test index 214900a68d6..b554f251e09 100644 --- a/storage/connect/mysql-test/connect/t/xml_mdev5261.test +++ b/storage/connect/mysql-test/connect/t/xml_mdev5261.test @@ -1,27 +1,27 @@ ---source have_libxml2.inc - -let $MYSQLD_DATADIR= `select @@datadir`; - -SET NAMES utf8; - -# -#--echo Testing indexing on not indexable table type -# ---error ER_UNKNOWN_ERROR -CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N'; -CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N'; -DESCRIBE t1; -# one could *add* an index to an existing table ---error ER_UNKNOWN_ERROR -ALTER TABLE t1 ADD UNIQUE(i); ---error ER_UNKNOWN_ERROR -CREATE UNIQUE INDEX i ON t1(i); -DESCRIBE t1; -INSERT INTO t1 VALUES(2),(5),(7); -SELECT * FROM t1 WHERE i = 5; ---error ER_CANT_DROP_FIELD_OR_KEY -ALTER TABLE t1 DROP INDEX i; ---error ER_CANT_DROP_FIELD_OR_KEY -DROP INDEX i ON t1; -DROP TABLE t1; ---remove_file $MYSQLD_DATADIR/test/xt1.xml +--source have_libxml2.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +SET NAMES utf8; + +# +#--echo Testing indexing on not indexable table type +# +--error ER_UNKNOWN_ERROR +CREATE TABLE t1 (i INT UNIQUE NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N'; +CREATE TABLE t1 (i INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='xt1.xml' OPTION_LIST='Rownode=N'; +DESCRIBE t1; +# one could *add* an index to an existing table +--error ER_UNKNOWN_ERROR +ALTER TABLE t1 ADD UNIQUE(i); +--error ER_UNKNOWN_ERROR +CREATE UNIQUE INDEX i ON t1(i); +DESCRIBE t1; +INSERT INTO t1 VALUES(2),(5),(7); +SELECT * FROM t1 WHERE i = 5; +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1 DROP INDEX i; +--error ER_CANT_DROP_FIELD_OR_KEY +DROP INDEX i ON t1; +DROP TABLE t1; +--remove_file $MYSQLD_DATADIR/test/xt1.xml diff --git a/storage/connect/rcmsg.c b/storage/connect/rcmsg.c index 9eea944c697..eafcbdcd81b 100644 --- a/storage/connect/rcmsg.c +++ b/storage/connect/rcmsg.c @@ -1,68 +1,68 @@ -/**************** RCMsg C Program Source Code File (.C) ****************/ -/* PROGRAM NAME: RCMSG */ -/* ------------- */ -/* Version 1.3 */ -/* */ -/* COPYRIGHT */ -/* ---------- */ -/* (C) Copyright to the author Olivier BERTRAND: 2005 - 2014 */ -/* */ -/* WHAT THIS PROGRAM DOES */ -/* ----------------------- */ -/* This program simulates LoadString. */ -/* */ -/***********************************************************************/ -#if !defined(XMSG) -#include -#include -#include "resource.h" -#include "rcmsg.h" -#if defined(NEWMSG) -#include "msgid.h" -#endif // NEWMSG - -#if !defined(WIN32) -#define stricmp strcasecmp -#endif // !WIN32 - -char *msglang(void); - -char *GetMsgid(int id) - { - char *p = NULL; - - // This conditional until a real fix is found for MDEV-7304 -#if defined(FRENCH) - if (!stricmp(msglang(), "french")) - switch (id) { -#include "frids.h" -#if defined(NEWMSG) -#include "frcas.h" -#endif // NEWMSG - } // endswitch(id) - - else // English -#endif // FRENCH - switch (id) { -#include "enids.h" -#if defined(NEWMSG) -#include "encas.h" -#endif // NEWMSG - } // endswitch(id) - - return p; - } // end of GetMsgid - -int GetRcString(int id, char *buf, int bufsize) - { - char *p = NULL, msg[32]; - - if (!(p = GetMsgid(id))) { - sprintf(msg, "ID=%d unknown", id); - p = msg; - } // endif p - - return sprintf(buf, "%.*s", bufsize-1, p); - } // end of GetRcString - -#endif // !XMSG +/**************** RCMsg C Program Source Code File (.C) ****************/ +/* PROGRAM NAME: RCMSG */ +/* ------------- */ +/* Version 1.3 */ +/* */ +/* COPYRIGHT */ +/* ---------- */ +/* (C) Copyright to the author Olivier BERTRAND: 2005 - 2014 */ +/* */ +/* WHAT THIS PROGRAM DOES */ +/* ----------------------- */ +/* This program simulates LoadString. */ +/* */ +/***********************************************************************/ +#if !defined(XMSG) +#include +#include +#include "resource.h" +#include "rcmsg.h" +#if defined(NEWMSG) +#include "msgid.h" +#endif // NEWMSG + +#if !defined(WIN32) +#define stricmp strcasecmp +#endif // !WIN32 + +char *msglang(void); + +char *GetMsgid(int id) + { + char *p = NULL; + + // This conditional until a real fix is found for MDEV-7304 +#if defined(FRENCH) + if (!stricmp(msglang(), "french")) + switch (id) { +#include "frids.h" +#if defined(NEWMSG) +#include "frcas.h" +#endif // NEWMSG + } // endswitch(id) + + else // English +#endif // FRENCH + switch (id) { +#include "enids.h" +#if defined(NEWMSG) +#include "encas.h" +#endif // NEWMSG + } // endswitch(id) + + return p; + } // end of GetMsgid + +int GetRcString(int id, char *buf, int bufsize) + { + char *p = NULL, msg[32]; + + if (!(p = GetMsgid(id))) { + sprintf(msg, "ID=%d unknown", id); + p = msg; + } // endif p + + return sprintf(buf, "%.*s", bufsize-1, p); + } // end of GetRcString + +#endif // !XMSG diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index d0483b5075d..4563500254b 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -56,6 +56,7 @@ extern handlerton *connect_hton; /* External function. */ /***********************************************************************/ USETEMP UseTemp(void); +char *GetPluginDir(void); /* --------------------------- Class RELDEF -------------------------- */ @@ -322,7 +323,7 @@ int TABDEF::GetColCatInfo(PGLOBAL g) if ((nof= cdp->Define(g, NULL, pcf, poff)) < 0) return -1; // Error, probably unhandled type - else if (nof) + else loff= cdp->GetOffset(); switch (tc) { @@ -333,16 +334,24 @@ int TABDEF::GetColCatInfo(PGLOBAL g) if (nof) // Field width is the internal representation width // that can also depend on the column format - switch (cdp->Fmt ? *cdp->Fmt : 'X') { + switch (cdp->Fmt ? *cdp->Fmt : cdp->Decode ? 'C' : 'X') { + case 'X': nof= cdp->Clen; case 'C': break; case 'R': case 'F': - case 'L': +// case 'L': case 'I': nof= 4; break; case 'D': nof= 8; break; case 'S': nof= 2; break; case 'T': nof= 1; break; - default: nof= cdp->Clen; + default: /* New format */ + for (nof= 0, i= 0; cdp->Fmt[i]; i++) + if (isdigit(cdp->Fmt[i])) + nof= (nof * 10 + (cdp->Fmt[i] - '0')); + + if (!nof) + nof= cdp->Clen; + } // endswitch Fmt default: @@ -369,20 +378,16 @@ int TABDEF::GetColCatInfo(PGLOBAL g) // not specified (for instance if quoted is specified) // if ((ending= Hc->GetIntegerOption("Ending")) < 0) { if ((ending= Hc->GetIntegerOption("Ending")) <= 0) { -#if defined(WIN32) - ending= 2; -#else - ending= 1; -#endif + ending= (tc == TAB_BIN || tc == TAB_VEC) ? 0 : CRLF; Hc->SetIntegerOption("Ending", ending); } // endif ending // Calculate the default record size switch (tc) { case TAB_FIX: + case TAB_BIN: recln= nlg + ending; // + length of line ending break; - case TAB_BIN: case TAB_VEC: recln= nlg; @@ -433,20 +438,31 @@ void TABDEF::SetIndexInfo(void) PTABDEF OEMDEF::GetXdef(PGLOBAL g) { typedef PTABDEF (__stdcall *XGETDEF) (PGLOBAL, void *); - char c, getname[40] = "Get"; + char c, soname[_MAX_PATH], getname[40] = "Get"; PTABDEF xdefp; XGETDEF getdef = NULL; PCATLG cat = Cat; + /*********************************************************************/ + /* Ensure that the .dll doesn't have a path. */ + /* This is done to ensure that only approved dll from the system */ + /* directories are used (to make this even remotely secure). */ + /*********************************************************************/ + if (check_valid_path(Module, strlen(Module))) { + strcpy(g->Message, "Module cannot contain a path"); + return NULL; + } else + PlugSetPath(soname, Module, GetPluginDir()); + #if defined(WIN32) // Is the DLL already loaded? - if (!Hdll && !(Hdll = GetModuleHandle(Module))) + if (!Hdll && !(Hdll = GetModuleHandle(soname))) // No, load the Dll implementing the function - if (!(Hdll = LoadLibrary(Module))) { + if (!(Hdll = LoadLibrary(soname))) { char buf[256]; DWORD rc = GetLastError(); - sprintf(g->Message, MSG(DLL_LOAD_ERROR), rc, Module); + sprintf(g->Message, MSG(DLL_LOAD_ERROR), rc, soname); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, rc, 0, (LPTSTR)buf, sizeof(buf), NULL); @@ -470,7 +486,8 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) #else // !WIN32 const char *error = NULL; Dl_info dl_info; - + +#if 0 // Don't know what all this stuff does // The OEM lib must retrieve exported CONNECT variables if (dladdr(&connect_hton, &dl_info)) { if (dlopen(dl_info.dli_fname, RTLD_NOLOAD | RTLD_NOW | RTLD_GLOBAL) == 0) { @@ -484,15 +501,16 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) sprintf(g->Message, "dladdr failed: %s, OEM not supported", SVP(error)); return NULL; } // endif dladdr +#endif // 0 // Is the library already loaded? -// if (!Hdll && !(Hdll = ???)) - // Load the desired shared library - if (!(Hdll = dlopen(Module, RTLD_LAZY))) { - error = dlerror(); - sprintf(g->Message, MSG(SHARED_LIB_ERR), Module, SVP(error)); - return NULL; - } // endif Hdll + if (!Hdll && !(Hdll = dlopen(soname, RTLD_NOLOAD))) + // Load the desired shared library + if (!(Hdll = dlopen(soname, RTLD_LAZY))) { + error = dlerror(); + sprintf(g->Message, MSG(SHARED_LIB_ERR), soname, SVP(error)); + return NULL; + } // endif Hdll // The exported name is always in uppercase for (int i = 0; ; i++) { @@ -745,7 +763,8 @@ int COLDEF::Define(PGLOBAL g, void *, PCOLINFO cfp, int poff) if (cfp->Datefmt) Decode = (PSZ)PlugDup(g, cfp->Datefmt); - } // endif special + } else + Offset = poff; if (cfp->Fieldfmt) Fmt = (PSZ)PlugDup(g, cfp->Fieldfmt); diff --git a/storage/connect/tabfix.cpp b/storage/connect/tabfix.cpp index 5cfd5a726ef..af92ec0410a 100644 --- a/storage/connect/tabfix.cpp +++ b/storage/connect/tabfix.cpp @@ -54,6 +54,7 @@ extern int num_read, num_there, num_eq[2]; // Statistics static const longlong M2G = 0x80000000; static const longlong M4G = (longlong)2 * M2G; +char BINCOL::Endian = 'H'; /***********************************************************************/ /* External function. */ @@ -373,18 +374,71 @@ int TDBFIX::WriteDB(PGLOBAL g) BINCOL::BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am) : DOSCOL(g, cdp, tp, cp, i, am) { - Fmt = (cdp->GetFmt()) ? toupper(*cdp->GetFmt()) : 'X'; + char *fmt = cdp->GetFmt(); + + Buff = NULL; + M = GetTypeSize(Buf_Type, sizeof(longlong)); + Lim = 0; + + if (fmt) { + Fmt = 'H'; + + for (N = 0, i = 0; fmt[i]; i++) + if (isdigit(fmt[i])) + N = (N * 10 + (fmt[i] - '0')); + else + Fmt = toupper(fmt[i]); + + if (N == GetTypeSize(Buf_Type, -1) && (Fmt == 'H' || Fmt == Endian)) { + // New format is a no op + N = 0; + Fmt = 'X'; + } else if (Fmt == 'L' || Fmt == 'B' || Fmt == 'H') { + // This is a new format + if (!N) + N = GetTypeSize(Buf_Type, Long); + + if (Fmt == 'H') + Fmt = Endian; + + Buff = (char*)PlugSubAlloc(g, NULL, M); + memset(Buff, 0, M); + Lim = MY_MIN(N, M); + } // endif Fmt + + } else { + N = 0; + Fmt = GetDomain() ? 'C' : 'X'; + } // endif fmt + } // end of BINCOL constructor /***********************************************************************/ -/* FIXCOL constructor used for copying columns. */ +/* BINCOL constructor used for copying columns. */ /* tdbp is the pointer to the new table descriptor. */ /***********************************************************************/ BINCOL::BINCOL(BINCOL *col1, PTDB tdbp) : DOSCOL(col1, tdbp) { Fmt = col1->Fmt; + N = col1->N; + M = col1->M; + Lim = col1->Lim; } // end of BINCOL copy constructor +/***********************************************************************/ +/* Set Endian according to the host setting. */ +/***********************************************************************/ +void BINCOL::SetEndian(void) + { + union { + short S; + char C[sizeof(short)]; + }; + + S = 1; + Endian = (C[0] == 1) ? 'L' : 'B'; + } // end of SetEndian + /***********************************************************************/ /* ReadColumn: what this routine does is to access the last line */ /* read from the corresponding table and extract from it the field */ @@ -416,19 +470,35 @@ void BINCOL::ReadColumn(PGLOBAL g) /*********************************************************************/ /* Set Value from the line field. */ /*********************************************************************/ - switch (Fmt) { + if (N) { + for (int i = 0; i < Lim; i++) + if (Fmt == 'B' && Endian == 'L') + Buff[i] = p[N - i - 1]; + else if (Fmt == 'L' && Endian == 'B') + Buff[M - i - 1] = p[i]; + else if (Endian == 'B') + Buff[M - i - 1] = p[N - i - 1]; + else + Buff[i] = p[i]; + + if (IsTypeChar(Buf_Type)) + Value->SetValue(*(longlong*)Buff); + else + Value->SetBinValue(Buff); + + } else switch (Fmt) { case 'X': // Standard not converted values Value->SetBinValue(p); break; case 'S': // Short integer - Value->SetValue((int)*(short*)p); + Value->SetValue(*(short*)p); break; case 'T': // Tiny integer - Value->SetValue((int)*p); + Value->SetValue(*p); break; - case 'L': // Long Integer - strcpy(g->Message, "Format L is deprecated, use I"); - longjmp(g->jumper[g->jump_level], 11); +// case 'L': // Long Integer +// strcpy(g->Message, "Format L is deprecated, use I"); +// longjmp(g->jumper[g->jump_level], 11); case 'I': // Integer Value->SetValue(*(int*)p); break; @@ -490,14 +560,34 @@ void BINCOL::WriteColumn(PGLOBAL g) /* Updating will be done only during the second pass (Status=true) */ /* Conversion occurs if the external format Fmt is specified. */ /*********************************************************************/ - switch (Fmt) { + if (N) { + if (IsTypeChar(Buf_Type)) + *(longlong *)Buff = Value->GetBigintValue(); + else if (Value->GetBinValue(Buff, M, Status)) { + sprintf(g->Message, MSG(BIN_F_TOO_LONG), + Name, Value->GetSize(), M); + longjmp(g->jumper[g->jump_level], 31); + } // endif Buff + + if (Status) + for (int i = 0; i < Lim; i++) + if (Fmt == 'B' && Endian == 'L') + p[N - i - 1] = Buff[i]; + else if (Fmt == 'L' && Endian == 'B') + p[i] = Buff[M - i - 1]; + else if (Endian == 'B') + p[N - i - 1] = Buff[M - i - 1]; + else + p[i] = Buff[i]; + + } else switch (Fmt) { case 'X': // Standard not converted values if (Value->GetBinValue(p, Long, Status)) { sprintf(g->Message, MSG(BIN_F_TOO_LONG), Name, Value->GetSize(), Long); longjmp(g->jumper[g->jump_level], 31); - } // endif Fmt + } // endif p break; case 'S': // Short integer @@ -535,7 +625,7 @@ void BINCOL::WriteColumn(PGLOBAL g) break; case 'B': // Large (big) integer if (Status) - *(longlong *)p = (longlong)Value->GetBigintValue(); + *(longlong *)p = Value->GetBigintValue(); break; case 'F': // Float diff --git a/storage/connect/tabfix.h b/storage/connect/tabfix.h index 7d5b964da2a..b6307e8f60b 100644 --- a/storage/connect/tabfix.h +++ b/storage/connect/tabfix.h @@ -1,7 +1,7 @@ /*************** TabDos H Declares Source Code File (.H) ***************/ -/* Name: TABFIX.H Version 2.3 */ +/* Name: TABFIX.H Version 2.4 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 1999-2012 */ +/* (C) Copyright to the author Olivier BERTRAND 1999-2015 */ /* */ /* This file contains the TDBFIX and (FIX/BIN)COL classes declares. */ /***********************************************************************/ @@ -12,7 +12,7 @@ typedef class FIXCOL *PFIXCOL; typedef class BINCOL *PBINCOL; -typedef class TXTFAM *PTXF; +typedef class TXTFAM *PTXF; /***********************************************************************/ /* This is the DOS/UNIX Access Method class declaration for files */ @@ -68,17 +68,28 @@ class DllExport BINCOL : public DOSCOL { BINCOL(BINCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_BIN;} + virtual int GetAmType(void) {return TYPE_AM_BIN;} + int GetDeplac(void) {return Deplac;} + int GetFileSize(void) + {return N ? N : GetTypeSize(Buf_Type, Long);} // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + virtual void ReadColumn(PGLOBAL g); + virtual void WriteColumn(PGLOBAL g); + + // Static + static void SetEndian(void); protected: BINCOL(void) {} // Default constructor not to be used // Members - char Fmt; // The column numeric format + static char Endian; // The host endian setting (L or B) + char *Buff; // Utility buffer + char Fmt; // The file endian setting or old format + int N; // The number of bytes in the file + int M; // The buffer type size + int Lim; // Min(N,M) }; // end of class BINCOL /***********************************************************************/ diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index f22bdd15528..34d5827345f 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -372,6 +372,7 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR, int poff) Pretty = GetIntCatInfo("Pretty", 2); Level = GetIntCatInfo("Level", 0); Limit = GetIntCatInfo("Limit", 10); + Base = GetIntCatInfo("Base", 0); return DOSDEF::DefineAM(g, "DOS", poff); } // end of DefineAM @@ -440,6 +441,7 @@ TDBJSN::TDBJSN(PJDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp) Xcol = tdp->Xcol; Limit = tdp->Limit; Pretty = tdp->Pretty; + B = tdp->Base ? 1 : 0; Strict = tdp->Strict; } else { Jmode = MODE_OBJECT; @@ -447,11 +449,12 @@ TDBJSN::TDBJSN(PJDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp) Xcol = NULL; Limit = 1; Pretty = 0; + B = 0; Strict = false; } // endif tdp Fpos = -1; - N = 0; + N = M = 0; NextSame = 0; SameRow = 0; Xval = -1; @@ -469,10 +472,12 @@ TDBJSN::TDBJSN(TDBJSN *tdbp) : TDBDOS(NULL, tdbp) Xcol = tdbp->Xcol; Fpos = tdbp->Fpos; N = tdbp->N; + M = tdbp->M; Limit = tdbp->Limit; NextSame = tdbp->NextSame; SameRow = tdbp->SameRow; Xval = tdbp->Xval; + B = tdbp->B; Pretty = tdbp->Pretty; Strict = tdbp->Strict; Comma = tdbp->Comma; @@ -563,7 +568,7 @@ PJSON TDBJSN::FindRow(PGLOBAL g) jsp->GetObject()->GetValue(objpath) : NULL; } else if (objpath[strlen(objpath)-1] == ']') { val = (jsp->GetType() == TYPE_JAR) ? - jsp->GetArray()->GetValue(atoi(objpath+1) - 1) : NULL; + jsp->GetArray()->GetValue(atoi(objpath+1) - B) : NULL; } else val = NULL; @@ -649,6 +654,7 @@ int TDBJSN::ReadDB(PGLOBAL g) if (NextSame) { SameRow = NextSame; NextSame = 0; + M++; return RC_OK; } else if ((rc = TDBDOS::ReadDB(g)) == RC_OK) if (!IsRead() && ((rc = ReadBuffer(g)) != RC_OK)) { @@ -660,6 +666,7 @@ int TDBJSN::ReadDB(PGLOBAL g) Row = FindRow(g); SameRow = 0; Fpos++; + M = 1; rc = RC_OK; } // endif's @@ -708,7 +715,7 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) val->SetValue(arp); val = new(g) JVALUE; - i = atoi(objpath+1) - 1; + i = atoi(objpath+1) - B; arp->SetValue(g, val, i); arp->InitArray(g); } else { @@ -856,8 +863,8 @@ bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) return true; else if (jnp->Op != OP_EXP) { if (b) { - // Return 1st value - jnp->Rank = 1; + // Return 1st value (B is the index base) + jnp->Rank = Tjp->B; jnp->Op = OP_EQ; } else if (!Value->IsTypeNum()) { jnp->CncVal = AllocateValue(g, (void*)", ", TYPE_STRING); @@ -868,13 +875,9 @@ bool JSONCOL::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) } // endif OP } else if (dg) { - if (atoi(p) > 0) { - // Return nth value - jnp->Rank = atoi(p); - jnp->Op = OP_EQ; - } else // Ignore array - jnp->Op = OP_NULL; - + // Return nth value + jnp->Rank = atoi(p) - Tjp->B; + jnp->Op = OP_EQ; } else if (n == 1) { // Set the Op value; switch (*p) { @@ -1118,16 +1121,12 @@ PVAL JSONCOL::GetColumnValue(PGLOBAL g, PJSON row, int i) arp = (PJAR)row; if (!Nodes[i].Key) { - if (Nodes[i].Op != OP_NULL) { - if (Nodes[i].Rank) { - val = arp->GetValue(Nodes[i].Rank - 1); - } else if (Nodes[i].Op == OP_EXP) { - return ExpandArray(g, arp, i); - } else - return CalculateArray(g, arp, i); - - } else - val = NULL; + if (Nodes[i].Op == OP_EQ) + val = arp->GetValue(Nodes[i].Rank); + else if (Nodes[i].Op == OP_EXP) + return ExpandArray(g, arp, i); + else + return CalculateArray(g, arp, i); } else if (i < Nod-1) { strcpy(g->Message, "Unexpected array"); @@ -1289,16 +1288,12 @@ PJSON JSONCOL::GetRow(PGLOBAL g) break; case TYPE_JAR: if (!Nodes[i].Key) { - if (Nodes[i].Op != OP_NULL) { - arp = (PJAR)row; + arp = (PJAR)row; - if (Nodes[i].Rank) - val = arp->GetValue(Nodes[i].Rank - 1); - else - val = arp->GetValue(Nodes[i].Rx); - - } else - val = NULL; + if (Nodes[i].Op == OP_EQ) + val = arp->GetValue(Nodes[i].Rank); + else + val = arp->GetValue(Nodes[i].Rx); } else { strcpy(g->Message, "Unexpected array"); @@ -1390,8 +1385,8 @@ void JSONCOL::WriteColumn(PGLOBAL g) } // endif jsp if (arp) { - if (Nod > 1 && Nodes[Nod-2].Rank) - arp->SetValue(g, new(g) JVALUE(jsp), Nodes[Nod-2].Rank-1); + if (Nod > 1 && Nodes[Nod-2].Op == OP_EQ) + arp->SetValue(g, new(g) JVALUE(jsp), Nodes[Nod-2].Rank); else arp->AddValue(g, new(g) JVALUE(jsp)); @@ -1411,8 +1406,8 @@ void JSONCOL::WriteColumn(PGLOBAL g) case TYPE_INT: case TYPE_DOUBLE: if (arp) { - if (Nodes[Nod-1].Rank) - arp->SetValue(g, new(g) JVALUE(g, Value), Nodes[Nod-1].Rank-1); + if (Nodes[Nod-1].Op == OP_EQ) + arp->SetValue(g, new(g) JVALUE(g, Value), Nodes[Nod-1].Rank); else arp->AddValue(g, new(g) JVALUE(g, Value)); @@ -1562,7 +1557,7 @@ int TDBJSON::MakeDocument(PGLOBAL g) arp = jsp->GetArray(); objp = NULL; - i = atoi(objpath+1) - 1; + i = atoi(objpath+1) - B; val = arp->GetValue(i); if (!val) { @@ -1750,6 +1745,7 @@ int TDBJSON::ReadDB(PGLOBAL) if (NextSame) { SameRow = NextSame; NextSame = false; + M++; rc = RC_OK; } else if (++Fpos < (signed)Doc->size()) { Row = Doc->GetValue(Fpos); @@ -1758,6 +1754,7 @@ int TDBJSON::ReadDB(PGLOBAL) Row = ((PJVAL)Row)->GetJson(); SameRow = 0; + M = 1; rc = RC_OK; } else rc = RC_EF; diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index dc682e067e3..4e5f84b1190 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -57,6 +57,7 @@ class JSONDEF : public DOSDEF { /* Table description */ int Limit; /* Limit of multiple values */ int Pretty; /* Depends on file structure */ int Level; /* Used for catalog table */ + int Base; /* Tne array index base */ bool Strict; /* Strict syntax checking */ }; // end of JSONDEF @@ -84,7 +85,7 @@ class TDBJSN : public TDBDOS { virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); virtual PCOL InsertSpecialColumn(PCOL colp); virtual int RowNumber(PGLOBAL g, bool b = FALSE) - {return (b) ? N : Fpos + 1;} + {return (b) ? M : N;} // Database routines virtual int Cardinality(PGLOBAL g); @@ -106,13 +107,14 @@ class TDBJSN : public TDBDOS { char *Objname; // The table object name char *Xcol; // Name of expandable column int Fpos; // The current row index -//int Spos; // DELETE start index int N; // The current Rownum + int M; // Index of multiple value int Limit; // Limit of multiple values int Pretty; // Depends on file structure int NextSame; // Same next row int SameRow; // Same row nb int Xval; // Index of expandable array + int B; // Array index base bool Strict; // Strict syntax checking bool Comma; // Row has final comma }; // end of class TDBJSN diff --git a/storage/connect/tabsys.h b/storage/connect/tabsys.h index aa45c260bc2..6b454322906 100644 --- a/storage/connect/tabsys.h +++ b/storage/connect/tabsys.h @@ -1,182 +1,182 @@ -/*************** TabSys H Declares Source Code File (.H) ***************/ -/* Name: TABSYS.H Version 2.3 */ -/* */ -/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ -/* */ -/* This file contains the XDB system tables classes declares. */ -/***********************************************************************/ -typedef class INIDEF *PINIDEF; -typedef class TDBINI *PTDBINI; -typedef class INICOL *PINICOL; -typedef class TDBXIN *PTDBXIN; -typedef class XINCOL *PXINCOL; - -/* --------------------------- INI classes --------------------------- */ - -/***********************************************************************/ -/* INI, XDB and XCL tables. */ -/***********************************************************************/ -class DllExport INIDEF : public TABDEF { /* INI table description */ - friend class TDBINI; - friend class TDBXIN; - friend class TDBXTB; - friend class TDBRTB; - friend class TDBXCL; - public: - // Constructor - INIDEF(void); - - // Implementation - virtual const char *GetType(void) {return "INI";} - - // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); - - protected: - // Members - char *Fn; /* Path/Name of corresponding file */ - char *Xname; /* The eventual table name */ - char Layout; /* R: Row, C: Column */ - int Ln; /* Length of section list buffer */ - }; // end of INIDEF - -/***********************************************************************/ -/* This is the class declaration for the INI tables. */ -/* These are tables represented by a INI like file. */ -/***********************************************************************/ -class TDBINI : public TDBASE { - friend class INICOL; - public: - // Constructor - TDBINI(PINIDEF tdp); - TDBINI(PTDBINI tdbp); - - // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_INI;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBINI(this);} - - // Methods - virtual PTDB CopyOne(PTABS t); - virtual int GetRecpos(void) {return N;} - virtual int GetProgCur(void) {return N;} -//virtual int GetAffectedRows(void) {return 0;} - virtual PSZ GetFile(PGLOBAL g) {return Ifile;} - virtual void SetFile(PGLOBAL g, PSZ fn) {Ifile = fn;} - virtual void ResetDB(void) {Seclist = Section = NULL; N = 0;} - virtual void ResetSize(void) {MaxSize = -1; Seclist = NULL;} - virtual int RowNumber(PGLOBAL g, bool b = false) {return N;} - char *GetSeclist(PGLOBAL g); - - // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); - - protected: - // Members - char *Ifile; // The INI file - char *Seclist; // The section list - char *Section; // The current section - int Seclen; // Length of seclist buffer - int N; // The current section index - }; // end of class TDBINI - -/***********************************************************************/ -/* Class INICOL: XDB table access method column descriptor. */ -/***********************************************************************/ -class INICOL : public COLBLK { - public: - // Constructors - INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "INI"); - INICOL(INICOL *colp, PTDB tdbp); // Constructor used in copy process - - // Implementation - virtual int GetAmType(void) {return TYPE_AM_INI;} - virtual void SetTo_Val(PVAL valp) {To_Val = valp;} - - // Methods - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); - virtual void AllocBuf(PGLOBAL g); - - protected: - // Default constructor not to be used - INICOL(void) {} - - // Members - char *Valbuf; // To the key value buffer - int Flag; // Tells what set in value - int Long; // Buffer length - PVAL To_Val; // To value used for Update/Insert - }; // end of class INICOL - -/* --------------------------- XINI class ---------------------------- */ - -/***********************************************************************/ -/* This is the class declaration for the XINI tables. */ -/* These are tables represented by a INI like file */ -/* having 3 columns Section, Key, and Value. */ -/***********************************************************************/ -class TDBXIN : public TDBINI { - friend class XINCOL; - public: - // Constructor - TDBXIN(PINIDEF tdp); - TDBXIN(PTDBXIN tdbp); - - // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_INI;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBXIN(this);} - - // Methods - virtual PTDB CopyOne(PTABS t); - virtual int GetRecpos(void); - virtual bool SetRecpos(PGLOBAL g, int recpos); - virtual void ResetDB(void) - {Seclist = Section = Keycur = NULL; N = 0; Oldsec = -1;} - char *GetKeylist(PGLOBAL g, char *sec); - - // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - - protected: - // Members - char *Keylist; // The key list - char *Keycur; // The current key - int Keylen; // Length of keylist buffer - short Oldsec; // Last current section - }; // end of class TDBXIN - -/***********************************************************************/ -/* Class XINCOL: XIN table access method column descriptor. */ -/***********************************************************************/ -class XINCOL : public INICOL { - public: - // Constructors - XINCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "INI"); - XINCOL(XINCOL *colp, PTDB tdbp); // Constructor used in copy process - - // Implementation - - // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); - - protected: - // Default constructor not to be used - XINCOL(void) {} - - // Members - }; // end of class XINICOL +/*************** TabSys H Declares Source Code File (.H) ***************/ +/* Name: TABSYS.H Version 2.3 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2004-2014 */ +/* */ +/* This file contains the XDB system tables classes declares. */ +/***********************************************************************/ +typedef class INIDEF *PINIDEF; +typedef class TDBINI *PTDBINI; +typedef class INICOL *PINICOL; +typedef class TDBXIN *PTDBXIN; +typedef class XINCOL *PXINCOL; + +/* --------------------------- INI classes --------------------------- */ + +/***********************************************************************/ +/* INI, XDB and XCL tables. */ +/***********************************************************************/ +class DllExport INIDEF : public TABDEF { /* INI table description */ + friend class TDBINI; + friend class TDBXIN; + friend class TDBXTB; + friend class TDBRTB; + friend class TDBXCL; + public: + // Constructor + INIDEF(void); + + // Implementation + virtual const char *GetType(void) {return "INI";} + + // Methods + virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); + virtual PTDB GetTable(PGLOBAL g, MODE m); + + protected: + // Members + char *Fn; /* Path/Name of corresponding file */ + char *Xname; /* The eventual table name */ + char Layout; /* R: Row, C: Column */ + int Ln; /* Length of section list buffer */ + }; // end of INIDEF + +/***********************************************************************/ +/* This is the class declaration for the INI tables. */ +/* These are tables represented by a INI like file. */ +/***********************************************************************/ +class TDBINI : public TDBASE { + friend class INICOL; + public: + // Constructor + TDBINI(PINIDEF tdp); + TDBINI(PTDBINI tdbp); + + // Implementation + virtual AMT GetAmType(void) {return TYPE_AM_INI;} + virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBINI(this);} + + // Methods + virtual PTDB CopyOne(PTABS t); + virtual int GetRecpos(void) {return N;} + virtual int GetProgCur(void) {return N;} +//virtual int GetAffectedRows(void) {return 0;} + virtual PSZ GetFile(PGLOBAL g) {return Ifile;} + virtual void SetFile(PGLOBAL g, PSZ fn) {Ifile = fn;} + virtual void ResetDB(void) {Seclist = Section = NULL; N = 0;} + virtual void ResetSize(void) {MaxSize = -1; Seclist = NULL;} + virtual int RowNumber(PGLOBAL g, bool b = false) {return N;} + char *GetSeclist(PGLOBAL g); + + // Database routines + virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); + virtual int Cardinality(PGLOBAL g); + virtual int GetMaxSize(PGLOBAL g); + virtual bool OpenDB(PGLOBAL g); + virtual int ReadDB(PGLOBAL g); + virtual int WriteDB(PGLOBAL g); + virtual int DeleteDB(PGLOBAL g, int irc); + virtual void CloseDB(PGLOBAL g); + + protected: + // Members + char *Ifile; // The INI file + char *Seclist; // The section list + char *Section; // The current section + int Seclen; // Length of seclist buffer + int N; // The current section index + }; // end of class TDBINI + +/***********************************************************************/ +/* Class INICOL: XDB table access method column descriptor. */ +/***********************************************************************/ +class INICOL : public COLBLK { + public: + // Constructors + INICOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "INI"); + INICOL(INICOL *colp, PTDB tdbp); // Constructor used in copy process + + // Implementation + virtual int GetAmType(void) {return TYPE_AM_INI;} + virtual void SetTo_Val(PVAL valp) {To_Val = valp;} + + // Methods + virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); + virtual void ReadColumn(PGLOBAL g); + virtual void WriteColumn(PGLOBAL g); + virtual void AllocBuf(PGLOBAL g); + + protected: + // Default constructor not to be used + INICOL(void) {} + + // Members + char *Valbuf; // To the key value buffer + int Flag; // Tells what set in value + int Long; // Buffer length + PVAL To_Val; // To value used for Update/Insert + }; // end of class INICOL + +/* --------------------------- XINI class ---------------------------- */ + +/***********************************************************************/ +/* This is the class declaration for the XINI tables. */ +/* These are tables represented by a INI like file */ +/* having 3 columns Section, Key, and Value. */ +/***********************************************************************/ +class TDBXIN : public TDBINI { + friend class XINCOL; + public: + // Constructor + TDBXIN(PINIDEF tdp); + TDBXIN(PTDBXIN tdbp); + + // Implementation + virtual AMT GetAmType(void) {return TYPE_AM_INI;} + virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBXIN(this);} + + // Methods + virtual PTDB CopyOne(PTABS t); + virtual int GetRecpos(void); + virtual bool SetRecpos(PGLOBAL g, int recpos); + virtual void ResetDB(void) + {Seclist = Section = Keycur = NULL; N = 0; Oldsec = -1;} + char *GetKeylist(PGLOBAL g, char *sec); + + // Database routines + virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); + virtual int Cardinality(PGLOBAL g); + virtual bool OpenDB(PGLOBAL g); + virtual int ReadDB(PGLOBAL g); + virtual int WriteDB(PGLOBAL g); + virtual int DeleteDB(PGLOBAL g, int irc); + + protected: + // Members + char *Keylist; // The key list + char *Keycur; // The current key + int Keylen; // Length of keylist buffer + short Oldsec; // Last current section + }; // end of class TDBXIN + +/***********************************************************************/ +/* Class XINCOL: XIN table access method column descriptor. */ +/***********************************************************************/ +class XINCOL : public INICOL { + public: + // Constructors + XINCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PSZ am = "INI"); + XINCOL(XINCOL *colp, PTDB tdbp); // Constructor used in copy process + + // Implementation + + // Methods + virtual void ReadColumn(PGLOBAL g); + virtual void WriteColumn(PGLOBAL g); + + protected: + // Default constructor not to be used + XINCOL(void) {} + + // Members + }; // end of class XINICOL From e8ea671c2523f56fce0eacabbba05689aa4824f9 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 2 Jun 2015 10:34:51 +0200 Subject: [PATCH 13/39] Commit changes pulled from ob-10.0 --- storage/connect/array.cpp | 6 +- storage/connect/blkfil.cpp | 6 +- storage/connect/block.h | 8 +- storage/connect/colblk.cpp | 4 +- storage/connect/domdoc.cpp | 2 +- storage/connect/filamap.cpp | 16 +- storage/connect/filamdbf.cpp | 10 +- storage/connect/filamfix.cpp | 44 +-- storage/connect/filamtxt.cpp | 46 +-- storage/connect/filamvct.cpp | 74 ++--- storage/connect/filamzip.cpp | 16 +- storage/connect/filter.cpp | 6 +- storage/connect/filter.h | 2 +- storage/connect/fmdlex.c | 5 +- storage/connect/global.h | 18 +- storage/connect/ha_connect.cc | 313 ++++++++++-------- storage/connect/json.cpp | 2 +- storage/connect/libdoc.cpp | 5 +- storage/connect/macutil.cpp | 8 +- storage/connect/macutil.h | 8 +- storage/connect/maputil.cpp | 2 +- storage/connect/mycat.cc | 46 +-- storage/connect/mycat.h | 2 +- storage/connect/myconn.cpp | 12 +- storage/connect/myconn.h | 12 +- .../connect/mysql-test/connect/r/bin.result | 32 +- storage/connect/mysql-test/connect/t/bin.test | 16 +- storage/connect/myutil.cpp | 6 +- storage/connect/odbconn.cpp | 30 +- storage/connect/odbconn.h | 4 +- storage/connect/os.h | 10 +- storage/connect/osutil.c | 2 +- storage/connect/plgdbsem.h | 10 +- storage/connect/plgdbutl.cpp | 46 +-- storage/connect/plugutil.c | 30 +- storage/connect/rcmsg.c | 4 +- storage/connect/reldef.cpp | 75 +++-- storage/connect/reldef.h | 6 +- storage/connect/tabdos.cpp | 20 +- storage/connect/tabdos.h | 1 + storage/connect/tabfix.cpp | 148 +++++---- storage/connect/tabfix.h | 6 +- storage/connect/tabfmt.cpp | 12 +- storage/connect/tabjson.cpp | 69 ++-- storage/connect/tabjson.h | 12 +- storage/connect/tabmac.cpp | 8 +- storage/connect/tabmac.h | 8 +- storage/connect/tabmul.cpp | 78 ++--- storage/connect/tabmul.h | 18 +- storage/connect/tabmysql.cpp | 6 +- storage/connect/taboccur.cpp | 2 +- storage/connect/tabodbc.cpp | 2 +- storage/connect/tabpivot.cpp | 2 +- storage/connect/tabsys.cpp | 20 +- storage/connect/tabtbl.cpp | 8 +- storage/connect/tabutil.cpp | 2 +- storage/connect/tabvct.cpp | 6 +- storage/connect/tabwmi.cpp | 6 +- storage/connect/tabxcl.cpp | 2 +- storage/connect/tabxml.cpp | 90 ++--- storage/connect/tabxml.h | 5 +- storage/connect/valblk.cpp | 2 +- storage/connect/value.cpp | 14 +- storage/connect/value.h | 10 +- storage/connect/xindex.cpp | 90 +++-- storage/connect/xindex.h | 4 +- 66 files changed, 862 insertions(+), 733 deletions(-) diff --git a/storage/connect/array.cpp b/storage/connect/array.cpp index 0e8829d66a6..193514eeb99 100644 --- a/storage/connect/array.cpp +++ b/storage/connect/array.cpp @@ -19,14 +19,14 @@ #include "sql_class.h" //#include "sql_time.h" -#if defined(WIN32) +#if defined(__WIN__) //#include -#else // !WIN32 +#else // !__WIN__ #include #include #include #include // for uintprt_h -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include required application header files */ diff --git a/storage/connect/blkfil.cpp b/storage/connect/blkfil.cpp index c6fb528aa5f..1f5a1a27ae5 100644 --- a/storage/connect/blkfil.cpp +++ b/storage/connect/blkfil.cpp @@ -20,13 +20,13 @@ #include "sql_class.h" //#include "sql_time.h" -#if defined(WIN32) +#if defined(__WIN__) //#include -#else // !WIN32 +#else // !__WIN__ #include #include #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ diff --git a/storage/connect/block.h b/storage/connect/block.h index 40529ffc81f..aa4edde5ec9 100644 --- a/storage/connect/block.h +++ b/storage/connect/block.h @@ -24,11 +24,11 @@ #if !defined(BLOCK_DEFINED) #define BLOCK_DEFINED -#if defined(WIN32) && !defined(NOEX) +#if defined(__WIN__) && !defined(NOEX) #define DllExport __declspec( dllexport ) -#else // !WIN32 +#else // !__WIN__ #define DllExport -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Definition of class BLOCK with its method function new. */ @@ -38,7 +38,7 @@ typedef class BLOCK *PBLOCK; class DllExport BLOCK { public: void * operator new(size_t size, PGLOBAL g, void *p = NULL) { -// if (trace > 2) +// if (trace > 3) // htrc("New BLOCK: size=%d g=%p p=%p\n", size, g, p); return (PlugSubAlloc(g, p, size)); diff --git a/storage/connect/colblk.cpp b/storage/connect/colblk.cpp index 7166af8027b..80b405be041 100644 --- a/storage/connect/colblk.cpp +++ b/storage/connect/colblk.cpp @@ -297,9 +297,9 @@ FIDBLK::FIDBLK(PCOLUMN cp, OPVAL op) : SPCBLK(cp), Op(op) Buf_Type = TYPE_STRING; *Format.Type = 'C'; Format.Length = Long; -#if defined(WIN32) +#if defined(__WIN__) Format.Prec = 1; // Case insensitive -#endif // WIN32 +#endif // __WIN__ Constant = (!((PTDBASE)To_Tdb)->GetDef()->GetMultiple() && To_Tdb->GetAmType() != TYPE_AM_PLG && To_Tdb->GetAmType() != TYPE_AM_PLM); diff --git a/storage/connect/domdoc.cpp b/storage/connect/domdoc.cpp index 9e518775c0f..64a0a172956 100644 --- a/storage/connect/domdoc.cpp +++ b/storage/connect/domdoc.cpp @@ -4,7 +4,7 @@ /******************************************************************/ #include "my_global.h" #include -#if defined(WIN32) +#if defined(__WIN__) //#include #if defined(MSX2) #import "msxml2.dll" //Does not exist on Vista diff --git a/storage/connect/filamap.cpp b/storage/connect/filamap.cpp index cac34827b7a..5cf9a4d945c 100644 --- a/storage/connect/filamap.cpp +++ b/storage/connect/filamap.cpp @@ -17,12 +17,12 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #include @@ -30,7 +30,7 @@ #include #endif // !UNIX #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ @@ -191,11 +191,11 @@ bool MAPFAM::OpenTableFile(PGLOBAL g) return true; } // endif Memory -#if defined(WIN32) +#if defined(__WIN__) if (mode != MODE_DELETE) { -#else // !WIN32 +#else // !__WIN__ if (mode == MODE_READ) { -#endif // !WIN32 +#endif // !__WIN__ CloseFileHandle(hFile); // Not used anymore hFile = INVALID_HANDLE_VALUE; // For Fblock } // endif Mode @@ -452,7 +452,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ n = Tpos - Memory; -#if defined(WIN32) +#if defined(__WIN__) DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN); if (drc == 0xFFFFFFFF) { @@ -482,7 +482,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc) #endif // UNIX } // endif Abort -#if defined(WIN32) +#if defined(__WIN__) CloseHandle(fp->Handle); #else // UNIX close(fp->Handle); diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 4d66c2ab2ff..8afda723578 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -22,12 +22,12 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include //#include //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #include @@ -35,7 +35,7 @@ //#include #endif // !UNIX //#include -#endif // !WIN32 +#endif // !__WIN__ #include #include #include @@ -528,7 +528,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) To_Buf = (char*)PlugSubAlloc(g, NULL, Buflen); if (mode == MODE_INSERT) { -#if defined(WIN32) +#if defined(__WIN__) /************************************************************************/ /* Now we can revert to binary mode in particular because the eventual */ /* writing of a new header must be done in binary mode to avoid */ @@ -538,7 +538,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) sprintf(g->Message, MSG(BIN_MODE_FAIL), strerror(errno)); return true; } // endif setmode -#endif // WIN32 +#endif // __WIN__ /************************************************************************/ /* If this is a new file, the header must be generated. */ diff --git a/storage/connect/filamfix.cpp b/storage/connect/filamfix.cpp index c352db47044..cd25429318a 100644 --- a/storage/connect/filamfix.cpp +++ b/storage/connect/filamfix.cpp @@ -17,7 +17,7 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #include @@ -25,7 +25,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #include @@ -34,7 +34,7 @@ #endif // !UNIX #include #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ @@ -338,10 +338,10 @@ int FIXFAM::ReadBuffer(PGLOBAL g) } else if (feof(Stream)) { rc = RC_EF; } else { -#if defined(UNIX) - sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); -#else +#if defined(__WIN__) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); +#else + sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); #endif if (trace) @@ -678,7 +678,7 @@ BGXFAM::BGXFAM(PBGXFAM txfp) : FIXFAM(txfp) /***********************************************************************/ bool BGXFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, int org) { -#if defined(WIN32) +#if defined(__WIN__) char buf[256]; DWORD drc; LARGE_INTEGER of; @@ -694,14 +694,14 @@ bool BGXFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, int org) sprintf(g->Message, MSG(SFP_ERROR), buf); return true; } // endif -#else // !WIN32 +#else // !__WIN__ if (lseek64(h, pos, org) < 0) { // sprintf(g->Message, MSG(ERROR_IN_LSK), errno); sprintf(g->Message, "lseek64: %s", strerror(errno)); printf("%s\n", g->Message); return true; } // endif -#endif // !WIN32 +#endif // !__WIN__ return false; } // end of BigSeek @@ -714,7 +714,7 @@ int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)), { int rc; -#if defined(WIN32) +#if defined(__WIN__) DWORD nbr, drc, len = (DWORD)req; bool brc = ReadFile(h, inbuf, len, &nbr, NULL); @@ -736,12 +736,12 @@ int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)), rc = -1; } else rc = (int)nbr; -#else // !WIN32 +#else // !__WIN__ size_t len = (size_t)req; ssize_t nbr = read(h, inbuf, len); rc = (int)nbr; -#endif // !WIN32 +#endif // !__WIN__ return rc; } // end of BigRead @@ -753,7 +753,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) { bool rc = false; -#if defined(WIN32) +#if defined(__WIN__) DWORD nbw, drc, len = (DWORD)req; bool brc = WriteFile(h, inbuf, len, &nbw, NULL); @@ -780,7 +780,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif brc || nbw -#else // !WIN32 +#else // !__WIN__ size_t len = (size_t)req; ssize_t nbw = write(h, inbuf, len); @@ -795,7 +795,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif nbr -#endif // !WIN32 +#endif // !__WIN__ return rc; } // end of BigWrite @@ -830,7 +830,7 @@ bool BGXFAM::OpenTableFile(PGLOBAL g) if (trace) htrc("OpenTableFile: filename=%s mode=%d\n", filename, mode); -#if defined(WIN32) +#if defined(__WIN__) DWORD rc, access, creation, share = 0; /*********************************************************************/ @@ -987,7 +987,7 @@ int BGXFAM::Cardinality(PGLOBAL g) PlugSetPath(filename, To_File, Tdbp->GetPath()); -#if defined(WIN32) // OB +#if defined(__WIN__) // OB LARGE_INTEGER len; DWORD rc = 0; @@ -1346,7 +1346,7 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ /* Remove extra records. */ /*****************************************************************/ -#if defined(WIN32) +#if defined(__WIN__) if (BigSeek(g, Hfile, (BIGINT)Tpos * (BIGINT)Lrecl)) return RC_FX; @@ -1356,12 +1356,12 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc) sprintf(g->Message, MSG(SETEOF_ERROR), drc); return RC_FX; } // endif error -#else // !WIN32 +#else // !__WIN__ if (ftruncate64(Hfile, (BIGINT)(Tpos * Lrecl))) { sprintf(g->Message, MSG(TRUNCATE_ERROR), strerror(errno)); return RC_FX; } // endif -#endif // !WIN32 +#endif // !__WIN__ } // endif UseTemp @@ -1386,7 +1386,7 @@ bool BGXFAM::OpenTempFile(PGLOBAL g) strcat(PlugRemoveType(tempname, tempname), ".t"); remove(tempname); // Be sure it does not exist yet -#if defined(WIN32) +#if defined(__WIN__) Tfile = CreateFile(tempname, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); @@ -1526,7 +1526,7 @@ void BGXFAM::CloseTableFile(PGLOBAL g, bool abort) void BGXFAM::Rewind(void) { #if 0 // This is probably unuseful because file is accessed directly -#if defined(WIN32) //OB +#if defined(__WIN__) //OB SetFilePointer(Hfile, 0, NULL, FILE_BEGIN); #else // UNIX lseek64(Hfile, 0, SEEK_SET); diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index cce9cec56bd..e53cdcd9ba9 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -17,7 +17,7 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #include @@ -25,7 +25,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) || defined(UNIV_LINUX) #include #include @@ -36,7 +36,7 @@ #include #endif // !UNIX #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ @@ -716,10 +716,10 @@ int DOSFAM::SkipRecord(PGLOBAL g, bool header) if (feof(Stream)) return RC_EF; -#if defined(UNIX) || defined(UNIV_LINUX) - sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0)); -#else +#if defined(__WIN__) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); +#else + sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0)); #endif return RC_FX; } // endif fgets @@ -799,12 +799,12 @@ int DOSFAM::ReadBuffer(PGLOBAL g) if (trace > 1) htrc(" Read: To_Buf=%p p=%c\n", To_Buf, To_Buf, p); -#if defined(UNIX) - if (true) { - // Data files can be imported from Windows (having CRLF) -#else +#if defined(__WIN__) if (Bin) { // Data file is read in binary so CRLF remains +#else + if (true) { + // Data files can be imported from Windows (having CRLF) #endif if (*p == '\n' || *p == '\r') { // is this enough for Unix ??? @@ -833,10 +833,10 @@ int DOSFAM::ReadBuffer(PGLOBAL g) } else if (feof(Stream)) { rc = RC_EF; } else { -#if defined(UNIX) - sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0)); -#else +#if defined(__WIN__) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); +#else + sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0)); #endif if (trace) @@ -1028,15 +1028,15 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ /* Remove extra records. */ /*****************************************************************/ -#if defined(UNIX) - if (ftruncate(h, (off_t)Tpos)) { - sprintf(g->Message, MSG(TRUNCATE_ERROR), strerror(errno)); +#if defined(__WIN__) + if (chsize(h, Tpos)) { + sprintf(g->Message, MSG(CHSIZE_ERROR), strerror(errno)); close(h); return RC_FX; } // endif #else - if (chsize(h, Tpos)) { - sprintf(g->Message, MSG(CHSIZE_ERROR), strerror(errno)); + if (ftruncate(h, (off_t)Tpos)) { + sprintf(g->Message, MSG(TRUNCATE_ERROR), strerror(errno)); close(h); return RC_FX; } // endif @@ -1466,10 +1466,10 @@ int BLKFAM::ReadBuffer(PGLOBAL g) } else if (feof(Stream)) { rc = RC_EF; } else { -#if defined(UNIX) - sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); -#else +#if defined(__WIN__) sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL)); +#else + sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); #endif if (trace) @@ -1551,11 +1551,11 @@ int BLKFAM::WriteBuffer(PGLOBAL g) Spos = GetNextPos(); // New start position // Prepare the output buffer -#if defined(WIN32) +#if defined(__WIN__) crlf = "\r\n"; #else crlf = "\n"; -#endif // WIN32 +#endif // __WIN__ strcat(strcpy(OutBuf, Tdbp->GetLine()), crlf); len = strlen(OutBuf); } else { diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index 60a8875e015..fdc5433f4a4 100755 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -21,7 +21,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) @@ -29,7 +29,7 @@ #endif // __BORLAND__ //#include #include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #include @@ -40,7 +40,7 @@ #include #endif // !UNIX #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ @@ -49,7 +49,7 @@ /* tabdos.h is header containing the TABDOS class declarations. */ /***********************************************************************/ #include "global.h" -#include "osutil.h" // Unuseful for WIN32 +#include "osutil.h" // Unuseful for WINDOWS #include "plgdbsem.h" #include "valblk.h" #include "filamfix.h" @@ -376,11 +376,11 @@ bool VCTFAM::MakeEmptyFile(PGLOBAL g, char *fn) int h, n; PlugSetPath(filename, fn, Tdbp->GetPath()); -#if defined(WIN32) +#if defined(__WIN__) h= global_open(g, MSGID_OPEN_EMPTY_FILE, filename, _O_CREAT | _O_WRONLY, S_IREAD | S_IWRITE); -#else // !WIN32 +#else // !__WIN__ h= global_open(g, MSGID_OPEN_EMPTY_FILE, filename, O_CREAT | O_WRONLY, S_IREAD | S_IWRITE); -#endif // !WIN32 +#endif // !__WIN__ if (h == -1) return true; @@ -1669,7 +1669,7 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc) // Remove extra blocks n = Block * Blksize; -#if defined(WIN32) +#if defined(__WIN__) DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN); if (drc == 0xFFFFFFFF) { @@ -2574,11 +2574,11 @@ bool VECFAM::ReadBlock(PGLOBAL g, PVCTCOL colp) char fn[_MAX_PATH]; sprintf(fn, Colfn, colp->Index); -#if defined(WIN32) +#if defined(__WIN__) if (feof(Streams[i])) -#else // !WIN32 +#else // !__WIN__ if (errno == NO_ERROR) -#endif // !WIN32 +#endif // !__WIN__ sprintf(g->Message, MSG(BAD_READ_NUMBER), (int) n, fn); else sprintf(g->Message, MSG(READ_ERROR), @@ -2969,7 +2969,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc) /*****************************************************************/ n = Tpos * Clens[i]; -#if defined(WIN32) +#if defined(__WIN__) DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN); if (drc == 0xFFFFFFFF) { @@ -3049,7 +3049,7 @@ BGVFAM::BGVFAM(PBGVFAM txfp) : VCTFAM(txfp) /***********************************************************************/ bool BGVFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b) { -#if defined(WIN32) +#if defined(__WIN__) char buf[256]; DWORD drc, m = (b) ? FILE_END : FILE_BEGIN; LARGE_INTEGER of; @@ -3065,12 +3065,12 @@ bool BGVFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b) sprintf(g->Message, MSG(SFP_ERROR), buf); return true; } // endif -#else // !WIN32 +#else // !__WIN__ if (lseek64(h, pos, (b) ? SEEK_END : SEEK_SET) < 0) { sprintf(g->Message, MSG(ERROR_IN_LSK), errno); return true; } // endif -#endif // !WIN32 +#endif // !__WIN__ return false; } // end of BigSeek @@ -3082,7 +3082,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) { bool rc = false; -#if defined(WIN32) +#if defined(__WIN__) DWORD nbr, drc, len = (DWORD)req; bool brc = ReadFile(h, inbuf, len, &nbr, NULL); @@ -3108,7 +3108,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif brc || nbr -#else // !WIN32 +#else // !__WIN__ size_t len = (size_t)req; ssize_t nbr = read(h, inbuf, len); @@ -3123,7 +3123,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif nbr -#endif // !WIN32 +#endif // !__WIN__ return rc; } // end of BigRead @@ -3135,7 +3135,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) { bool rc = false; -#if defined(WIN32) +#if defined(__WIN__) DWORD nbw, drc, len = (DWORD)req; bool brc = WriteFile(h, inbuf, len, &nbw, NULL); @@ -3162,7 +3162,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif brc || nbw -#else // !WIN32 +#else // !__WIN__ size_t len = (size_t)req; ssize_t nbw = write(h, inbuf, len); @@ -3177,7 +3177,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req) rc = true; } // endif nbr -#endif // !WIN32 +#endif // !__WIN__ return rc; } // end of BigWrite @@ -3203,7 +3203,7 @@ int BGVFAM::GetBlockInfo(PGLOBAL g) if (Header == 2) strcat(PlugRemoveType(filename, filename), ".blk"); -#if defined(WIN32) +#if defined(__WIN__) LARGE_INTEGER len; h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, @@ -3215,11 +3215,11 @@ int BGVFAM::GetBlockInfo(PGLOBAL g) } // endif h if (h == INVALID_HANDLE_VALUE || !len.QuadPart) { -#else // !WIN32 +#else // !__WIN__ h = open64(filename, O_RDONLY, 0); if (h == INVALID_HANDLE_VALUE || !_filelength(h)) { -#endif // !WIN32 +#endif // !__WIN__ // Consider this is a void table if (trace) htrc("Void table h=%d\n", h); @@ -3280,17 +3280,17 @@ bool BGVFAM::SetBlockInfo(PGLOBAL g) strcat(PlugRemoveType(filename, filename), ".blk"); if (h == INVALID_HANDLE_VALUE) { -#if defined(WIN32) +#if defined(__WIN__) DWORD creation = (b) ? OPEN_EXISTING : TRUNCATE_EXISTING; h = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, creation, FILE_ATTRIBUTE_NORMAL, NULL); -#else // !WIN32 +#else // !__WIN__ int oflag = (b) ? O_RDWR : O_RDWR | O_TRUNC; h = open64(filename, oflag, 0); -#endif // !WIN32 +#endif // !__WIN__ if (h == INVALID_HANDLE_VALUE) { sprintf(g->Message, "Error opening header file %s", filename); @@ -3328,7 +3328,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn) PlugSetPath(filename, fn, Tdbp->GetPath()); -#if defined(WIN32) +#if defined(__WIN__) char *p; DWORD rc; bool brc; @@ -3380,7 +3380,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn) CloseHandle(h); return true; -#else // !WIN32 +#else // !__WIN__ int h; BIGINT pos; @@ -3409,7 +3409,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, char *fn) sprintf(g->Message, MSG(MAKE_EMPTY_FILE), To_File, strerror(errno)); close(h); return true; -#endif // !WIN32 +#endif // !__WIN__ } // end of MakeEmptyFile /***********************************************************************/ @@ -3440,7 +3440,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g) htrc("OpenTableFile: filename=%s mode=%d Last=%d\n", filename, mode, Last); -#if defined(WIN32) +#if defined(__WIN__) DWORD access, creation, share = 0, rc = 0; /*********************************************************************/ @@ -3766,7 +3766,7 @@ int BGVFAM::WriteBuffer(PGLOBAL g) if (!Closing && !MaxBlk) { // Close the VCT file and reopen it in mode Insert -//#if defined(WIN32) //OB +//#if defined(__WIN__) //OB // CloseHandle(Hfile); //#else // UNIX // close(Hfile); @@ -3893,7 +3893,7 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc) /***************************************************************/ /* Remove extra records. */ /***************************************************************/ -#if defined(WIN32) +#if defined(__WIN__) BIGINT pos = (BIGINT)Block * (BIGINT)Blksize; if (BigSeek(g, Hfile, pos)) @@ -3905,12 +3905,12 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc) sprintf(g->Message, MSG(SETEOF_ERROR), drc); return RC_FX; } // endif error -#else // !WIN32 +#else // !__WIN__ if (ftruncate64(Hfile, (BIGINT)(Tpos * Lrecl))) { sprintf(g->Message, MSG(TRUNCATE_ERROR), strerror(errno)); return RC_FX; } // endif -#endif // !WIN32 +#endif // !__WIN__ } else // MaxBlk // Clean the unused space in the file, this is required when // inserting again with a partial column list. @@ -3947,7 +3947,7 @@ bool BGVFAM::OpenTempFile(PGLOBAL g) else if (MakeEmptyFile(g, tempname)) return true; -#if defined(WIN32) +#if defined(__WIN__) DWORD access = (MaxBlk) ? OPEN_EXISTING : CREATE_NEW; Tfile = CreateFile(tempname, GENERIC_WRITE, 0, NULL, @@ -4218,7 +4218,7 @@ void BGVFAM::Rewind(void) CurNum = Nrec - 1; #if 0 // This is probably unuseful as the file is directly accessed -#if defined(WIN32) //OB +#if defined(__WIN__) //OB SetFilePointer(Hfile, 0, NULL, FILE_BEGIN); #else // UNIX lseek64(Hfile, 0, SEEK_SET); diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index 54af93e11fa..56faa555069 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -17,21 +17,21 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #else // !UNIX #include #endif #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ @@ -89,11 +89,11 @@ int ZIPFAM::Zerror(PGLOBAL g) strcpy(g->Message, gzerror(Zfile, &errnum)); if (errnum == Z_ERRNO) -#if defined(WIN32) +#if defined(__WIN__) sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(NULL)); -#else // !WIN32 +#else // !__WIN__ sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno)); -#endif // !WIN32 +#endif // !__WIN__ return (errnum == Z_STREAM_END) ? RC_EF : RC_FX; } // end of Zerror @@ -764,9 +764,9 @@ bool ZIXFAM::AllocateBuffer(PGLOBAL g) if (Tdbp->GetFtype() < 2) // if not binary, the file is physically a text file for (int len = Lrecl; len <= Buflen; len += Lrecl) { -#if defined(WIN32) +#if defined(__WIN__) To_Buf[len - 2] = '\r'; -#endif // WIN32 +#endif // __WIN__ To_Buf[len - 1] = '\n'; } // endfor len diff --git a/storage/connect/filter.cpp b/storage/connect/filter.cpp index 949d49c2943..262d6b58a70 100644 --- a/storage/connect/filter.cpp +++ b/storage/connect/filter.cpp @@ -13,13 +13,13 @@ #include "sql_class.h" //#include "sql_time.h" -#if defined(WIN32) +#if defined(__WIN__) //#include -#else // !WIN32 +#else // !__WIN__ #include #include #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ diff --git a/storage/connect/filter.h b/storage/connect/filter.h index ab7c2139b68..15730e2cc44 100644 --- a/storage/connect/filter.h +++ b/storage/connect/filter.h @@ -106,7 +106,7 @@ class FILTERX : public FILTER { // Fake operator new used to change a filter into a derived filter void * operator new(size_t, PFIL filp) {return filp;} -#if defined(WIN32) +#if defined(__WIN__) // Avoid warning C4291 by defining a matching dummy delete operator void operator delete(void *, PFIL) {} #else diff --git a/storage/connect/fmdlex.c b/storage/connect/fmdlex.c index a72a2b9b31e..22c3a1e79ad 100644 --- a/storage/connect/fmdlex.c +++ b/storage/connect/fmdlex.c @@ -20,11 +20,12 @@ */ #define FLEX_SCANNER -#if WIN32 +#ifdef __WIN__ #define __STDC__ 1 +#define isatty _isatty #endif #include -#ifndef WIN32 +#ifndef __WIN__ #include #endif diff --git a/storage/connect/global.h b/storage/connect/global.h index 10564d09815..4d01a3ff05b 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -13,11 +13,11 @@ #include /* time_t type declaration */ #include /* Long jump declarations */ -#if defined(WIN32) && !defined(NOEX) +#if defined(__WIN__) && !defined(NOEX) #define DllExport __declspec( dllexport ) -#else // !WIN32 +#else // !__WIN__ #define DllExport -#endif // !WIN32 +#endif // !__WIN__ #if defined(DOMDOC_SUPPORT) || defined(LIBXML2_SUPPORT) #define XML_SUPPORT 1 @@ -42,11 +42,11 @@ #define STEP(I) MSG_##I #endif // !XMSG and !NEWMSG -#if defined(WIN32) +#if defined(__WIN__) #define CRLF 2 -#else // !WIN32 +#else // !__WIN__ #define CRLF 1 -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Define access to the thread based trace value. */ @@ -104,7 +104,7 @@ #define SYS_STAMP "DOSR" #elif defined(WIN) #define SYS_STAMP "WIN1" -#elif defined(WIN32) +#elif defined(__WIN__) #define SYS_STAMP "WIN2" #else #define SYS_STAMP "XXXX" @@ -248,9 +248,9 @@ DllExport char *PlugReadMessage(PGLOBAL, int, char *); #elif defined(NEWMSG) DllExport char *PlugGetMessage(PGLOBAL, int); #endif // XMSG || NEWMSG -#if defined(WIN32) +#if defined(__WIN__) DllExport short GetLineLength(PGLOBAL); // Console line length -#endif // WIN32 +#endif // __WIN__ DllExport PGLOBAL PlugInit(LPCSTR, uint); // Plug global initialization DllExport int PlugExit(PGLOBAL); // Plug global termination DllExport LPSTR PlugRemoveType(LPSTR, LPCSTR); diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 964185b1b27..6769760c5fa 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -138,10 +138,10 @@ #include "reldef.h" #include "tabcol.h" #include "xindex.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include "tabwmi.h" -#endif // WIN32 +#endif // __WIN__ #include "connect.h" #include "user_connect.h" #include "ha_connect.h" @@ -170,12 +170,12 @@ extern "C" { char version[]= "Version 1.03.0007 April 30, 2015"; -#if defined(WIN32) +#if defined(__WIN__) char compver[]= "Version 1.03.0007 " __DATE__ " " __TIME__; char slash= '\\'; -#else // !WIN32 +#else // !__WIN__ char slash= '/'; -#endif // !WIN32 +#endif // !__WIN__ } // extern "C" #if defined(XMAP) @@ -195,9 +195,8 @@ extern "C" { /***********************************************************************/ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); PQRYRES VirColumns(PGLOBAL g, bool info); -PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, - int pretty, int lvl, int mxr, bool info); -PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info); +PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info); +PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info); void PushWarning(PGLOBAL g, THD *thd, int level); bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, const char *db, char *tab, const char *src, int port); @@ -630,11 +629,11 @@ static int connect_init_func(void *p) } #endif // 0 (LINUX) -#if defined(WIN32) +#if defined(__WIN__) sql_print_information("CONNECT: %s", compver); -#else // !WIN32 +#else // !__WIN__ sql_print_information("CONNECT: %s", version); -#endif // !WIN32 +#endif // !__WIN__ #ifdef LIBXML2_SUPPORT XmlInitParserLib(); @@ -676,9 +675,9 @@ static int connect_done_func(void *) XmlCleanupParserLib(); #endif // LIBXML2_SUPPORT -#if !defined(WIN32) +#if !defined(__WIN__) //PROFILE_End(); Causes signal 11 -#endif // !WIN32 +#endif // !__WIN__ for (pc= user_connect::to_users; pc; pc= pn) { if (pc->g) @@ -745,11 +744,11 @@ ha_connect::ha_connect(handlerton *hton, TABLE_SHARE *table_arg) xp= (table) ? GetUser(ha_thd(), NULL) : NULL; if (xp) xp->SetHandler(this); -#if defined(WIN32) +#if defined(__WIN__) datapath= ".\\"; -#else // !WIN32 +#else // !__WIN__ datapath= "./"; -#endif // !WIN32 +#endif // !__WIN__ tdbp= NULL; sdvalin1= sdvalin2= sdvalin3= sdvalin4= NULL; sdvalout= NULL; @@ -1017,6 +1016,117 @@ char *GetListOption(PGLOBAL g, const char *opname, return opval; } // end of GetListOption +/****************************************************************************/ +/* Return the value of a string option or NULL if not specified. */ +/****************************************************************************/ +char *GetStringTableOption(PGLOBAL g, PTOS options, char *opname, char *sdef) +{ + const char *opval= NULL; + + if (!options) + return sdef; + else if (!stricmp(opname, "Type")) + opval= options->type; + else if (!stricmp(opname, "Filename")) + opval= options->filename; + else if (!stricmp(opname, "Optname")) + opval= options->optname; + else if (!stricmp(opname, "Tabname")) + opval= options->tabname; + else if (!stricmp(opname, "Tablist")) + opval= options->tablist; + else if (!stricmp(opname, "Database") || + !stricmp(opname, "DBname")) + opval= options->dbname; + else if (!stricmp(opname, "Separator")) + opval= options->separator; + else if (!stricmp(opname, "Qchar")) + opval= options->qchar; + else if (!stricmp(opname, "Module")) + opval= options->module; + else if (!stricmp(opname, "Subtype")) + opval= options->subtype; + else if (!stricmp(opname, "Catfunc")) + opval= options->catfunc; + else if (!stricmp(opname, "Srcdef")) + opval= options->srcdef; + else if (!stricmp(opname, "Colist")) + opval= options->colist; + else if (!stricmp(opname, "Data_charset")) + opval= options->data_charset; + + if (!opval && options && options->oplist) + opval= GetListOption(g, opname, options->oplist); + + return opval ? (char*)opval : sdef; +} // end of GetStringTableOption + +/****************************************************************************/ +/* Return the value of a Boolean option or bdef if not specified. */ +/****************************************************************************/ +bool GetBooleanTableOption(PGLOBAL g, PTOS options, char *opname, bool bdef) +{ + bool opval= bdef; + char *pv; + + if (!options) + return bdef; + else if (!stricmp(opname, "Mapped")) + opval= options->mapped; + else if (!stricmp(opname, "Huge")) + opval= options->huge; + else if (!stricmp(opname, "Split")) + opval= options->split; + else if (!stricmp(opname, "Readonly")) + opval= options->readonly; + else if (!stricmp(opname, "SepIndex")) + opval= options->sepindex; + else if (!stricmp(opname, "Header")) + opval= (options->header != 0); // Is Boolean for some table types + else if (options->oplist) + if ((pv= GetListOption(g, opname, options->oplist))) + opval= (!*pv || *pv == 'y' || *pv == 'Y' || atoi(pv) != 0); + + return opval; +} // end of GetBooleanTableOption + +/****************************************************************************/ +/* Return the value of an integer option or NO_IVAL if not specified. */ +/****************************************************************************/ +int GetIntegerTableOption(PGLOBAL g, PTOS options, char *opname, int idef) +{ + ulonglong opval= NO_IVAL; + + if (!options) + return idef; + else if (!stricmp(opname, "Lrecl")) + opval= options->lrecl; + else if (!stricmp(opname, "Elements")) + opval= options->elements; + else if (!stricmp(opname, "Multiple")) + opval= options->multiple; + else if (!stricmp(opname, "Header")) + opval= options->header; + else if (!stricmp(opname, "Quoted")) + opval= options->quoted; + else if (!stricmp(opname, "Ending")) + opval= options->ending; + else if (!stricmp(opname, "Compressed")) + opval= (options->compressed); + + if (opval == NO_IVAL) { + char *pv; + + if ((pv= GetListOption(g, opname, options->oplist))) + opval= CharToNumber(pv, strlen(pv), ULONGLONG_MAX, true); + else + return idef; + + } // endif opval + + return (int)opval; +} // end of GetIntegerTableOption + /****************************************************************************/ /* Return the table option structure. */ /****************************************************************************/ @@ -1035,9 +1145,6 @@ char *ha_connect::GetRealString(const char *s) char *sv; if (IsPartitioned() && s) { -// sv= (char*)PlugSubAlloc(xp->g, NULL, strlen(s) + strlen(partname)); - // With wrong string pattern, the size of the constructed string - // can be more than strlen(s) + strlen(partname) sv= (char*)PlugSubAlloc(xp->g, NULL, 0); sprintf(sv, s, partname); PlugSubAlloc(xp->g, NULL, strlen(sv) + 1); @@ -1048,7 +1155,7 @@ char *ha_connect::GetRealString(const char *s) } // end of GetRealString /****************************************************************************/ -/* Return the value of a string option or NULL if not specified. */ +/* Return the value of a string option or sdef if not specified. */ /****************************************************************************/ char *ha_connect::GetStringOption(char *opname, char *sdef) { @@ -1066,37 +1173,6 @@ char *ha_connect::GetStringOption(char *opname, char *sdef) opval= thd_query_string(table->in_use)->str; else if (!stricmp(opname, "Partname")) opval= partname; - else if (!options) - ; - else if (!stricmp(opname, "Type")) - opval= (char*)options->type; - else if (!stricmp(opname, "Filename")) - opval= GetRealString(options->filename); - else if (!stricmp(opname, "Optname")) - opval= (char*)options->optname; - else if (!stricmp(opname, "Tabname")) - opval= GetRealString(options->tabname); - else if (!stricmp(opname, "Tablist")) - opval= (char*)options->tablist; - else if (!stricmp(opname, "Database") || - !stricmp(opname, "DBname")) - opval= (char*)options->dbname; - else if (!stricmp(opname, "Separator")) - opval= (char*)options->separator; - else if (!stricmp(opname, "Qchar")) - opval= (char*)options->qchar; - else if (!stricmp(opname, "Module")) - opval= (char*)options->module; - else if (!stricmp(opname, "Subtype")) - opval= (char*)options->subtype; - else if (!stricmp(opname, "Catfunc")) - opval= (char*)options->catfunc; - else if (!stricmp(opname, "Srcdef")) - opval= (char*)options->srcdef; - else if (!stricmp(opname, "Colist")) - opval= (char*)options->colist; - else if (!stricmp(opname, "Data_charset")) - opval= (char*)options->data_charset; else if (!stricmp(opname, "Table_charset")) { const CHARSET_INFO *chif= (tshp) ? tshp->table_charset : table->s->table_charset; @@ -1104,17 +1180,13 @@ char *ha_connect::GetStringOption(char *opname, char *sdef) if (chif) opval= (char*)chif->csname; - } // endif Table_charset + } else + opval= GetStringTableOption(xp->g, options, opname, NULL); - if (!opval && options && options->oplist) { - opval= GetListOption(xp->g, opname, options->oplist); - - if (opval && (!stricmp(opname, "connect") - || !stricmp(opname, "tabname") - || !stricmp(opname, "filename"))) - opval = GetRealString(opval); - - } // endif opval + if (opval && (!stricmp(opname, "connect") + || !stricmp(opname, "tabname") + || !stricmp(opname, "filename"))) + opval = GetRealString(opval); if (!opval) { if (sdef && !strcmp(sdef, "*")) { @@ -1145,31 +1217,13 @@ char *ha_connect::GetStringOption(char *opname, char *sdef) /****************************************************************************/ bool ha_connect::GetBooleanOption(char *opname, bool bdef) { - bool opval= bdef; - char *pv; + bool opval; PTOS options= GetTableOptionStruct(); if (!stricmp(opname, "View")) opval= (tshp) ? tshp->is_view : table_share->is_view; - else if (!options) - ; - else if (!stricmp(opname, "Mapped")) - opval= options->mapped; - else if (!stricmp(opname, "Huge")) - opval= options->huge; -//else if (!stricmp(opname, "Compressed")) -// opval= options->compressed; - else if (!stricmp(opname, "Split")) - opval= options->split; - else if (!stricmp(opname, "Readonly")) - opval= options->readonly; - else if (!stricmp(opname, "SepIndex")) - opval= options->sepindex; - else if (!stricmp(opname, "Header")) - opval= (options->header != 0); // Is Boolean for some table types - else if (options->oplist) - if ((pv= GetListOption(xp->g, opname, options->oplist))) - opval= (!*pv || *pv == 'y' || *pv == 'Y' || atoi(pv) != 0); + else + opval= GetBooleanTableOption(xp->g, options, opname, bdef); return opval; } // end of GetBooleanOption @@ -1198,37 +1252,18 @@ bool ha_connect::SetBooleanOption(char *opname, bool b) /****************************************************************************/ int ha_connect::GetIntegerOption(char *opname) { - ulonglong opval= NO_IVAL; - char *pv; + int opval; PTOS options= GetTableOptionStruct(); TABLE_SHARE *tsp= (tshp) ? tshp : table_share; if (!stricmp(opname, "Avglen")) - opval= (ulonglong)tsp->avg_row_length; + opval= (int)tsp->avg_row_length; else if (!stricmp(opname, "Estimate")) - opval= (ulonglong)tsp->max_rows; - else if (!options) - ; - else if (!stricmp(opname, "Lrecl")) - opval= options->lrecl; - else if (!stricmp(opname, "Elements")) - opval= options->elements; - else if (!stricmp(opname, "Multiple")) - opval= options->multiple; - else if (!stricmp(opname, "Header")) - opval= options->header; - else if (!stricmp(opname, "Quoted")) - opval= options->quoted; - else if (!stricmp(opname, "Ending")) - opval= options->ending; - else if (!stricmp(opname, "Compressed")) - opval= (options->compressed); + opval= (int)tsp->max_rows; + else + opval= GetIntegerTableOption(xp->g, options, opname, NO_IVAL); - if (opval == (ulonglong)NO_IVAL && options && options->oplist) - if ((pv= GetListOption(xp->g, opname, options->oplist))) - opval= CharToNumber(pv, strlen(pv), ULONGLONG_MAX, true); - - return (int)opval; + return opval; } // end of GetIntegerOption /****************************************************************************/ @@ -3957,11 +3992,11 @@ bool ha_connect::check_privileges(THD *thd, PTOS options, char *dbn) case TAB_JSON: if (options->filename && *options->filename) { char *s, path[FN_REFLEN], dbpath[FN_REFLEN]; -#if defined(WIN32) +#if defined(__WIN__) s= "\\"; -#else // !WIN32 +#else // !__WIN__ s= "/"; -#endif // !WIN32 +#endif // !__WIN__ strcpy(dbpath, mysql_real_data_home); if (db) @@ -4720,6 +4755,9 @@ ha_rows ha_connect::records_in_range(uint inx, key_range *min_key, else rows= HA_POS_ERROR; + if (trace) + htrc("records_in_range: rows=%llu\n", rows); + DBUG_RETURN(rows); } // end of records_in_range @@ -4965,12 +5003,12 @@ static int connect_assisted_discovery(handlerton *, THD* thd, const char *fncn= "?"; const char *user, *fn, *db, *host, *pwd, *sep, *tbl, *src; const char *col, *ocl, *rnk, *pic, *fcl, *skc; - char *tab, *dsn, *shm, *dpath, *objn; -#if defined(WIN32) + char *tab, *dsn, *shm, *dpath; +#if defined(__WIN__) char *nsp= NULL, *cls= NULL; -#endif // WIN32 - int port= 0, hdr= 0, mxr= 0, mxe= 0, rc= 0, lvl= 0; - int cop __attribute__((unused))= 0, pty= 2, lrecl= 0; +#endif // __WIN__ + int port= 0, hdr= 0, mxr= 0, mxe= 0, rc= 0; + int cop __attribute__((unused))= 0, lrecl= 0; #if defined(ODBC_SUPPORT) POPARM sop = NULL; char *ucnc = NULL; @@ -5000,7 +5038,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, if (!g) return HA_ERR_INTERNAL_ERROR; - user= host= pwd= tbl= src= col= ocl= pic= fcl= skc= rnk= dsn= objn= NULL; + user= host= pwd= tbl= src= col= ocl= pic= fcl= skc= rnk= dsn= NULL; // Get the useful create options ttp= GetTypeID(topt->type); @@ -5031,11 +5069,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd, skc= GetListOption(g, "skipcol", topt->oplist, NULL); rnk= GetListOption(g, "rankcol", topt->oplist, NULL); pwd= GetListOption(g, "password", topt->oplist); - objn= GetListOption(g, "Object", topt->oplist, NULL); -#if defined(WIN32) +#if defined(__WIN__) nsp= GetListOption(g, "namespace", topt->oplist); cls= GetListOption(g, "class", topt->oplist); -#endif // WIN32 +#endif // __WIN__ port= atoi(GetListOption(g, "port", topt->oplist, "0")); #if defined(ODBC_SUPPORT) mxr= atoi(GetListOption(g,"maxres", topt->oplist, "0")); @@ -5049,8 +5086,6 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #if defined(PROMPT_OK) cop= atoi(GetListOption(g, "checkdsn", topt->oplist, "0")); #endif // PROMPT_OK - pty= atoi(GetListOption(g,"Pretty", topt->oplist, "2")); - lvl= atoi(GetListOption(g,"Level", topt->oplist, "0")); } else { host= "localhost"; user= (ttp == TAB_ODBC ? NULL : "root"); @@ -5194,11 +5229,11 @@ static int connect_assisted_discovery(handlerton *, THD* thd, ok= false; break; -#if defined(WIN32) +#if defined(__WIN__) case TAB_WMI: ok= true; break; -#endif // WIN32 +#endif // __WIN__ #if defined(PIVOT_SUPPORT) case TAB_PIVOT: supfnc= FNC_NO; @@ -5311,11 +5346,11 @@ static int connect_assisted_discovery(handlerton *, THD* thd, case TAB_CSV: qrp= CSVColumns(g, dpath, fn, spc, qch, hdr, mxe, fnc == FNC_COL); break; -#if defined(WIN32) +#if defined(__WIN__) case TAB_WMI: qrp= WMIColumns(g, nsp, cls, fnc == FNC_COL); break; -#endif // WIN32 +#endif // __WIN__ case TAB_PRX: case TAB_TBL: case TAB_XCL: @@ -5342,7 +5377,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, qrp= VirColumns(g, fnc == FNC_COL); break; case TAB_JSON: - qrp= JSONColumns(g, (char*)db, fn, objn, pty, lrecl, lvl, fnc == FNC_COL); + qrp= JSONColumns(g, (char*)db, topt, fnc == FNC_COL); break; #if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) case TAB_XML: @@ -5491,10 +5526,11 @@ static int connect_assisted_discovery(handlerton *, THD* thd, #if defined(ODBC_SUPPORT) if (ttp == TAB_ODBC) { - int plgtyp; + int plgtyp; + bool w= false; // Wide character type // typ must be PLG type, not SQL type - if (!(plgtyp= TranslateSQLType(typ, dec, prec, v))) { + if (!(plgtyp= TranslateSQLType(typ, dec, prec, v, w))) { if (GetTypeConv() == TPC_SKIP) { // Skip this column sprintf(g->Message, "Column %s skipped (unsupported type %d)", @@ -5511,6 +5547,13 @@ static int connect_assisted_discovery(handlerton *, THD* thd, typ= plgtyp; switch (typ) { + case TYPE_STRING: + if (w) { + sprintf(g->Message, "Column %s is wide characters", cnm); + push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message); + } // endif w + + break; case TYPE_DOUBLE: // Some data sources do not count dec in length (prec) prec += (dec + 2); // To be safe @@ -5769,11 +5812,11 @@ int ha_connect::create(const char *name, TABLE *table_arg, // on Windows and libxml2 otherwise switch (*xsup) { case '*': -#if defined(WIN32) +#if defined(__WIN__) dom= true; -#else // !WIN32 +#else // !__WIN__ dom= false; -#endif // !WIN32 +#endif // !__WIN__ break; case 'M': case 'D': @@ -6120,11 +6163,11 @@ bool ha_connect::FileExists(const char *fn, bool bf) NULL, NULL, 0, 0)) return true; -#if defined(WIN32) +#if defined(__WIN__) s= "\\"; -#else // !WIN32 +#else // !__WIN__ s= "/"; -#endif // !WIN32 +#endif // !__WIN__ if (IsPartitioned()) { sprintf(tfn, fn, GetPartName()); @@ -6608,7 +6651,7 @@ maria_declare_plugin(connect) 0x0103, /* version number (1.03) */ NULL, /* status variables */ connect_system_variables, /* system variables */ - "1.03.0006", /* string version */ + "1.03.0007", /* string version */ MariaDB_PLUGIN_MATURITY_BETA /* maturity */ } maria_declare_plugin_end; diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 1e597f751ca..3d03bea5d00 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -23,7 +23,7 @@ #define ARGS MY_MIN(24,len-i),s+MY_MAX(i-3,0) -#if defined(WIN32) +#if defined(__WIN__) #define EL "\r\n" #else #define EL "\n" diff --git a/storage/connect/libdoc.cpp b/storage/connect/libdoc.cpp index 7d1d014c48b..c2882fc0d7c 100644 --- a/storage/connect/libdoc.cpp +++ b/storage/connect/libdoc.cpp @@ -533,8 +533,8 @@ int LIBXMLDOC::DumpDoc(PGLOBAL g, char *ofn) // This function does not crash ( if (xmlSaveFormatFileEnc((const char *)ofn, Docp, Encoding, 0) < 0) { xmlErrorPtr err = xmlGetLastError(); - strcpy(g->Message, (err) ? err->message : "Error saving XML doc"); + xmlResetError(Xerr); rc = -1; } // endif Save // rc = xmlDocDump(of, Docp); @@ -569,6 +569,7 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp) htrc("CloseDoc: xp=%p count=%d\n", xp, (xp) ? xp->Count : 0); //if (xp && xp->Count == 1) { + if (xp) { if (Nlist) { xmlXPathFreeNodeSet(Nlist); @@ -605,7 +606,7 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp) Ctxp = NULL; } // endif Ctxp -// } // endif Count + } // endif xp CloseXML2File(g, xp, false); } // end of Close diff --git a/storage/connect/macutil.cpp b/storage/connect/macutil.cpp index 4d3022b91b6..f5d3bb11fe9 100644 --- a/storage/connect/macutil.cpp +++ b/storage/connect/macutil.cpp @@ -2,11 +2,11 @@ /* MACUTIL: Author Olivier Bertrand -- 2008-2012 */ /* From the article and sample code by Khalid Shaikh. */ /***********************************************************************/ -#if defined(WIN32) +#if defined(__WIN__) #include "my_global.h" -#else // !WIN32 -#error This is WIN32 only DLL -#endif // !WIN32 +#else // !__WIN__ +#error This is WINDOWS only DLL +#endif // !__WIN__ #include "global.h" #include "plgdbsem.h" #include "macutil.h" diff --git a/storage/connect/macutil.h b/storage/connect/macutil.h index 8a3e97e12e1..c80bd58e20a 100644 --- a/storage/connect/macutil.h +++ b/storage/connect/macutil.h @@ -1,10 +1,10 @@ // MACUTIL.H Olivier Bertrand 2008-2012 // Get Mac Addresses via GetAdaptersInfo -#if defined(WIN32) +#if defined(__WIN__) #include -#else // !WIN32 -#error This is WIN32 only -#endif // !WIN32 +#else // !__WIN__ +#error This is WINDOWS only +#endif // !__WIN__ #include "block.h" typedef class MACINFO *MACIP; diff --git a/storage/connect/maputil.cpp b/storage/connect/maputil.cpp index 97c638b4254..c4e016f1511 100644 --- a/storage/connect/maputil.cpp +++ b/storage/connect/maputil.cpp @@ -14,7 +14,7 @@ #include "plgdbsem.h" #include "maputil.h" -#ifdef WIN32 +#ifdef __WIN__ /***********************************************************************/ /* In Insert mode, just open the file for append. Otherwise */ /* create the mapping file object. The map handle can be released */ diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index 0ef43a245fa..9c72e9cd665 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -30,7 +30,7 @@ /***********************************************************************/ #include -#if defined(WIN32) +#if defined(__WIN__) //#include //#include #elif defined(UNIX) @@ -66,10 +66,10 @@ #include "tabfmt.h" #include "tabvct.h" #include "tabsys.h" -#if defined(WIN32) +#if defined(__WIN__) #include "tabmac.h" #include "tabwmi.h" -#endif // WIN32 +#endif // __WIN__ //#include "tabtbl.h" #include "tabxcl.h" #include "tabtbl.h" @@ -93,9 +93,9 @@ /***********************************************************************/ /* Extern static variables. */ /***********************************************************************/ -#if defined(WIN32) +#if defined(__WIN__) extern "C" HINSTANCE s_hModule; // Saved module handle -#endif // !WIN32 +#endif // !__WIN__ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); @@ -142,7 +142,7 @@ TABTYPE GetTypeID(const char *type) : (!stricmp(type, "MYSQL")) ? TAB_MYSQL : (!stricmp(type, "MYPRX")) ? TAB_MYSQL : (!stricmp(type, "DIR")) ? TAB_DIR -#ifdef WIN32 +#ifdef __WIN__ : (!stricmp(type, "MAC")) ? TAB_MAC : (!stricmp(type, "WMI")) ? TAB_WMI #endif @@ -349,11 +349,11 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) typedef PQRYRES (__stdcall *XCOLDEF) (PGLOBAL, void*, char*, char*, bool); const char *module, *subtype; char c, soname[_MAX_PATH], getname[40] = "Col"; -#if defined(WIN32) +#if defined(__WIN__) HANDLE hdll; /* Handle to the external DLL */ -#else // !WIN32 +#else // !__WIN__ void *hdll; /* Handle for the loaded shared library */ -#endif // !WIN32 +#endif // !__WIN__ XCOLDEF coldef = NULL; PQRYRES qrp = NULL; @@ -381,7 +381,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) if (!c) break; } // endfor i -#if defined(WIN32) +#if defined(__WIN__) // Load the Dll implementing the table if (!(hdll = LoadLibrary(soname))) { char buf[256]; @@ -401,7 +401,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) FreeLibrary((HMODULE)hdll); return NULL; } // endif coldef -#else // !WIN32 +#else // !__WIN__ const char *error = NULL; // Load the desired shared library @@ -418,7 +418,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) dlclose(hdll); return NULL; } // endif coldef -#endif // !WIN32 +#endif // !__WIN__ // Just in case the external Get function does not set error messages sprintf(g->Message, "Error getting column info from %s", subtype); @@ -426,11 +426,11 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) // Get the table column definition qrp = coldef(g, topt, tab, db, info); -#if defined(WIN32) +#if defined(__WIN__) FreeLibrary((HMODULE)hdll); -#else // !WIN32 +#else // !__WIN__ dlclose(hdll); -#endif // !WIN32 +#endif // !__WIN__ return qrp; } // end of OEMColumns @@ -442,11 +442,11 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info) /***********************************************************************/ CATALOG::CATALOG(void) { -#if defined(WIN32) +#if defined(__WIN__) //DataPath= ".\\"; -#else // !WIN32 +#else // !__WIN__ //DataPath= "./"; -#endif // !WIN32 +#endif // !__WIN__ memset(&Ctb, 0, sizeof(CURTAB)); Cbuf= NULL; Cblen= 0; @@ -489,11 +489,11 @@ void MYCAT::SetPath(PGLOBAL g, LPCSTR *datapath, const char *path) } if (*path != '.') { -#if defined(WIN32) +#if defined(__WIN__) char *s= "\\"; -#else // !WIN32 +#else // !__WIN__ char *s= "/"; -#endif // !WIN32 +#endif // !__WIN__ strcat(strcat(strcat(strcpy(buf, "."), s), path), s); } else strcpy(buf, path); @@ -554,10 +554,10 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, LPCSTR name, LPCSTR am) #if defined(ODBC_SUPPORT) case TAB_ODBC: tdp= new(g) ODBCDEF; break; #endif // ODBC_SUPPORT -#if defined(WIN32) +#if defined(__WIN__) case TAB_MAC: tdp= new(g) MACDEF; break; case TAB_WMI: tdp= new(g) WMIDEF; break; -#endif // WIN32 +#endif // __WIN__ case TAB_OEM: tdp= new(g) OEMDEF; break; case TAB_TBL: tdp= new(g) TBLDEF; break; case TAB_XCL: tdp= new(g) XCLDEF; break; diff --git a/storage/connect/mycat.h b/storage/connect/mycat.h index f7c4c70eaf5..d4024e6b6c3 100644 --- a/storage/connect/mycat.h +++ b/storage/connect/mycat.h @@ -24,7 +24,7 @@ #include "block.h" #include "catalog.h" -typedef struct ha_table_option_struct TOS, *PTOS; +//typedef struct ha_table_option_struct TOS, *PTOS; /** structure for CREATE TABLE options (table options) diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index 2b958b512f3..ada0109a820 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -35,11 +35,11 @@ #include "my_sys.h" #include "mysqld_error.h" #endif // !MYSQL_PREPARED_STATEMENTS -#if defined(WIN32) +#if defined(__WIN__) //#include -#else // !WIN32 +#else // !__WIN__ #include "osutil.h" -#endif // !WIN32 +#endif // !__WIN__ #include "global.h" #include "plgdbsem.h" @@ -451,15 +451,15 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db, mysql_options(m_DB, MYSQL_OPT_READ_TIMEOUT, &nrt); //mysql_options(m_DB, MYSQL_OPT_WRITE_TIMEOUT, ...); -#if defined(WIN32) +#if defined(__WIN__) if (!strcmp(host, ".")) { mysql_options(m_DB, MYSQL_OPT_NAMED_PIPE, NULL); pipe = mysqld_unix_port; } // endif host -#else // !WIN32 +#else // !__WIN__ if (!strcmp(host, "localhost")) pipe = mysqld_unix_port; -#endif // !WIN32 +#endif // !__WIN__ #if 0 if (pwd && !strcmp(pwd, "*")) { diff --git a/storage/connect/myconn.h b/storage/connect/myconn.h index 79b8a43fe5a..fa34edd804c 100644 --- a/storage/connect/myconn.h +++ b/storage/connect/myconn.h @@ -7,24 +7,24 @@ /* DO NOT define DLL_EXPORT in your application so these items are */ /* declared are imported from the Myconn DLL. */ /***********************************************************************/ -#if defined(WIN32) +#if defined(__WIN__) #include -#else // !WIN32 +#else // !__WIN__ #include -#endif // !WIN32 +#endif // !__WIN__ #include #include #include "myutil.h" -#if defined(WIN32) && defined(MYCONN_EXPORTS) +#if defined(__WIN__) && defined(MYCONN_EXPORTS) #if defined(DLL_EXPORT) #define DllItem _declspec(dllexport) #else // !DLL_EXPORT #define DllItem _declspec(dllimport) #endif // !DLL_EXPORT -#else // !WIN32 || !MYCONN_EXPORTS +#else // !__WIN__ || !MYCONN_EXPORTS #define DllItem -#endif // !WIN32 +#endif // !__WIN__ #define MYSQL_ENABLED 0x00000001 #define MYSQL_LOGON 0x00000002 diff --git a/storage/connect/mysql-test/connect/r/bin.result b/storage/connect/mysql-test/connect/r/bin.result index 69453d97534..4ba353ac705 100644 --- a/storage/connect/mysql-test/connect/r/bin.result +++ b/storage/connect/mysql-test/connect/r/bin.result @@ -15,11 +15,11 @@ CREATE TABLE t1 ( fig INT(4) NOT NULL FIELD_FORMAT='C', name CHAR(10) NOT NULL, -birth DATE NOT NULL FIELD_FORMAT='L', -id CHAR(5) NOT NULL FIELD_FORMAT='L2', +birth DATE NOT NULL, +id CHAR(5) NOT NULL FIELD_FORMAT='S', salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', -dept INT(4) NOT NULL FIELD_FORMAT='L2' -) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat'; +dept INT(4) NOT NULL FIELD_FORMAT='S' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat' OPTION_LIST='Endian=Little'; SELECT * FROM t1; fig name birth id salary dept 5500 ARCHIBALD 1980-01-25 3789 4380.50 318 @@ -42,11 +42,11 @@ CREATE TABLE t1 ( fig INT(4) NOT NULL FIELD_FORMAT='C', name CHAR(10) NOT NULL, -birth DATE NOT NULL FIELD_FORMAT='L', -id CHAR(5) NOT NULL FIELD_FORMAT='L2', +birth DATE NOT NULL, +id CHAR(5) NOT NULL FIELD_FORMAT='S', salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', -dept INT(4) NOT NULL FIELD_FORMAT='L2' -) ENGINE=CONNECT TABLE_TYPE=BIN READONLY=Yes FILE_NAME='Testbal.dat'; +dept INT(4) NOT NULL FIELD_FORMAT='S' +) ENGINE=CONNECT TABLE_TYPE=BIN READONLY=Yes FILE_NAME='Testbal.dat' OPTION_LIST='Endian=Little'; INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); ERROR HY000: Table 't1' is read only ALTER TABLE t1 READONLY=NO; @@ -55,11 +55,11 @@ Table Create Table t1 CREATE TABLE `t1` ( `fig` int(4) NOT NULL `FIELD_FORMAT`='C', `name` char(10) NOT NULL, - `birth` date NOT NULL `FIELD_FORMAT`='L', - `id` char(5) NOT NULL `FIELD_FORMAT`='L2', + `birth` date NOT NULL, + `id` char(5) NOT NULL `FIELD_FORMAT`='S', `salary` double(9,2) NOT NULL DEFAULT '0.00' `FIELD_FORMAT`='F', - `dept` int(4) NOT NULL `FIELD_FORMAT`='L2' -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=BIN `FILE_NAME`='Testbal.dat' `READONLY`=NO + `dept` int(4) NOT NULL `FIELD_FORMAT`='S' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=BIN `FILE_NAME`='Testbal.dat' `OPTION_LIST`='Endian=Little' `READONLY`=NO INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); SELECT * FROM t1; fig name birth id salary dept @@ -74,11 +74,11 @@ Table Create Table t1 CREATE TABLE `t1` ( `fig` int(4) NOT NULL `FIELD_FORMAT`='C', `name` char(10) NOT NULL, - `birth` date NOT NULL `FIELD_FORMAT`='L', - `id` char(5) NOT NULL `FIELD_FORMAT`='L2', + `birth` date NOT NULL, + `id` char(5) NOT NULL `FIELD_FORMAT`='S', `salary` double(9,2) NOT NULL DEFAULT '0.00' `FIELD_FORMAT`='F', - `dept` int(4) NOT NULL `FIELD_FORMAT`='L2' -) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=BIN `FILE_NAME`='Testbal.dat' `READONLY`=YES + `dept` int(4) NOT NULL `FIELD_FORMAT`='S' +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`=BIN `FILE_NAME`='Testbal.dat' `OPTION_LIST`='Endian=Little' `READONLY`=YES INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); ERROR HY000: Table 't1' is read only DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/bin.test b/storage/connect/mysql-test/connect/t/bin.test index e9d1ad58c37..1e45bcaf93a 100644 --- a/storage/connect/mysql-test/connect/t/bin.test +++ b/storage/connect/mysql-test/connect/t/bin.test @@ -20,11 +20,11 @@ CREATE TABLE t1 ( fig INT(4) NOT NULL FIELD_FORMAT='C', name CHAR(10) NOT NULL, - birth DATE NOT NULL FIELD_FORMAT='L', - id CHAR(5) NOT NULL FIELD_FORMAT='L2', + birth DATE NOT NULL, + id CHAR(5) NOT NULL FIELD_FORMAT='S', salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', - dept INT(4) NOT NULL FIELD_FORMAT='L2' -) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat'; + dept INT(4) NOT NULL FIELD_FORMAT='S' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat' OPTION_LIST='Endian=Little'; SELECT * FROM t1; --error ER_GET_ERRMSG @@ -41,11 +41,11 @@ CREATE TABLE t1 ( fig INT(4) NOT NULL FIELD_FORMAT='C', name CHAR(10) NOT NULL, - birth DATE NOT NULL FIELD_FORMAT='L', - id CHAR(5) NOT NULL FIELD_FORMAT='L2', + birth DATE NOT NULL, + id CHAR(5) NOT NULL FIELD_FORMAT='S', salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', - dept INT(4) NOT NULL FIELD_FORMAT='L2' -) ENGINE=CONNECT TABLE_TYPE=BIN READONLY=Yes FILE_NAME='Testbal.dat'; + dept INT(4) NOT NULL FIELD_FORMAT='S' +) ENGINE=CONNECT TABLE_TYPE=BIN READONLY=Yes FILE_NAME='Testbal.dat' OPTION_LIST='Endian=Little'; --error ER_OPEN_AS_READONLY INSERT INTO t1 VALUES (7777,'BILL','1973-06-30',4444,5555.555,777); ALTER TABLE t1 READONLY=NO; diff --git a/storage/connect/myutil.cpp b/storage/connect/myutil.cpp index fe504bbe422..d4416e188c8 100644 --- a/storage/connect/myutil.cpp +++ b/storage/connect/myutil.cpp @@ -13,11 +13,11 @@ /************************************************************************/ #include "my_global.h" #include -#if defined(WIN32) +#if defined(__WIN__) //#include -#else // !WIN32 +#else // !__WIN__ #include "osutil.h" -#endif // !WIN32 +#endif // !__WIN__ #include "global.h" #include "plgdbsem.h" diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index 2f2f5f38c29..6aaa048de81 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -11,7 +11,7 @@ /***********************************************************************/ #include #include -#if defined(WIN32) +#if defined(__WIN__) //nclude //nclude #include // for getcwd @@ -45,13 +45,13 @@ #include "osutil.h" -#if defined(WIN32) +#if defined(__WIN__) /***********************************************************************/ /* For dynamic load of ODBC32.DLL */ /***********************************************************************/ #pragma comment(lib, "odbc32.lib") extern "C" HINSTANCE s_hModule; // Saved module handle -#endif // WIN32 +#endif // __WIN__ int GetConvSize(); @@ -116,16 +116,24 @@ static int GetSQLCType(int type) /***********************************************************************/ /* TranslateSQLType: translate a SQL Type to a PLG type. */ /***********************************************************************/ -int TranslateSQLType(int stp, int prec, int& len, char& v) +int TranslateSQLType(int stp, int prec, int& len, char& v, bool& w) { int type; switch (stp) { + case SQL_WVARCHAR: // (-9) + w = true; case SQL_VARCHAR: // 12 v = 'V'; + type = TYPE_STRING; + break; + case SQL_WCHAR: // (-8) + w = true; case SQL_CHAR: // 1 type = TYPE_STRING; break; + case SQL_WLONGVARCHAR: // (-10) + w = true; case SQL_LONGVARCHAR: // (-1) v = 'V'; type = TYPE_STRING; @@ -180,7 +188,6 @@ int TranslateSQLType(int stp, int prec, int& len, char& v) case SQL_BINARY: // (-2) case SQL_VARBINARY: // (-3) case SQL_LONGVARBINARY: // (-4) -// case SQL_BIT: // (-7) case SQL_GUID: // (-11) default: type = TYPE_ERROR; @@ -410,6 +417,7 @@ PQRYRES ODBCSrcCols(PGLOBAL g, char *dsn, char *src, POPARM sop) PQRYRES MyODBCCols(PGLOBAL g, char *dsn, char *tab, bool info) { // int i, type, len, prec; + bool w = false; // PCOLRES crp, crpt, crpl, crpp; PQRYRES qrp; ODBConn *ocp; @@ -455,7 +463,7 @@ PQRYRES MyODBCCols(PGLOBAL g, char *dsn, char *tab, bool info) type = crpt->Kdata->GetIntValue(i); len = crpl->Kdata->GetIntValue(i); prec = crpp->Kdata->GetIntValue(i); - type = TranslateSQLType(type, prec, len); + type = TranslateSQLType(type, prec, len, w); crpt->Kdata->SetValue(type, i); // Some data sources do not count prec in length @@ -1201,15 +1209,15 @@ bool ODBConn::DriverConnect(DWORD Options) SWORD nResult; PUCHAR ConnOut = (PUCHAR)PlugSubAlloc(m_G, NULL, MAX_CONNECT_LEN); UWORD wConnectOption = SQL_DRIVER_COMPLETE; -#if defined(WIN32) +#if defined(__WIN__) HWND hWndTop = GetForegroundWindow(); HWND hWnd = GetParent(hWndTop); if (hWnd == NULL) hWnd = GetDesktopWindow(); -#else // !WIN32 +#else // !__WIN__ HWND hWnd = (HWND)1; -#endif // !WIN32 +#endif // !__WIN__ PGLOBAL& g = m_G; PDBUSER dup = PlgGetUser(g); @@ -1222,10 +1230,10 @@ bool ODBConn::DriverConnect(DWORD Options) SQL_NTS, ConnOut, MAX_CONNECT_LEN, &nResult, wConnectOption); -#if defined(WIN32) +#if defined(__WIN__) if (hWndTop) EnableWindow(hWndTop, true); -#endif // WIN32 +#endif // __WIN__ // If user hit 'Cancel' if (rc == SQL_NO_DATA_FOUND) { diff --git a/storage/connect/odbconn.h b/storage/connect/odbconn.h index 41cc2439354..6a24334f08c 100644 --- a/storage/connect/odbconn.h +++ b/storage/connect/odbconn.h @@ -29,9 +29,9 @@ //efine MAX_CURSOR_NAME 18 // Max size of a cursor name #define DEFAULT_FIELD_TYPE SQL_TYPE_NULL // pick "C" data type to match SQL data type -#if !defined(WIN32) +#if !defined(__WIN__) typedef unsigned char *PUCHAR; -#endif // !WIN32 +#endif // !__WIN__ // Field Flags, used to indicate status of fields //efine SQL_FIELD_FLAG_DIRTY 0x1 diff --git a/storage/connect/os.h b/storage/connect/os.h index 8f77a0ad39f..2dc603fdcda 100644 --- a/storage/connect/os.h +++ b/storage/connect/os.h @@ -15,16 +15,16 @@ typedef off_t off64_t; #endif #endif -#if defined(WIN32) +#if defined(__WIN__) typedef __int64 BIGINT; -#else // !WIN32 +#else // !__WIN__ typedef longlong BIGINT; #define FILE_BEGIN SEEK_SET #define FILE_CURRENT SEEK_CUR #define FILE_END SEEK_END -#endif // !WIN32 +#endif // !__WIN__ -#if !defined(WIN32) +#if !defined(__WIN__) typedef const void *LPCVOID; typedef const char *LPCTSTR; typedef const char *LPCSTR; @@ -61,6 +61,6 @@ typedef int HANDLE; #define _MAX_EXT FN_EXTLEN #define INVALID_HANDLE_VALUE (-1) #define __stdcall -#endif /* !WIN32 */ +#endif /* !__WIN__ */ #endif /* _OS_H_INCLUDED */ diff --git a/storage/connect/osutil.c b/storage/connect/osutil.c index 66985847ce7..2e9e120b0c8 100644 --- a/storage/connect/osutil.c +++ b/storage/connect/osutil.c @@ -4,7 +4,7 @@ #include #include "osutil.h" -#ifdef WIN32 +#ifdef __WIN__ my_bool CloseFileHandle(HANDLE h) { return !CloseHandle(h); diff --git a/storage/connect/plgdbsem.h b/storage/connect/plgdbsem.h index 4dc8f293070..b57d9e20ceb 100644 --- a/storage/connect/plgdbsem.h +++ b/storage/connect/plgdbsem.h @@ -389,6 +389,7 @@ typedef struct _qryres *PQRYRES; typedef struct _colres *PCOLRES; typedef struct _datpar *PDTP; typedef struct indx_used *PXUSED; +typedef struct ha_table_option_struct TOS, *PTOS; /***********************************************************************/ /* Utility blocks for file and storage. */ @@ -543,11 +544,11 @@ typedef struct _colres { char Var; /* Type added information */ } COLRES; -#if defined(WIN32) && !defined(NOEX) +#if defined(__WIN__) && !defined(NOEX) #define DllExport __declspec( dllexport ) -#else // !WIN32 +#else // !__WIN__ #define DllExport -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Utility routines. */ @@ -593,6 +594,9 @@ DllExport void NewPointer(PTABS, void *, void *); DllExport void SetTrc(void); DllExport char *GetListOption(PGLOBAL, const char *, const char *, const char *def=NULL); +DllExport char *GetStringTableOption(PGLOBAL, PTOS, char *, char *); +DllExport bool GetBooleanTableOption(PGLOBAL, PTOS, char *, bool); +DllExport int GetIntegerTableOption(PGLOBAL, PTOS, char *, int); #define MSGID_NONE 0 #define MSGID_CANNOT_OPEN 1 diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index a2b1baf1249..9e236da2d93 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -38,12 +38,12 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #include #define BIGMEM 1048576 // 1 Megabyte -#else // !WIN32 +#else // !__WIN__ #include #include #if defined(THREAD) @@ -51,7 +51,7 @@ #endif // THREAD #include #define BIGMEM 2147483647 // Max int value -#endif // !WIN32 +#endif // !__WIN__ #include /***********************************************************************/ @@ -73,11 +73,11 @@ /* Macro or external routine definition */ /***********************************************************************/ #if defined(THREAD) -#if defined(WIN32) +#if defined(__WIN__) extern CRITICAL_SECTION parsec; // Used calling the Flex parser -#else // !WIN32 +#else // !__WIN__ extern pthread_mutex_t parmut; -#endif // !WIN32 +#endif // !__WIN__ #endif // THREAD /***********************************************************************/ @@ -403,11 +403,11 @@ char *SetPath(PGLOBAL g, const char *path) } // endif path if (*path != '.') { -#if defined(WIN32) +#if defined(__WIN__) char *s= "\\"; -#else // !WIN32 +#else // !__WIN__ char *s= "/"; -#endif // !WIN32 +#endif // !__WIN__ strcat(strcat(strcat(strcpy(buf, "."), s), path), s); } else strcpy(buf, path); @@ -426,7 +426,7 @@ char *ExtractFromPath(PGLOBAL g, char *pBuff, char *FileName, OPVAL op) char *drive = NULL, *direc = NULL, *fname = NULL, *ftype = NULL; switch (op) { // Determine which part to extract -#if !defined(UNIX) +#if defined(__WIN__) case OP_FDISK: drive = pBuff; break; #endif // !UNIX case OP_FPATH: direc = pBuff; break; @@ -702,19 +702,19 @@ PDTP MakeDateFormat(PGLOBAL g, PSZ dfmt, bool in, bool out, int flag) /* instruction is included in an Enter/LeaveCriticalSection bracket. */ /*********************************************************************/ #if defined(THREAD) -#if defined(WIN32) +#if defined(__WIN__) EnterCriticalSection((LPCRITICAL_SECTION)&parsec); -#else // !WIN32 +#else // !__WIN__ pthread_mutex_lock(&parmut); -#endif // !WIN32 +#endif // !__WIN__ #endif // THREAD /*int rc =*/ fmdflex(pdp); #if defined(THREAD) -#if defined(WIN32) +#if defined(__WIN__) LeaveCriticalSection((LPCRITICAL_SECTION)&parsec); -#else // !WIN32 +#else // !__WIN__ pthread_mutex_unlock(&parmut); -#endif // !WIN32 +#endif // !__WIN__ #endif // THREAD if (trace) @@ -1109,7 +1109,7 @@ char *GetAmName(PGLOBAL g, AMT am, void *memp) return amn; } // end of GetAmName -#if defined(WIN32) && !defined(NOCATCH) +#if defined(__WIN__) && !defined(NOCATCH) /***********************************************************************/ /* GetExceptionDesc: return the description of an exception code. */ /***********************************************************************/ @@ -1197,7 +1197,7 @@ char *GetExceptionDesc(PGLOBAL g, unsigned int e) return p; } // end of GetExceptionDesc -#endif // WIN32 && !NOCATCH +#endif // __WIN__ && !NOCATCH /***********************************************************************/ /* PlgDBalloc: allocates or suballocates memory conditionally. */ @@ -1239,7 +1239,7 @@ void *PlgDBalloc(PGLOBAL g, void *area, MBLOCK& mp) if (!mp.Sub) { // For allocations greater than one fourth of remaining storage // in the area, do allocate from virtual storage. -#if defined(WIN32) +#if defined(__WIN__) if (mp.Size >= BIGMEM) mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT, PAGE_READWRITE); else @@ -1336,7 +1336,7 @@ void PlgDBfree(MBLOCK& mp) htrc("PlgDBfree: %p sub=%d size=%d\n", mp.Memp, mp.Sub, mp.Size); if (!mp.Sub && mp.Memp) -#if defined(WIN32) +#if defined(__WIN__) if (mp.Size >= BIGMEM) VirtualFree(mp.Memp, 0, MEM_RELEASE); else @@ -1532,11 +1532,11 @@ int FileComp(PGLOBAL g, char *file1, char *file2) bp[0] = buff1; bp[1] = buff2; for (i = 0; i < 2; i++) { -#if defined(WIN32) +#if defined(__WIN__) h[i]= global_open(g, MSGID_NONE, fn[i], _O_RDONLY | _O_BINARY); -#else // !WIN32 +#else // !__WIN__ h[i]= global_open(g, MSGOD_NONE, fn[i], O_RDONLY); -#endif // !WIN32 +#endif // !__WIN__ if (h[i] == -1) { // if (errno != ENOENT) { diff --git a/storage/connect/plugutil.c b/storage/connect/plugutil.c index 36d115e0096..c0e249adf12 100644 --- a/storage/connect/plugutil.c +++ b/storage/connect/plugutil.c @@ -44,7 +44,7 @@ /* */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) //#include #else #if defined(UNIX) || defined(UNIV_LINUX) @@ -80,9 +80,9 @@ #include "rcmsg.h" #endif // NEWMSG -#if defined(WIN32) +#if defined(__WIN__) extern HINSTANCE s_hModule; /* Saved module handle */ -#endif // WIN32 +#endif // __WIN__ #if defined(XMSG) extern char *msg_path; @@ -192,7 +192,7 @@ int PlugExit(PGLOBAL g) /***********************************************************************/ LPSTR PlugRemoveType(LPSTR pBuff, LPCSTR FileName) { -#if !defined(UNIX) && !defined(UNIV_LINUX) +#if defined(__WIN__) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -220,7 +220,7 @@ LPSTR PlugRemoveType(LPSTR pBuff, LPCSTR FileName) BOOL PlugIsAbsolutePath(LPCSTR path) { -#if defined(WIN32) +#if defined(__WIN__) return ((path[0] >= 'a' && path[0] <= 'z') || (path[0] >= 'A' && path[0] <= 'Z')) && path[1] == ':'; #else @@ -238,7 +238,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) char direc[_MAX_DIR], defdir[_MAX_DIR], tmpdir[_MAX_DIR]; char fname[_MAX_FNAME]; char ftype[_MAX_EXT]; -#if !defined(UNIX) && !defined(UNIV_LINUX) +#if defined(__WIN__) char drive[_MAX_DRIVE], defdrv[_MAX_DRIVE]; #else char *drive = NULL, *defdrv = NULL; @@ -255,7 +255,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) return pBuff; } // endif -#if !defined(WIN32) +#if !defined(__WIN__) if (*FileName == '~') { if (_fullpath(pBuff, FileName, _MAX_PATH)) { if (trace > 1) @@ -266,7 +266,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) return FileName; // Error, return unchanged name } // endif FileName -#endif // !WIN32 +#endif // !__WIN__ if (prefix && strcmp(prefix, ".") && !PlugIsAbsolutePath(defpath)) { @@ -295,11 +295,11 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) if (trace > 1) { htrc("after _splitpath: FileName=%s\n", FileName); -#if defined(UNIX) || defined(UNIV_LINUX) - htrc("dir=%s fname=%s ext=%s\n", direc, fname, ftype); -#else +#if defined(__WIN__) htrc("drive=%s dir=%s fname=%s ext=%s\n", drive, direc, fname, ftype); htrc("defdrv=%s defdir=%s\n", defdrv, defdir); +#else + htrc("dir=%s fname=%s ext=%s\n", direc, fname, ftype); #endif } // endif trace @@ -427,7 +427,7 @@ char *PlugGetMessage(PGLOBAL g, int mid) } // end of PlugGetMessage #endif // NEWMSG -#if defined(WIN32) +#if defined(__WIN__) /***********************************************************************/ /* Return the line length of the console screen buffer. */ /***********************************************************************/ @@ -439,7 +439,7 @@ short GetLineLength(PGLOBAL g) return (b) ? coninfo.dwSize.X : 0; } // end of GetLineLength -#endif // WIN32 +#endif // __WIN__ /***********************************************************************/ /* Program for memory allocation of work and language areas. */ @@ -502,7 +502,7 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size) size = ((size + 7) / 8) * 8; /* Round up size to multiple of 8 */ pph = (PPOOLHEADER)memp; - if (trace > 2) + if (trace > 3) htrc("SubAlloc in %p size=%d used=%d free=%d\n", memp, size, pph->To_Free, pph->FreeBlk); @@ -526,7 +526,7 @@ void *PlugSubAlloc(PGLOBAL g, void *memp, size_t size) pph->To_Free += size; /* New offset of pool free block */ pph->FreeBlk -= size; /* New size of pool free block */ - if (trace > 2) + if (trace > 3) htrc("Done memp=%p used=%d free=%d\n", memp, pph->To_Free, pph->FreeBlk); diff --git a/storage/connect/rcmsg.c b/storage/connect/rcmsg.c index eafcbdcd81b..75759e03314 100644 --- a/storage/connect/rcmsg.c +++ b/storage/connect/rcmsg.c @@ -21,9 +21,9 @@ #include "msgid.h" #endif // NEWMSG -#if !defined(WIN32) +#if !defined(__WIN__) #define stricmp strcasecmp -#endif // !WIN32 +#endif // !__WIN__ char *msglang(void); diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 4563500254b..60d515a61ca 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -17,7 +17,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #else #include // dlopen(), dlclose(), dlsym() ... @@ -48,9 +48,9 @@ #include "tabmul.h" #include "ha_connect.h" -#if !defined(WIN32) +#if !defined(__WIN__) extern handlerton *connect_hton; -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* External function. */ @@ -247,7 +247,7 @@ bool TABDEF::Define(PGLOBAL g, PCATLG cat, LPCSTR name, LPCSTR am) /***********************************************************************/ PSZ TABDEF::GetPath(void) { - return (Database) ? (PSZ)Database : Hc->GetDataPath(); + return (Database) ? (PSZ)Database : (Hc) ? Hc->GetDataPath() : NULL; } // end of GetPath /***********************************************************************/ @@ -256,7 +256,8 @@ PSZ TABDEF::GetPath(void) int TABDEF::GetColCatInfo(PGLOBAL g) { char *type= GetStringCatInfo(g, "Type", "*"); - int i, loff, poff, nof, nlg; + char c, fty, eds; + int i, n, loff, poff, nof, nlg; void *field= NULL; TABTYPE tc; PCOLDEF cdp, lcdp= NULL, tocols= NULL; @@ -331,28 +332,52 @@ int TABDEF::GetColCatInfo(PGLOBAL g) cdp->SetOffset(0); // Not to have shift case TAB_BIN: // BIN/VEC are packed by default - if (nof) + if (nof) { // Field width is the internal representation width // that can also depend on the column format - switch (cdp->Fmt ? *cdp->Fmt : cdp->Decode ? 'C' : 'X') { - case 'X': nof= cdp->Clen; - case 'C': break; - case 'R': - case 'F': -// case 'L': - case 'I': nof= 4; break; - case 'D': nof= 8; break; - case 'S': nof= 2; break; - case 'T': nof= 1; break; - default: /* New format */ - for (nof= 0, i= 0; cdp->Fmt[i]; i++) - if (isdigit(cdp->Fmt[i])) - nof= (nof * 10 + (cdp->Fmt[i] - '0')); + fty = cdp->Decode ? 'C' : 'X'; + eds = 0; + n = 0; - if (!nof) + if (cdp->Fmt && !cdp->Decode) { + for (i = 0; cdp->Fmt[i]; i++) { + c = toupper(cdp->Fmt[i]); + + if (isdigit(c)) + n = (n * 10 + (c - '0')); + else if (c == 'L' || c == 'B' || c == 'H') + eds = c; + else + fty = c; + + } // endfor i + + } // endif Fmt + + if (n) + nof = n; + else switch (fty) { + case 'X': + if (eds && IsTypeChar(cdp->Buf_Type)) + nof = sizeof(longlong); + else nof= cdp->Clen; - } // endswitch Fmt + break; + case 'C': break; + case 'R': + case 'F': nof = sizeof(float); break; + case 'I': nof = sizeof(int); break; + case 'D': nof = sizeof(double); break; + case 'S': nof = sizeof(short); break; + case 'T': nof = sizeof(char); break; + case 'G': nof = sizeof(longlong); break; + default: /* Wrong format */ + sprintf(g->Message, "Invalid format %c", fty); + return -1; + } // endswitch fty + + } // endif nof default: break; @@ -454,7 +479,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) } else PlugSetPath(soname, Module, GetPluginDir()); -#if defined(WIN32) +#if defined(__WIN__) // Is the DLL already loaded? if (!Hdll && !(Hdll = GetModuleHandle(soname))) // No, load the Dll implementing the function @@ -483,7 +508,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) FreeLibrary((HMODULE)Hdll); return NULL; } // endif getdef -#else // !WIN32 +#else // !__WIN__ const char *error = NULL; Dl_info dl_info; @@ -526,7 +551,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) dlclose(Hdll); return NULL; } // endif getdef -#endif // !WIN32 +#endif // !__WIN__ // Just in case the external Get function does not set error messages sprintf(g->Message, MSG(DEF_ALLOC_ERROR), Subtype); diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h index ec70f18e151..4aa29037dfc 100644 --- a/storage/connect/reldef.h +++ b/storage/connect/reldef.h @@ -139,11 +139,11 @@ class DllExport OEMDEF : public TABDEF { /* OEM table */ PTABDEF GetXdef(PGLOBAL g); // Members -#if defined(WIN32) +#if defined(__WIN__) HANDLE Hdll; /* Handle to the external DLL */ -#else // !WIN32 +#else // !__WIN__ void *Hdll; /* Handle for the loaded shared library */ -#endif // !WIN32 +#endif // !__WIN__ PTABDEF Pxdef; /* Pointer to the external TABDEF class */ char *Module; /* Path/Name of the DLL implenting it */ char *Subtype; /* The name of the OEM table sub type */ diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index 37bd94cf1bb..a1e58ab3344 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -17,7 +17,7 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include // For testing only #include @@ -26,7 +26,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #include @@ -34,7 +34,7 @@ #include #endif // !UNIX #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ @@ -112,6 +112,7 @@ DOSDEF::DOSDEF(void) Maxerr = 0; ReadMode = 0; Ending = 0; + Teds = 0; } // end of DOSDEF constructor /***********************************************************************/ @@ -146,6 +147,7 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int) Padded = GetBoolCatInfo("Padded", false); Blksize = GetIntCatInfo("Blksize", 0); Eof = (GetIntCatInfo("EOF", 0) != 0); + Teds = toupper(*GetStringCatInfo(g, "Endian", "")); } else if (Recfm == RECFM_DBF) { Maxerr = GetIntCatInfo("Maxerr", 0); Accept = GetBoolCatInfo("Accept", false); @@ -206,11 +208,11 @@ void DOSDEF::RemoveOptValues(PGLOBAL g) // Delete any eventually ill formed non matching optimization file if (!GetOptFileName(g, filename)) -#if defined(WIN32) +#if defined(__WIN__) DeleteFile(filename); #else // UNIX remove(filename); -#endif // WIN32 +#endif // __WIN__ Optimized = 0; } // end of RemoveOptValues @@ -251,7 +253,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) /*********************************************************************/ if (sep) { // Indexes are save in separate files -#if !defined(UNIX) +#if defined(__WIN__) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -268,7 +270,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) strcat(strcat(fname, "_"), pxdf->GetName()); _makepath(filename, drive, direc, fname, ftype); PlugSetPath(filename, filename, GetPath()); -#if defined(WIN32) +#if defined(__WIN__) if (!DeleteFile(filename)) rc |= (GetLastError() != ERROR_FILE_NOT_FOUND); #else // UNIX @@ -285,7 +287,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf) // Drop all indexes, delete the common file PlugSetPath(filename, Ofn, GetPath()); strcat(PlugRemoveType(filename, filename), ftype); -#if defined(WIN32) +#if defined(__WIN__) if (!DeleteFile(filename)) rc = (GetLastError() != ERROR_FILE_NOT_FOUND); #else // UNIX @@ -954,7 +956,7 @@ bool TDBDOS::GetBlockValues(PGLOBAL g) #if 0 if (Mode == MODE_INSERT && Txfp->GetAmType() == TYPE_AM_DOS) return false; -#endif // WIN32 +#endif // __WIN__ if (defp->Optimized) return false; // Already done or to be redone diff --git a/storage/connect/tabdos.h b/storage/connect/tabdos.h index 9115b1fae86..c098886f14b 100644 --- a/storage/connect/tabdos.h +++ b/storage/connect/tabdos.h @@ -91,6 +91,7 @@ class DllExport DOSDEF : public TABDEF { /* Logical table description */ int Maxerr; /* Maximum number of bad records (DBF) */ int ReadMode; /* Specific to DBF */ int Ending; /* Length of end of lines */ + int Teds; /* Binary table default endian setting */ }; // end of DOSDEF /***********************************************************************/ diff --git a/storage/connect/tabfix.cpp b/storage/connect/tabfix.cpp index af92ec0410a..acd548c86ab 100644 --- a/storage/connect/tabfix.cpp +++ b/storage/connect/tabfix.cpp @@ -17,7 +17,7 @@ /* Include relevant section of system dependant header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #include @@ -25,7 +25,7 @@ #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #include @@ -35,7 +35,7 @@ #include #endif // !UNIX #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ @@ -68,10 +68,12 @@ USETEMP UseTemp(void); /***********************************************************************/ TDBFIX::TDBFIX(PDOSDEF tdp, PTXF txfp) : TDBDOS(tdp, txfp) { + Teds = tdp->Teds; // For BIN tables } // end of TDBFIX standard constructor TDBFIX::TDBFIX(PGLOBAL g, PTDBFIX tdbp) : TDBDOS(g, tdbp) { + Teds = tdbp->Teds; } // end of TDBFIX copy constructor // Method @@ -374,42 +376,63 @@ int TDBFIX::WriteDB(PGLOBAL g) BINCOL::BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am) : DOSCOL(g, cdp, tp, cp, i, am) { - char *fmt = cdp->GetFmt(); + char c, *fmt = cdp->GetFmt(); + Fmt = GetDomain() ? 'C' : 'X'; Buff = NULL; + Eds = ((PTDBFIX)tp)->Teds; + N = 0; M = GetTypeSize(Buf_Type, sizeof(longlong)); Lim = 0; if (fmt) { - Fmt = 'H'; + for (N = 0, i = 0; fmt[i]; i++) { + c = toupper(fmt[i]); - for (N = 0, i = 0; fmt[i]; i++) - if (isdigit(fmt[i])) - N = (N * 10 + (fmt[i] - '0')); + if (isdigit(c)) + N = (N * 10 + (c - '0')); + else if (c == 'L' || c == 'B' || c == 'H') + Eds = c; else - Fmt = toupper(fmt[i]); + Fmt = c; - if (N == GetTypeSize(Buf_Type, -1) && (Fmt == 'H' || Fmt == Endian)) { - // New format is a no op - N = 0; - Fmt = 'X'; - } else if (Fmt == 'L' || Fmt == 'B' || Fmt == 'H') { - // This is a new format - if (!N) - N = GetTypeSize(Buf_Type, Long); + } // endfor i - if (Fmt == 'H') - Fmt = Endian; + // M is the size of the source value + switch (Fmt) { + case 'C': Eds = 0; break; + case 'X': break; + case 'S': M = sizeof(short); break; + case 'T': M = sizeof(char); break; + case 'I': M = sizeof(int); break; + case 'G': M = sizeof(longlong); break; + case 'R': // Real + case 'F': M = sizeof(float); break; + case 'D': M = sizeof(double); break; + default: + sprintf(g->Message, MSG(BAD_BIN_FMT), Fmt, Name); + longjmp(g->jumper[g->jump_level], 11); + } // endswitch Fmt + } else if (IsTypeChar(Buf_Type)) + Eds = 0; + + if (Eds) { + // This is a byte order specification + if (!N) + N = M; + + if (Eds != 'L' && Eds != 'B') + Eds = Endian; + + if (N != M || Eds != Endian || IsTypeChar(Buf_Type)) { Buff = (char*)PlugSubAlloc(g, NULL, M); memset(Buff, 0, M); Lim = MY_MIN(N, M); - } // endif Fmt + } else + Eds = 0; // New format is a no op - } else { - N = 0; - Fmt = GetDomain() ? 'C' : 'X'; - } // endif fmt + } // endif Eds } // end of BINCOL constructor @@ -419,6 +442,7 @@ BINCOL::BINCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am) /***********************************************************************/ BINCOL::BINCOL(BINCOL *col1, PTDB tdbp) : DOSCOL(col1, tdbp) { + Eds = col1->Eds; Fmt = col1->Fmt; N = col1->N; M = col1->M; @@ -470,25 +494,27 @@ void BINCOL::ReadColumn(PGLOBAL g) /*********************************************************************/ /* Set Value from the line field. */ /*********************************************************************/ - if (N) { + if (Eds) { for (int i = 0; i < Lim; i++) - if (Fmt == 'B' && Endian == 'L') + if (Eds == 'B' && Endian == 'L') Buff[i] = p[N - i - 1]; - else if (Fmt == 'L' && Endian == 'B') + else if (Eds == 'L' && Endian == 'B') Buff[M - i - 1] = p[i]; else if (Endian == 'B') Buff[M - i - 1] = p[N - i - 1]; else Buff[i] = p[i]; - if (IsTypeChar(Buf_Type)) - Value->SetValue(*(longlong*)Buff); - else - Value->SetBinValue(Buff); + p = Buff; + } // endif Eds - } else switch (Fmt) { + switch (Fmt) { case 'X': // Standard not converted values - Value->SetBinValue(p); + if (Eds && IsTypeChar(Buf_Type)) + Value->SetValue(*(longlong*)p); + else + Value->SetBinValue(p); + break; case 'S': // Short integer Value->SetValue(*(short*)p); @@ -496,12 +522,12 @@ void BINCOL::ReadColumn(PGLOBAL g) case 'T': // Tiny integer Value->SetValue(*p); break; -// case 'L': // Long Integer -// strcpy(g->Message, "Format L is deprecated, use I"); -// longjmp(g->jumper[g->jump_level], 11); case 'I': // Integer Value->SetValue(*(int*)p); break; + case 'G': // Large (great) integer + Value->SetValue(*(longlong*)p); + break; case 'F': // Float case 'R': // Real Value->SetValue((double)*(float*)p); @@ -553,41 +579,23 @@ void BINCOL::WriteColumn(PGLOBAL g) if (Value != To_Val) Value->SetValue_pval(To_Val, false); // Convert the updated value - p = tdbp->To_Line + Deplac; + p = (Eds) ? Buff : tdbp->To_Line + Deplac; /*********************************************************************/ /* Check whether updating is Ok, meaning col value is not too long. */ /* Updating will be done only during the second pass (Status=true) */ /* Conversion occurs if the external format Fmt is specified. */ /*********************************************************************/ - if (N) { - if (IsTypeChar(Buf_Type)) - *(longlong *)Buff = Value->GetBigintValue(); - else if (Value->GetBinValue(Buff, M, Status)) { - sprintf(g->Message, MSG(BIN_F_TOO_LONG), - Name, Value->GetSize(), M); - longjmp(g->jumper[g->jump_level], 31); - } // endif Buff - - if (Status) - for (int i = 0; i < Lim; i++) - if (Fmt == 'B' && Endian == 'L') - p[N - i - 1] = Buff[i]; - else if (Fmt == 'L' && Endian == 'B') - p[i] = Buff[M - i - 1]; - else if (Endian == 'B') - p[N - i - 1] = Buff[M - i - 1]; - else - p[i] = Buff[i]; - - } else switch (Fmt) { + switch (Fmt) { case 'X': // Standard not converted values - if (Value->GetBinValue(p, Long, Status)) { + if (Eds && IsTypeChar(Buf_Type)) + *(longlong *)p = Value->GetBigintValue(); + else if (Value->GetBinValue(p, Long, Status)) { sprintf(g->Message, MSG(BIN_F_TOO_LONG), Name, Value->GetSize(), Long); longjmp(g->jumper[g->jump_level], 31); - } // endif p + } // endif p break; case 'S': // Short integer @@ -610,9 +618,6 @@ void BINCOL::WriteColumn(PGLOBAL g) *p = (char)n; break; - case 'L': // Long Integer - strcpy(g->Message, "Format L is deprecated, use I"); - longjmp(g->jumper[g->jump_level], 11); case 'I': // Integer n = Value->GetBigintValue(); @@ -623,7 +628,7 @@ void BINCOL::WriteColumn(PGLOBAL g) *(int *)p = Value->GetIntValue(); break; - case 'B': // Large (big) integer + case 'G': // Large (great) integer if (Status) *(longlong *)p = Value->GetBigintValue(); @@ -657,6 +662,21 @@ void BINCOL::WriteColumn(PGLOBAL g) longjmp(g->jumper[g->jump_level], 11); } // endswitch Fmt + if (Eds && Status) { + p = tdbp->To_Line + Deplac; + + for (int i = 0; i < Lim; i++) + if (Eds == 'B' && Endian == 'L') + p[N - i - 1] = Buff[i]; + else if (Eds == 'L' && Endian == 'B') + p[i] = Buff[M - i - 1]; + else if (Endian == 'B') + p[N - i - 1] = Buff[M - i - 1]; + else + p[i] = Buff[i]; + + } // endif Eds + } // end of WriteColumn /* ------------------------ End of TabFix ---------------------------- */ diff --git a/storage/connect/tabfix.h b/storage/connect/tabfix.h index b6307e8f60b..49956ba0711 100644 --- a/storage/connect/tabfix.h +++ b/storage/connect/tabfix.h @@ -53,7 +53,8 @@ class DllExport TDBFIX : public TDBDOS { protected: virtual bool PrepareWriting(PGLOBAL g) {return false;} - // Members are inherited from TDBDOS + // Members + char Teds; /* Binary table default endian setting */ }; // end of class TDBFIX /***********************************************************************/ @@ -86,7 +87,8 @@ class DllExport BINCOL : public DOSCOL { // Members static char Endian; // The host endian setting (L or B) char *Buff; // Utility buffer - char Fmt; // The file endian setting or old format + char Eds; // The file endian setting + char Fmt; // The converted value format int N; // The number of bytes in the file int M; // The buffer type size int Lim; // Min(N,M) diff --git a/storage/connect/tabfmt.cpp b/storage/connect/tabfmt.cpp index a5e14e1b81f..015f8d93b15 100644 --- a/storage/connect/tabfmt.cpp +++ b/storage/connect/tabfmt.cpp @@ -20,7 +20,7 @@ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #include @@ -102,14 +102,14 @@ PQRYRES CSVColumns(PGLOBAL g, char *dp, const char *fn, char sep, } // endif info // num_max = atoi(p+1); // Max num of record to test -#if defined(WIN32) +#if defined(__WIN__) if (sep == ',' || strnicmp(setlocale(LC_NUMERIC, NULL), "French", 6)) dechar = '.'; else dechar = ','; -#else // !WIN32 +#else // !__WIN__ dechar = '.'; -#endif // !WIN32 +#endif // !__WIN__ if (trace) htrc("File %s sep=%c q=%c hdr=%d mxr=%d\n", @@ -147,7 +147,7 @@ PQRYRES CSVColumns(PGLOBAL g, char *dp, const char *fn, char sep, if (fgets(buf, sizeof(buf), infile)) { n = strlen(buf) + 1; buf[n - 2] = '\0'; -#if defined(UNIX) +#if !defined(__WIN__) // The file can be imported from Windows if (buf[n - 3] == '\r') buf[n - 3] = 0; @@ -204,7 +204,7 @@ PQRYRES CSVColumns(PGLOBAL g, char *dp, const char *fn, char sep, if (fgets(buf, sizeof(buf), infile)) { n = strlen(buf); buf[n - 1] = '\0'; -#if defined(UNIX) +#if !defined(__WIN__) // The file can be imported from Windows if (buf[n - 2] == '\r') buf[n - 2] = 0; diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 34d5827345f..fafba6228b9 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -59,16 +59,15 @@ typedef struct _jncol { /* JSONColumns: construct the result blocks containing the description */ /* of all the columns of a table contained inside a JSON file. */ /***********************************************************************/ -PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, - int pretty, int lrecl, int lvl, bool info) +PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info) { static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING}; static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; - char filename[_MAX_PATH], colname[65], fmt[129]; - int i, j, n = 0; + char *fn, colname[65], fmt[129]; + int i, j, lvl, n = 0; int ncol = sizeof(buftyp) / sizeof(int); PVAL valp; JCOL jcol; @@ -91,26 +90,29 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, goto skipit; } // endif info - if (trace) - htrc("File %s pretty=%d lvl=%d lrecl=%d\n", - SVP(fn), pretty, lvl, lrecl); - /*********************************************************************/ /* Open the input file. */ /*********************************************************************/ - if (!fn) { + if (!(fn = GetStringTableOption(g, topt, "Filename", NULL))) { strcpy(g->Message, MSG(MISSING_FNAME)); return NULL; - } else - PlugSetPath(filename, fn, dp); + } else { + lvl = GetIntegerTableOption(g, topt, "Level", 0); + lvl = (lvl < 0) ? 0 : (lvl > 16) ? 16 : lvl; + } // endif fn tdp = new(g) JSONDEF; - tdp->Database = dp; - tdp->Fn = filename; - tdp->Objname = objn; - tdp->Pretty = pretty; + tdp->Fn = fn; + tdp->Database = SetPath(g, db); + tdp->Objname = GetStringTableOption(g, topt, "Object", NULL); + tdp->Base = GetIntegerTableOption(g, topt, "Base", 0) ? 1 : 0; + tdp->Pretty = GetIntegerTableOption(g, topt, "Pretty", 2); - if (pretty == 2) { + if (trace) + htrc("File %s objname=%s pretty=%d lvl=%d\n", + tdp->Fn, tdp->Objname, tdp->Pretty, lvl); + + if (tdp->Pretty == 2) { tjsp = new(g) TDBJSON(tdp, new(g) MAPFAM(tdp)); if (tjsp->MakeDocument(g)) @@ -118,13 +120,12 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, jsp = (tjsp->GetDoc()) ? tjsp->GetDoc()->GetValue(0) : NULL; } else { - if (!lrecl) { - sprintf(g->Message, "LRECL must be specified for pretty=%d", pretty); + if (!(tdp->Lrecl = GetIntegerTableOption(g, topt, "Lrecl", 0))) { + sprintf(g->Message, "LRECL must be specified for pretty=%d", tdp->Pretty); return NULL; } // endif lrecl - tdp->Lrecl = lrecl; - tdp->Ending = CRLF; + tdp->Ending = GetIntegerTableOption(g, topt, "Ending", CRLF); tjnp = new(g) TDBJSN(tdp, new(g) DOSFAM(tdp)); tjnp->SetMode(MODE_READ); @@ -265,7 +266,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, jcp->Found = false; } // endfor jcp - if (pretty != 2) { + if (tdp->Pretty != 2) { // Read next record switch (tjnp->ReadDB(g)) { case RC_EF: @@ -285,7 +286,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, } // endor i - if (pretty != 2) + if (tdp->Pretty != 2) tjnp->CloseDB(g); skipit: @@ -341,7 +342,7 @@ PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, return qrp; err: - if (pretty != 2) + if (tdp->Pretty != 2) tjnp->CloseDB(g); return NULL; @@ -356,8 +357,7 @@ JSONDEF::JSONDEF(void) Xcol = NULL; Pretty = 2; Limit = 1; - Level = 0; - ReadMode = 0; + Base = 0; Strict = false; } // end of JSONDEF constructor @@ -370,9 +370,8 @@ bool JSONDEF::DefineAM(PGLOBAL g, LPCSTR, int poff) Objname = GetStringCatInfo(g, "Object", NULL); Xcol = GetStringCatInfo(g, "Expand", NULL); Pretty = GetIntCatInfo("Pretty", 2); - Level = GetIntCatInfo("Level", 0); Limit = GetIntCatInfo("Limit", 10); - Base = GetIntCatInfo("Base", 0); + Base = GetIntCatInfo("Base", 0) ? 1 : 0; return DOSDEF::DefineAM(g, "DOS", poff); } // end of DefineAM @@ -624,11 +623,11 @@ bool TDBJSN::SkipHeader(PGLOBAL g) return true; #endif // _DEBUG -#if defined(WIN32) +#if defined(__WIN__) #define Ending 2 -#else // !WIN32 +#else // !__WIN__ #define Ending 1 -#endif // !WIN32 +#endif // !__WIN__ if (Pretty == 1) { if (Mode == MODE_INSERT || Mode == MODE_DELETE) { @@ -1856,11 +1855,8 @@ void TDBJSON::CloseDB(PGLOBAL g) /***********************************************************************/ TDBJCL::TDBJCL(PJDEF tdp) : TDBCAT(tdp) { - Fn = tdp->GetFn(); - Objn = tdp->Objname; - Pretty = tdp->Pretty; - Lrecl = tdp->Lrecl; - lvl = tdp->Level; + Topt = tdp->GetTopt(); + Db = (char*)tdp->GetDB(); } // end of TDBJCL constructor /***********************************************************************/ @@ -1868,8 +1864,7 @@ TDBJCL::TDBJCL(PJDEF tdp) : TDBCAT(tdp) /***********************************************************************/ PQRYRES TDBJCL::GetResult(PGLOBAL g) { - return JSONColumns(g, ((PTABDEF)To_Def)->GetPath(), Fn, Objn, - Pretty, Lrecl, lvl, false); + return JSONColumns(g, Db, Topt, false); } // end of GetResult /* --------------------------- End of json --------------------------- */ diff --git a/storage/connect/tabjson.h b/storage/connect/tabjson.h index 4e5f84b1190..4505d30a21c 100644 --- a/storage/connect/tabjson.h +++ b/storage/connect/tabjson.h @@ -36,8 +36,7 @@ class JSONDEF : public DOSDEF { /* Table description */ friend class TDBJSON; friend class TDBJSN; friend class TDBJCL; - friend PQRYRES JSONColumns(PGLOBAL, char *, const char *, char *, - int, int, int, bool); + friend PQRYRES JSONColumns(PGLOBAL, char*, PTOS, bool); public: // Constructor JSONDEF(void); @@ -226,11 +225,6 @@ class TDBJCL : public TDBCAT { virtual PQRYRES GetResult(PGLOBAL g); // Members -//char *Dp; - const char *Fn; - char *Objn; - int Pretty; - int Lrecl; - int lvl; + PTOS Topt; + char *Db; }; // end of class TDBJCL - diff --git a/storage/connect/tabmac.cpp b/storage/connect/tabmac.cpp index f072465ced5..e6e2abb54e2 100644 --- a/storage/connect/tabmac.cpp +++ b/storage/connect/tabmac.cpp @@ -3,12 +3,12 @@ /* From the article and sample code by Khalid Shaikh. */ /* TABMAC: virtual table to get the list of MAC addresses. */ /***********************************************************************/ -#if defined(WIN32) +#if defined(__WIN__) #include "my_global.h" //#include -#else // !WIN32 -#error This is a WIN32 only table type -#endif // !WIN32 +#else // !__WIN__ +#error This is a WINDOWS only table type +#endif // !__WIN__ #include "global.h" #include "plgdbsem.h" //#include "catalog.h" diff --git a/storage/connect/tabmac.h b/storage/connect/tabmac.h index 5e6c98d68fb..f9a66e82eaa 100644 --- a/storage/connect/tabmac.h +++ b/storage/connect/tabmac.h @@ -1,11 +1,11 @@ // TABMAC.H Olivier Bertrand 2011-2012 // MAC: virtual table to Get Mac Addresses via GetAdaptersInfo -#if defined(WIN32) +#if defined(__WIN__) #include #include -#else // !WIN32 -#error This is a WIN32 only table TYPE -#endif // !WIN32 +#else // !__WIN__ +#error This is a WINDOWS only table TYPE +#endif // !__WIN__ /***********************************************************************/ /* Definitions. */ diff --git a/storage/connect/tabmul.cpp b/storage/connect/tabmul.cpp index 12e8de2c808..3008ca1b8ca 100644 --- a/storage/connect/tabmul.cpp +++ b/storage/connect/tabmul.cpp @@ -37,7 +37,7 @@ /* Include relevant section of system dependant header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) @@ -145,7 +145,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) /*******************************************************************/ /* To_File is a multiple name with special characters */ /*******************************************************************/ -#if defined(WIN32) +#if defined(__WIN__) char drive[_MAX_DRIVE], direc[_MAX_DIR]; WIN32_FIND_DATA FileData; HANDLE hSearch; @@ -196,7 +196,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) return true; } // endif FindClose -#else // !WIN32 +#else // !__WIN__ struct stat fileinfo; char fn[FN_REFLEN], direc[FN_REFLEN], pattern[FN_HEADLEN], ftype[FN_EXTLEN]; DIR *dir; @@ -249,7 +249,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) // Close the dir handle. closedir(dir); -#endif // !WIN32 +#endif // !__WIN__ } else { /*******************************************************************/ @@ -269,7 +269,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) p = filename + strlen(filename) - 1; -#if defined(UNIX) +#if !defined(__WIN__) // Data files can be imported from Windows (having CRLF) if (*p == '\n' || *p == '\r') { // is this enough for Unix ??? @@ -297,7 +297,7 @@ bool TDBMUL::InitFileNames(PGLOBAL g) } // endif Mul -#if defined(WIN32) +#if defined(__WIN__) suite: #endif @@ -620,17 +620,17 @@ TDBDIR::TDBDIR(PDIRDEF tdp) : TDBASE(tdp) { To_File = tdp->Fn; iFile = 0; -#if defined(WIN32) +#if defined(__WIN__) memset(&FileData, 0, sizeof(_finddata_t)); Hsearch = -1; *Drive = '\0'; -#else // !WIN32 +#else // !__WIN__ memset(&Fileinfo, 0, sizeof(struct stat)); Entry = NULL; Dir = NULL; Done = false; *Pattern = '\0'; -#endif // !WIN32 +#endif // !__WIN__ *Fpath = '\0'; *Direc = '\0'; *Fname = '\0'; @@ -641,17 +641,17 @@ TDBDIR::TDBDIR(PTDBDIR tdbp) : TDBASE(tdbp) { To_File = tdbp->To_File; iFile = tdbp->iFile; -#if defined(WIN32) +#if defined(__WIN__) FileData = tdbp->FileData; Hsearch = tdbp->Hsearch; strcpy(Drive, tdbp->Drive); -#else // !WIN32 +#else // !__WIN__ Fileinfo = tdbp->Fileinfo; Entry = tdbp->Entry; Dir = tdbp->Dir; Done = tdbp->Done; strcpy(Pattern, tdbp->Pattern); -#endif // !WIN32 +#endif // !__WIN__ strcpy(Direc, tdbp->Direc); strcpy(Fname, tdbp->Fname); strcpy(Ftype, tdbp->Ftype); @@ -675,7 +675,7 @@ char* TDBDIR::Path(PGLOBAL g) { PCATLG cat = PlgGetCatalog(g); -#if defined(WIN32) +#if defined(__WIN__) if (!*Drive) { PlugSetPath(Fpath, To_File, ((PTABDEF)To_Def)->GetPath()); _splitpath(Fpath, Drive, Direc, Fname, Ftype); @@ -683,7 +683,7 @@ char* TDBDIR::Path(PGLOBAL g) _makepath(Fpath, Drive, Direc, Fname, Ftype); // Usefull ??? return Fpath; -#else // !WIN32 +#else // !__WIN__ if (!Done) { PlugSetPath(Fpath, To_File, ((PTABDEF)To_Def)->GetPath()); _splitpath(Fpath, NULL, Direc, Fname, Ftype); @@ -692,7 +692,7 @@ char* TDBDIR::Path(PGLOBAL g) } // endif Done return Pattern; -#endif // !WIN32 +#endif // !__WIN__ } // end of Path /***********************************************************************/ @@ -710,7 +710,7 @@ int TDBDIR::GetMaxSize(PGLOBAL g) { if (MaxSize < 0) { int n = -1; -#if defined(WIN32) +#if defined(__WIN__) int h; // Start searching files in the target directory. @@ -726,7 +726,7 @@ int TDBDIR::GetMaxSize(PGLOBAL g) } else n = 0; -#else // !WIN32 +#else // !__WIN__ Path(g); // Start searching files in the target directory. @@ -750,7 +750,7 @@ int TDBDIR::GetMaxSize(PGLOBAL g) // Close the DIR handle. closedir(Dir); -#endif // !WIN32 +#endif // !__WIN__ MaxSize = n; } // endif MaxSize @@ -776,10 +776,10 @@ bool TDBDIR::OpenDB(PGLOBAL g) } // endif use Use = USE_OPEN; -#if !defined(WIN32) +#if !defined(__WIN__) Path(g); // Be sure it is done Dir = NULL; // For ReadDB -#endif // !WIN32 +#endif // !__WIN__ return false; } // end of OpenDB @@ -790,7 +790,7 @@ int TDBDIR::ReadDB(PGLOBAL g) { int rc = RC_OK; -#if defined(WIN32) +#if defined(__WIN__) if (Hsearch == -1) { /*******************************************************************/ /* Start searching files in the target directory. The use of the */ @@ -848,7 +848,7 @@ int TDBDIR::ReadDB(PGLOBAL g) rc = RC_EF; } // endif Entry -#endif // !WIN32 +#endif // !__WIN__ return rc; } // end of ReadDB @@ -876,17 +876,17 @@ int TDBDIR::DeleteDB(PGLOBAL g, int) /***********************************************************************/ void TDBDIR::CloseDB(PGLOBAL) { -#if defined(WIN32) +#if defined(__WIN__) // Close the search handle. _findclose(Hsearch); Hsearch = -1; -#else // !WIN32 +#else // !__WIN__ // Close the DIR handle if (Dir) { closedir(Dir); Dir = NULL; } // endif dir -#endif // !WIN32 +#endif // !__WIN__ iFile = 0; } // end of CloseDB @@ -935,19 +935,19 @@ void DIRCOL::ReadColumn(PGLOBAL g) /* Retrieve the information corresponding to the column number. */ /*********************************************************************/ switch (N) { -#if defined(WIN32) +#if defined(__WIN__) case 0: Value->SetValue_psz(tdbp->Drive); break; -#endif // WIN32 +#endif // __WIN__ case 1: Value->SetValue_psz(tdbp->Direc); break; case 2: Value->SetValue_psz(tdbp->Fname); break; case 3: Value->SetValue_psz(tdbp->Ftype); break; -#if defined(WIN32) +#if defined(__WIN__) case 4: Value->SetValue((int)tdbp->FileData.attrib); break; case 5: Value->SetValue((int)tdbp->FileData.size); break; case 6: Value->SetValue((int)tdbp->FileData.time_write); break; case 7: Value->SetValue((int)tdbp->FileData.time_create); break; case 8: Value->SetValue((int)tdbp->FileData.time_access); break; -#else // !WIN32 +#else // !__WIN__ case 4: Value->SetValue((int)tdbp->Fileinfo.st_mode); break; case 5: Value->SetValue((int)tdbp->Fileinfo.st_size); break; case 6: Value->SetValue((int)tdbp->Fileinfo.st_mtime); break; @@ -955,7 +955,7 @@ void DIRCOL::ReadColumn(PGLOBAL g) case 8: Value->SetValue((int)tdbp->Fileinfo.st_atime); break; case 9: Value->SetValue((int)tdbp->Fileinfo.st_uid); break; case 10: Value->SetValue((int)tdbp->Fileinfo.st_gid); break; -#endif // !WIN32 +#endif // !__WIN__ default: sprintf(g->Message, MSG(INV_DIRCOL_OFST), N); longjmp(g->jumper[g->jump_level], GetAmType()); @@ -1006,7 +1006,7 @@ int TDBSDR::FindInDir(PGLOBAL g) size_t m = strlen(Direc); // Start searching files in the target directory. -#if defined(WIN32) +#if defined(__WIN__) int h = _findfirst(Path(g), &FileData); if (h != -1) { @@ -1039,7 +1039,7 @@ int TDBSDR::FindInDir(PGLOBAL g) // Close the search handle. _findclose(h); } // endif h -#else // !WIN32 +#else // !__WIN__ int k; DIR *dir = opendir(Direc); @@ -1073,7 +1073,7 @@ int TDBSDR::FindInDir(PGLOBAL g) // Close the DIR handle. closedir(dir); -#endif // !WIN32 +#endif // !__WIN__ return n; } // end of FindInDir @@ -1089,13 +1089,13 @@ bool TDBSDR::OpenDB(PGLOBAL g) Sub = (PSUBDIR)PlugSubAlloc(g, NULL, sizeof(SUBDIR)); Sub->Next = NULL; Sub->Prev = NULL; -#if defined(WIN32) +#if defined(__WIN__) Sub->H = -1; Sub->Len = strlen(Direc); -#else // !WIN32 +#else // !__WIN__ Sub->D = NULL; Sub->Len = 0; -#endif // !WIN32 +#endif // !__WIN__ } // endif To_Sub return TDBDIR::OpenDB(g); @@ -1108,7 +1108,7 @@ int TDBSDR::ReadDB(PGLOBAL g) { int rc; -#if defined(WIN32) +#if defined(__WIN__) again: rc = TDBDIR::ReadDB(g); @@ -1160,7 +1160,7 @@ int TDBSDR::ReadDB(PGLOBAL g) } // endif H } // endif rc -#else // !WIN32 +#else // !__WIN__ rc = RC_NF; again: @@ -1217,7 +1217,7 @@ int TDBSDR::ReadDB(PGLOBAL g) } // endif Entry -#endif // !WIN32 +#endif // !__WIN__ return rc; } // end of ReadDB diff --git a/storage/connect/tabmul.h b/storage/connect/tabmul.h index 379e8f88e93..433cc3a2ee3 100644 --- a/storage/connect/tabmul.h +++ b/storage/connect/tabmul.h @@ -6,14 +6,14 @@ /* */ /* This file contains the TDBMUL and TDBDIR classes declares. */ /***********************************************************************/ -#if defined(WIN32) +#if defined(__WIN__) #include -#else // !WIN32 +#else // !__WIN__ #include #include #include #include -#endif // !WIN32 +#endif // !__WIN__ //#include "osutil.h" #include "block.h" @@ -132,17 +132,17 @@ class TDBDIR : public TDBASE { // Members PSZ To_File; // Points to file search pathname int iFile; // Index of currently retrieved file -#if defined(WIN32) +#if defined(__WIN__) _finddata_t FileData; // Find data structure int Hsearch; // Search handle char Drive[_MAX_DRIVE]; // Drive name -#else // !WIN32 +#else // !__WIN__ struct stat Fileinfo; // File info structure struct dirent *Entry; // Point to directory entry structure DIR *Dir; // To searched directory structure bool Done; // true when _splipath is done char Pattern[_MAX_FNAME+_MAX_EXT]; -#endif // !WIN32 +#endif // !__WIN__ char Fpath[_MAX_PATH]; // Absolute file search pattern char Direc[_MAX_DIR]; // Search path char Fname[_MAX_FNAME]; // File name @@ -183,11 +183,11 @@ class TDBSDR : public TDBDIR { typedef struct _Sub_Dir { struct _Sub_Dir *Next; struct _Sub_Dir *Prev; -#if defined(WIN32) +#if defined(__WIN__) int H; // Search handle -#else // !WIN32 +#else // !__WIN__ DIR *D; -#endif // !WIN32 +#endif // !__WIN__ size_t Len; // Initial directory name length } SUBDIR, *PSUBDIR; diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index cb7011822d8..19a5dfd758f 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -35,9 +35,9 @@ #include "my_global.h" #include "sql_class.h" #include "sql_servers.h" -#if defined(WIN32) +#if defined(__WIN__) //#include -#else // !WIN32 +#else // !__WIN__ //#include //#include #include @@ -46,7 +46,7 @@ #include "osutil.h" //#include //#include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ diff --git a/storage/connect/taboccur.cpp b/storage/connect/taboccur.cpp index da3cafc3c8f..07e260154e0 100644 --- a/storage/connect/taboccur.cpp +++ b/storage/connect/taboccur.cpp @@ -13,7 +13,7 @@ /***********************************************************************/ #include "my_global.h" #include "table.h" // MySQL table definitions -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index 3bf1238cebc..ad7892469cd 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -35,7 +35,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index b36dcbf94af..b628e26d3c7 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -17,7 +17,7 @@ /***********************************************************************/ #include "my_global.h" #include "table.h" // MySQL table definitions -#if defined(WIN32) +#if defined(__WIN__) #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index 623aeca36fe..76890e84429 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -12,12 +12,12 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #if defined(__BORLANDC__) #define __MFC_COMPAT__ // To define min/max as macro #endif // __BORLANDC__ //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #include @@ -25,7 +25,7 @@ #include #endif // !UNIX #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include application header files: */ @@ -36,9 +36,9 @@ #include "global.h" #include "plgdbsem.h" #include "reldef.h" -#if !defined(WIN32) +#if !defined(__WIN__) #include "osutil.h" -#endif // !WIN32 +#endif // !__WIN__ #include "filamtxt.h" #include "tabdos.h" #include "tabsys.h" @@ -48,10 +48,10 @@ #define CSZ 36 // Column section name length #define CDZ 256 // Column definition length -#if !defined(WIN32) +#if !defined(__WIN__) #define GetPrivateProfileSectionNames(S,L,I) \ GetPrivateProfileString(NULL,NULL,"",S,L,I) -#endif // !WIN32 +#endif // !__WIN__ /* -------------- Implementation of the INI classes ------------------ */ @@ -123,7 +123,7 @@ bool INIDEF::DeleteTableFile(PGLOBAL g) // Delete the INI table file if not protected if (!IsReadOnly()) { PlugSetPath(filename, Fn, GetPath()); -#if defined(WIN32) +#if defined(__WIN__) rc = !DeleteFile(filename); #else // UNIX rc = remove(filename); @@ -345,9 +345,9 @@ int TDBINI::DeleteDB(PGLOBAL g, int irc) /***********************************************************************/ void TDBINI::CloseDB(PGLOBAL) { -#if !defined(WIN32) +#if !defined(__WIN__) PROFILE_Close(Ifile); -#endif // !WIN32 +#endif // !__WIN__ } // end of CloseDB // ------------------------ INICOL functions ---------------------------- diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index f2affe75d2b..7f979eaf4be 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -39,7 +39,7 @@ //#include "sql_base.h" #include "my_global.h" #include "table.h" // MySQL table definitions -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) @@ -73,15 +73,15 @@ #include "tabmysql.h" #include "ha_connect.h" -#if defined(WIN32) +#if defined(__WIN__) #if defined(__BORLANDC__) #define SYSEXIT void _USERENTRY #else #define SYSEXIT void #endif -#else // !WIN32 +#else // !__WIN__ #define SYSEXIT void * -#endif // !WIN32 +#endif // !__WIN__ /* ---------------------------- Class TBLDEF ---------------------------- */ diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index 5ed958b2f7a..331a7f45d4d 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -14,7 +14,7 @@ #include "sql_class.h" #include "table.h" #include "field.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabvct.cpp b/storage/connect/tabvct.cpp index 6394ea5e2d6..e788529075f 100644 --- a/storage/connect/tabvct.cpp +++ b/storage/connect/tabvct.cpp @@ -35,7 +35,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) @@ -146,7 +146,7 @@ bool VCTDEF::Erase(char *filename) for (i = 1, cdp = To_Cols; cdp; i++, cdp = cdp->GetNext()) { sprintf(filename, fpat, i); -//#if defined(WIN32) +//#if defined(__WIN__) // rc |= !DeleteFile(filename); //#else // UNIX rc |= remove(filename); @@ -175,7 +175,7 @@ bool VCTDEF::Erase(char *filename) int VCTDEF::MakeFnPattern(char *fpat) { char pat[8]; -#if !defined(UNIX) +#if defined(__WIN__) char drive[_MAX_DRIVE]; #else char *drive = NULL; diff --git a/storage/connect/tabwmi.cpp b/storage/connect/tabwmi.cpp index 7c69426a066..98a44b9d635 100644 --- a/storage/connect/tabwmi.cpp +++ b/storage/connect/tabwmi.cpp @@ -2,9 +2,9 @@ /* TABWMI: Author Olivier Bertrand -- PlugDB -- 2012 - 2013 */ /* TABWMI: Virtual table to get WMI information. */ /***********************************************************************/ -#if !defined(WIN32) -#error This is a WIN32 only table type -#endif // !WIN32 +#if !defined(__WIN__) +#error This is a WINDOWS only table type +#endif // !__WIN__ #include "my_global.h" #include diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index 7d6d94d34c0..add61431493 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -17,7 +17,7 @@ /***********************************************************************/ #include "my_global.h" #include "table.h" // MySQL table definitions -#if defined(WIN32) +#if defined(__WIN__) #include #include #if defined(__BORLANDC__) diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 46f762efc35..49fa9a1c554 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -15,12 +15,12 @@ #include #include #include -#if defined(WIN32) +#if defined(__WIN__) #include #include //#include #include -#else // !WIN32 +#else // !__WIN__ #include #include #include @@ -28,7 +28,7 @@ //#include #include "osutil.h" #define _O_RDONLY O_RDONLY -#endif // !WIN32 +#endif // !__WIN__ #include "resource.h" // for IDS_COLUMNS #define INCLUDE_TDBXML @@ -53,11 +53,11 @@ extern "C" char version[]; -#if defined(WIN32) && defined(DOMDOC_SUPPORT) +#if defined(__WIN__) && defined(DOMDOC_SUPPORT) #define XMLSUP "MS-DOM" -#else // !WIN32 +#else // !__WIN__ #define XMLSUP "libxml2" -#endif // !WIN32 +#endif // !__WIN__ #define TYPE_UNKNOWN 12 /* Must be greater than other types */ @@ -110,14 +110,14 @@ typedef struct LVL { /* XMLColumns: construct the result blocks containing the description */ /* of all the columns of a table contained inside an XML file. */ /***********************************************************************/ -PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) +PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) { static int buftyp[] = {TYPE_STRING, TYPE_SHORT, TYPE_STRING, TYPE_INT, TYPE_INT, TYPE_SHORT, TYPE_SHORT, TYPE_STRING}; static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; - char *op, colname[65], fmt[129], buf[512]; + char *fn, *op, colname[65], fmt[129], buf[512]; int i, j, lvl, n = 0; int ncol = sizeof(buftyp) / sizeof(int); bool ok = true; @@ -138,26 +138,28 @@ PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info) /*********************************************************************/ /* Open the input file. */ /*********************************************************************/ - if (!topt->filename) { + if (!(fn = GetStringTableOption(g, topt, "Filename", NULL))) { strcpy(g->Message, MSG(MISSING_FNAME)); return NULL; - } else - lvl = atoi(GetListOption(g, "Level", topt->oplist, "0")); + } else { + lvl = GetIntegerTableOption(g, topt, "Level", 0); + lvl = (lvl < 0) ? 0 : (lvl > 16) ? 16 : lvl; + } // endif fn if (trace) htrc("File %s lvl=%d\n", topt->filename, lvl); tdp = new(g) XMLDEF; - tdp->Database = dp; - tdp->Fn = (char*)topt->filename; + tdp->Fn = fn; + tdp->Database = SetPath(g, db); tdp->Tabname = tab; - if (!(op = GetListOption(g, "Xmlsup", topt->oplist, NULL))) -#if defined(WIN32) + if (!(op = GetStringTableOption(g, topt, "Xmlsup", NULL))) +#if defined(__WIN__) tdp->Usedom = true; -#else // !WIN32 +#else // !__WIN__ tdp->Usedom = false; -#endif // !WIN32 +#endif // !__WIN__ else tdp->Usedom = (toupper(*op) == 'M' || toupper(*op) == 'D'); @@ -432,7 +434,7 @@ XMLDEF::XMLDEF(void) /***********************************************************************/ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { - char *defrow, *defcol, buf[10]; + char *defrow, *defcol, buf[10]; Fn = GetStringCatInfo(g, "Filename", NULL); Encoding = GetStringCatInfo(g, "Encoding", "UTF-8"); @@ -447,7 +449,7 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) return true; } // endif flag - defrow = defcol = ""; + defrow = defcol = NULL; GetCharCatInfo("Coltype", "", buf, sizeof(buf)); switch (toupper(*buf)) { @@ -480,29 +482,29 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Tabname = GetStringCatInfo(g, "Tabname", Tabname); Rowname = GetStringCatInfo(g, "Rownode", defrow); Colname = GetStringCatInfo(g, "Colnode", defcol); - Mulnode = GetStringCatInfo(g, "Mulnode", ""); - XmlDB = GetStringCatInfo(g, "XmlDB", ""); - Nslist = GetStringCatInfo(g, "Nslist", ""); - DefNs = GetStringCatInfo(g, "DefNs", ""); + Mulnode = GetStringCatInfo(g, "Mulnode", NULL); + XmlDB = GetStringCatInfo(g, "XmlDB", NULL); + Nslist = GetStringCatInfo(g, "Nslist", NULL); + DefNs = GetStringCatInfo(g, "DefNs", NULL); Limit = GetIntCatInfo("Limit", 10); - Xpand = (GetIntCatInfo("Expand", 0) != 0); + Xpand = GetBoolCatInfo("Expand", false); Header = GetIntCatInfo("Header", 0); GetCharCatInfo("Xmlsup", "*", buf, sizeof(buf)); // Note that if no support is specified, the default is MS-DOM // on Windows and libxml2 otherwise if (*buf == '*') -#if defined(WIN32) +#if defined(__WIN__) Usedom = true; -#else // !WIN32 +#else // !__WIN__ Usedom = false; -#endif // !WIN32 +#endif // !__WIN__ else Usedom = (toupper(*buf) == 'M' || toupper(*buf) == 'D'); // Get eventual table node attribute - Attrib = GetStringCatInfo(g, "Attribute", ""); - Hdattr = GetStringCatInfo(g, "HeadAttr", ""); + Attrib = GetStringCatInfo(g, "Attribute", NULL); + Hdattr = GetStringCatInfo(g, "HeadAttr", NULL); return false; } // end of DefineAM @@ -543,14 +545,14 @@ TDBXML::TDBXML(PXMLDEF tdp) : TDBASE(tdp) Xfile = tdp->Fn; Enc = tdp->Encoding; Tabname = tdp->Tabname; - Rowname = (tdp->Rowname && *tdp->Rowname) ? tdp->Rowname : NULL; - Colname = (tdp->Colname && *tdp->Colname) ? tdp->Colname : NULL; - Mulnode = (tdp->Mulnode && *tdp->Mulnode) ? tdp->Mulnode : NULL; - XmlDB = (tdp->XmlDB && *tdp->XmlDB) ? tdp->XmlDB : NULL; - Nslist = (tdp->Nslist && *tdp->Nslist) ? tdp->Nslist : NULL; - DefNs = (tdp->DefNs && *tdp->DefNs) ? tdp->DefNs : NULL; - Attrib = (tdp->Attrib && *tdp->Attrib) ? tdp->Attrib : NULL; - Hdattr = (tdp->Hdattr && *tdp->Hdattr) ? tdp->Hdattr : NULL; + Rowname = (tdp->Rowname) ? tdp->Rowname : NULL; + Colname = (tdp->Colname) ? tdp->Colname : NULL; + Mulnode = (tdp->Mulnode) ? tdp->Mulnode : NULL; + XmlDB = (tdp->XmlDB) ? tdp->XmlDB : NULL; + Nslist = (tdp->Nslist) ? tdp->Nslist : NULL; + DefNs = (tdp->DefNs) ? tdp->DefNs : NULL; + Attrib = (tdp->Attrib) ? tdp->Attrib : NULL; + Hdattr = (tdp->Hdattr) ? tdp->Hdattr : NULL; Coltype = tdp->Coltype; Limit = tdp->Limit; Xpand = tdp->Xpand; @@ -876,7 +878,7 @@ bool TDBXML::Initialize(PGLOBAL g) Nlist = TabNode->GetChildElements(g); Docp->SetNofree(true); // For libxml2 -#if defined(WIN32) +#if defined(__WIN__) } catch(_com_error e) { // We come here if a DOM command threw an error char buf[128]; @@ -890,7 +892,7 @@ bool TDBXML::Initialize(PGLOBAL g) sprintf(g->Message, "%s hr=%p", MSG(COM_ERROR), e.Error()); goto error; -#endif // WIN32 +#endif // __WIN__ #if !defined(UNIX) } catch(...) { // Other errors @@ -1015,7 +1017,7 @@ int TDBXML::GetMaxSize(PGLOBAL g) else MaxSize = 10; - } // endif MaxSize + } // endif MaxSize return MaxSize; } // end of GetMaxSize @@ -1256,7 +1258,7 @@ void TDBXML::CloseDB(PGLOBAL g) { if (Docp) { if (Changed) { - char filename[_MAX_PATH]; + char filename[_MAX_PATH]; // We used the file name relative to recorded datapath PlugSetPath(filename, Xfile, GetPath()); @@ -1660,7 +1662,7 @@ void XMLCOL::WriteColumn(PGLOBAL g) /*********************************************************************/ /* Null values are represented by no node. */ /*********************************************************************/ - if (Value->IsNull()) + if (Value->IsNull()) return; /*********************************************************************/ @@ -2160,7 +2162,7 @@ void XPOSCOL::WriteColumn(PGLOBAL g) TDBXCT::TDBXCT(PXMLDEF tdp) : TDBCAT(tdp) { Topt = tdp->GetTopt(); - Dp = tdp->GetPath(); + Db = (char*)tdp->GetDB(); Tabn = tdp->Tabname; } // end of TDBXCT constructor @@ -2169,7 +2171,7 @@ TDBXCT::TDBXCT(PXMLDEF tdp) : TDBCAT(tdp) /***********************************************************************/ PQRYRES TDBXCT::GetResult(PGLOBAL g) { - return XMLColumns(g, Dp, Tabn, Topt, false); + return XMLColumns(g, Db, Tabn, Topt, false); } // end of GetResult /* ------------------------ End of Tabxml ---------------------------- */ diff --git a/storage/connect/tabxml.h b/storage/connect/tabxml.h index 4eae5c082c1..7ba3166881d 100644 --- a/storage/connect/tabxml.h +++ b/storage/connect/tabxml.h @@ -1,7 +1,7 @@ /*************** Tabxml H Declares Source Code File (.H) ***************/ /* Name: TABXML.H Version 1.6 */ /* */ -/* (C) Copyright to the author Olivier BERTRAND 2007-2013 */ +/* (C) Copyright to the author Olivier BERTRAND 2007-2015 */ /* */ /* This file contains the XML table classes declares. */ /***********************************************************************/ @@ -255,8 +255,7 @@ class TDBXCT : public TDBCAT { // Members PTOS Topt; - char *Dp; -//const char *Fn; + char *Db; char *Tabn; }; // end of class TDBXCT diff --git a/storage/connect/valblk.cpp b/storage/connect/valblk.cpp index 94e09e1a85c..5fefcba5856 100644 --- a/storage/connect/valblk.cpp +++ b/storage/connect/valblk.cpp @@ -23,7 +23,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) //#include #else #include "osutil.h" diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 5a8b1de326a..03ec0eb8e40 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -30,11 +30,11 @@ #include "sql_class.h" #include "sql_time.h" -#if defined(WIN32) +#if defined(__WIN__) //#include -#else // !WIN32 +#else // !__WIN__ #include -#endif // !WIN32 +#endif // !__WIN__ #include @@ -77,12 +77,12 @@ int DTVAL::Shift = 0; /***********************************************************************/ bool PlugEvalLike(PGLOBAL, LPCSTR, LPCSTR, bool); -#if !defined(WIN32) +#if !defined(__WIN__) extern "C" { PSZ strupr(PSZ s); PSZ strlwr(PSZ s); } -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Get a long long number from its character representation. */ @@ -1618,10 +1618,10 @@ int TYPVAL::CompareValue(PVAL vp) else n = strcmp(Strp, vp->GetCharValue()); -#if defined(WIN32) +#if defined(__WIN__) if (n == _NLSCMPERROR) return n; // Here we should raise an error -#endif // WIN32 +#endif // __WIN__ return (n > 0) ? 1 : (n < 0) ? -1 : 0; } // end of CompareValue diff --git a/storage/connect/value.h b/storage/connect/value.h index 207944594f1..780917c9962 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -36,8 +36,9 @@ typedef struct _datpar *PDTP; // For DTVAL DllExport PSZ GetTypeName(int); DllExport int GetTypeSize(int, int); #ifdef ODBC_SUPPORT -/* This function is exported for use in EOM table type DLLs */ -DllExport int TranslateSQLType(int stp, int prec, int& len, char& v); +/* This function is exported for use in OEM table type DLLs */ +DllExport int TranslateSQLType(int stp, int prec, + int& len, char& v, bool& w); #endif DllExport char *GetFormatType(int); DllExport int GetFormatType(char); @@ -359,14 +360,9 @@ class DllExport DTVAL : public TYPVAL { public: // Constructors DTVAL(PGLOBAL g, int n, int p, PSZ fmt); -//DTVAL(PGLOBAL g, PSZ s, int n); -//DTVAL(PGLOBAL g, short i); DTVAL(int n); -//DTVAL(PGLOBAL g, longlong n); -//DTVAL(PGLOBAL g, double f); // Implementation - virtual bool IsZero(void) {return Null;} virtual bool SetValue_pval(PVAL valp, bool chktype); virtual bool SetValue_char(char *p, int n); virtual void SetValue_psz(PSZ s); diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index ee8dc3ac4cb..a2d75cec8ab 100755 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -10,12 +10,12 @@ /* Include relevant sections of the System header files. */ /***********************************************************************/ #include "my_global.h" -#if defined(WIN32) +#if defined(__WIN__) #include #include #include //#include -#else // !WIN32 +#else // !__WIN__ #if defined(UNIX) #include #include @@ -25,7 +25,7 @@ #include #endif // !UNIX #include -#endif // !WIN32 +#endif // !__WIN__ /***********************************************************************/ /* Include required application header files */ @@ -340,6 +340,9 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) } // endif n + if (trace) + htrc("XINDEX Make: n=%d\n", n); + // File position must be stored Record.Size = n * sizeof(int); @@ -477,6 +480,9 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp) } else To_Rec[nkey] = Tdbp->GetRecpos(); + if (trace > 1) + htrc("Make: To_Rec[%d]=%d\n", nkey, To_Rec[nkey]); + /*******************************************************************/ /* Get the keys and place them in the key blocks. */ /*******************************************************************/ @@ -835,7 +841,7 @@ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp) if ((sep = defp->GetBoolCatInfo("SepIndex", false))) { // Index is saved in a separate file -#if !defined(UNIX) +#if defined(__WIN__) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -988,7 +994,7 @@ bool XINDEX::Init(PGLOBAL g) if (defp->SepIndex()) { // Index was saved in a separate file -#if !defined(UNIX) +#if defined(__WIN__) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -1241,7 +1247,7 @@ bool XINDEX::MapInit(PGLOBAL g) if (defp->SepIndex()) { // Index was save in a separate file -#if !defined(UNIX) +#if defined(__WIN__) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -1454,7 +1460,7 @@ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk) if (defp->SepIndex()) { // Index was saved in a separate file -#if !defined(UNIX) +#if defined(__WIN__) char drive[_MAX_DRIVE]; #else char *drive = NULL; @@ -1759,6 +1765,9 @@ int XINDEX::Fetch(PGLOBAL g) if (Num_K == 0) return -1; // means end of file + if (trace > 1) + htrc("XINDEX Fetch: Op=%d\n", Op); + /*********************************************************************/ /* Table read through a sorted index. */ /*********************************************************************/ @@ -1776,9 +1785,6 @@ int XINDEX::Fetch(PGLOBAL g) break; case OP_SAME: // Read next same // Logically the key values should be the same as before - if (trace > 1) - htrc("looking for next same value\n"); - if (NextVal(true)) { Op = OP_EQ; return -2; // no more equal values @@ -1824,7 +1830,7 @@ int XINDEX::Fetch(PGLOBAL g) Nth++; if (trace > 1) - htrc("Fetch: Looking for new value\n"); + htrc("Fetch: Looking for new value Nth=%d\n", Nth); Cur_K = FastFind(); @@ -1896,6 +1902,10 @@ int XINDEX::FastFind(void) sup = To_KeyCol->Ndf; } // endif Nblk + if (trace > 2) + htrc("XINDEX FastFind: Nblk=%d Op=%d inf=%d sup=%d\n", + Nblk, Op, inf, sup); + for (k = 0, kcp = To_KeyCol; kcp; kcp = kcp->Next) { while (sup - inf > 1) { i = (inf + sup) >> 1; @@ -1970,6 +1980,9 @@ int XINDEX::FastFind(void) curk = (kcp->Kof) ? kcp->Kof[kcp->Val_K] : kcp->Val_K; } // endfor kcp + if (trace > 2) + htrc("XINDEX FastFind: curk=%d\n", curk); + return curk; } // end of FastFind @@ -2043,8 +2056,7 @@ int XINDXS::GroupSize(void) #if defined(_DEBUG) assert(To_KeyCol->Val_K >= 0 && To_KeyCol->Val_K < Ndif); #endif // _DEBUG - return (Pof) ? Pof[To_KeyCol->Val_K + 1] - Pof[To_KeyCol->Val_K] - : 1; + return (Pof) ? Pof[To_KeyCol->Val_K + 1] - Pof[To_KeyCol->Val_K] : 1; } // end of GroupSize /***********************************************************************/ @@ -2106,6 +2118,9 @@ int XINDXS::Fetch(PGLOBAL g) if (Num_K == 0) return -1; // means end of file + if (trace > 1) + htrc("XINDXS Fetch: Op=%d\n", Op); + /*********************************************************************/ /* Table read through a sorted index. */ /*********************************************************************/ @@ -2120,9 +2135,6 @@ int XINDXS::Fetch(PGLOBAL g) Op = OP_NEXT; break; case OP_SAME: // Read next same - if (trace > 1) - htrc("looking for next same value\n"); - if (!Mul || NextVal(true)) { Op = OP_EQ; return -2; // No more equal values @@ -2160,7 +2172,7 @@ int XINDXS::Fetch(PGLOBAL g) Nth++; if (trace > 1) - htrc("Fetch: Looking for new value\n"); + htrc("Fetch: Looking for new value Nth=%d\n", Nth); Cur_K = FastFind(); @@ -2192,7 +2204,7 @@ int XINDXS::Fetch(PGLOBAL g) /***********************************************************************/ int XINDXS::FastFind(void) { - register int sup, inf, i= 0, n = 2; + register int sup, inf, i= 0, n = 2; register PXCOL kcp = To_KeyCol; if (Nblk && Op == OP_EQ) { @@ -2215,7 +2227,6 @@ int XINDXS::FastFind(void) if (inf < 0) return Num_K; -// i = inf; inf *= Sblk; if ((sup = inf + Sblk) > Ndif) @@ -2227,6 +2238,10 @@ int XINDXS::FastFind(void) sup = Ndif; } // endif Nblk + if (trace > 2) + htrc("XINDXS FastFind: Nblk=%d Op=%d inf=%d sup=%d\n", + Nblk, Op, inf, sup); + while (sup - inf > 1) { i = (inf + sup) >> 1; @@ -2249,6 +2264,9 @@ int XINDXS::FastFind(void) n = 0; } // endif sup + if (trace > 2) + htrc("XINDXS FastFind: n=%d i=%d\n", n, i); + // Loop on kcp because of dynamic indexing for (; kcp; kcp = kcp->Next) kcp->Val_K = i; // Used by FillValue @@ -2330,6 +2348,10 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) } // endif NewOff.Low = (int)ftell(Xfile); + + if (trace) + htrc("XFILE Open: NewOff.Low=%d\n", NewOff.Low); + } else if (mode == MODE_WRITE) { if (id >= 0) { // New not sep index file. Write the header. @@ -2337,6 +2359,10 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) Write(g, noff, sizeof(IOFF), MAX_INDX, rc); fseek(Xfile, 0, SEEK_END); NewOff.Low = (int)ftell(Xfile); + + if (trace) + htrc("XFILE Open: NewOff.Low=%d\n", NewOff.Low); + } // endif id } else if (mode == MODE_READ && id >= 0) { @@ -2346,6 +2372,9 @@ bool XFILE::Open(PGLOBAL g, char *filename, int id, MODE mode) return true; } // endif MAX_INDX + if (trace) + htrc("XFILE Open: noff[%d].Low=%d\n", id, noff[id].Low); + // Position the cursor at the offset of this index if (fseek(Xfile, noff[id].Low, SEEK_SET)) { sprintf(g->Message, MSG(FUNC_ERRNO), errno, "Xseek"); @@ -2479,7 +2508,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) if (trace) htrc(" Xopen: filename=%s id=%d mode=%d\n", filename, id, mode); -#if defined(WIN32) +#if defined(__WIN__) LONG high = 0; DWORD rc, drc, access, share, creation; @@ -2655,7 +2684,7 @@ bool XHUGE::Open(PGLOBAL g, char *filename, int id, MODE mode) /***********************************************************************/ bool XHUGE::Seek(PGLOBAL g, int low, int high, int origin) { -#if defined(WIN32) +#if defined(__WIN__) LONG hi = high; DWORD rc = SetFilePointer(Hfile, low, &hi, origin); @@ -2691,7 +2720,7 @@ bool XHUGE::Read(PGLOBAL g, void *buf, int n, int size) { bool rc = false; -#if defined(WIN32) +#if defined(__WIN__) bool brc; DWORD nbr, count = (DWORD)(n * size); @@ -2737,7 +2766,7 @@ bool XHUGE::Read(PGLOBAL g, void *buf, int n, int size) /***********************************************************************/ int XHUGE::Write(PGLOBAL g, void *buf, int n, int size, bool& rc) { -#if defined(WIN32) +#if defined(__WIN__) bool brc; DWORD nbw, count = (DWORD)n * (DWORD) size; @@ -2779,7 +2808,7 @@ void XHUGE::Close(char *fn, int id) if (trace) htrc("XHUGE::Close: fn=%s id=%d NewOff=%lld\n", fn, id, NewOff.Val); -#if defined(WIN32) +#if defined(__WIN__) if (id >= 0 && fn) { CloseFileHandle(Hfile); Hfile = CreateFile(fn, GENERIC_READ | GENERIC_WRITE, 0, NULL, @@ -2794,7 +2823,7 @@ void XHUGE::Close(char *fn, int id) } // endif SetFilePointer } // endif id -#else // !WIN32 +#else // !__WIN__ if (id >= 0 && fn) { if (Hfile != INVALID_HANDLE_VALUE) { if (lseek64(Hfile, id * sizeof(IOFF), SEEK_SET) >= 0) { @@ -2810,7 +2839,7 @@ void XHUGE::Close(char *fn, int id) htrc("(XHUGE)error reopening %s: %s\n", fn, strerror(errno)); } // endif id -#endif // !WIN32 +#endif // !__WIN__ XLOAD::Close(); } // end of Close @@ -3158,12 +3187,18 @@ bool KXYCOL::InitFind(PGLOBAL g, PXOB xp) xp->Reset(); xp->Eval(g); Valp->SetValue_pval(xp->GetValue(), false); -// Valp->SetValue_pval(xp->GetValue(), !Prefix); } // endif Type + if (trace > 1) { + char buf[32]; + + htrc("KCOL InitFind: value=%s\n", Valp->GetCharString(buf)); + } // endif trace + return false; } // end of InitFind +#if 0 /***********************************************************************/ /* InitBinFind: initialize Value to the value pointed by vp. */ /***********************************************************************/ @@ -3171,6 +3206,7 @@ void KXYCOL::InitBinFind(void *vp) { Valp->SetBinValue(vp); } // end of InitBinFind +#endif // 0 /***********************************************************************/ /* KXYCOL FillValue: called by COLBLK::Eval when a column value is */ diff --git a/storage/connect/xindex.h b/storage/connect/xindex.h index 079412b32cf..a4e98075222 100644 --- a/storage/connect/xindex.h +++ b/storage/connect/xindex.h @@ -346,7 +346,7 @@ class DllExport XLOAD : public BLOCK { protected: // Members -#if defined(WIN32) +#if defined(__WIN__) HANDLE Hfile; // Handle to file or map #else // UNIX int Hfile; // Descriptor to file or map @@ -462,7 +462,7 @@ class KXYCOL: public BLOCK { virtual void FreeData(void); virtual void FillValue(PVAL valp); virtual int CompVal(int i); - void InitBinFind(void *vp); +// void InitBinFind(void *vp); bool MakeBlockArray(PGLOBAL g, int nb, int size); int Compare(int i1, int i2); int CompBval(int i); From 30fd69e6058169b35d1a00ae362b4f60329b6738 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 2 Jun 2015 11:53:22 +0200 Subject: [PATCH 14/39] Handle ODBC table null values modified: tabodbc.cpp --- storage/connect/tabodbc.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index ad7892469cd..6c6684db527 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -1268,6 +1268,10 @@ void ODBCCOL::ReadColumn(PGLOBAL g) } // endif Buf_Type + // Handle null values + if (Value->IsZero()) + Value->SetNull(Nullable); + if (trace) { char buf[64]; From 36d2bd6a15ae55da9939b052e3d7a31fe0cf7e75 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Wed, 3 Jun 2015 16:58:42 +0200 Subject: [PATCH 15/39] Handle ODBC table null values modified: tabodbc.cpp --- storage/connect/connect.cc | 42 ++++++++++++++++++++++++++++++++++++- storage/connect/tabodbc.cpp | 6 +++++- storage/connect/xindex.h | 4 ++++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index 12b23878891..7b7144dacbb 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -709,6 +709,28 @@ int CntIndexInit(PGLOBAL g, PTDB ptdb, int id, bool sorted) return (tdbp->To_Kindex->IsMul()) ? 2 : 1; } // end of CntIndexInit +#if defined(WORDS_BIGENDIAN) +/***********************************************************************/ +/* Swap bytes of the key that are written in little endian order. */ +/***********************************************************************/ +static void SetSwapValue(PVAL valp, char *kp) +{ + if (valp->IsTypeNum() && valp->GetType() != TYPE_DECIM) { + uchar buf[8]; + int i, k= valp->GetClen(); + + for (i = 0; k > 0;) + buf[i++]= kp[--k]; + + + + valp->SetBinValue((void*)buf); + } else + valp->SetBinValue((void*)kp); + +} // end of SetSwapValue +#endif // WORDS_BIGENDIAN + /***********************************************************************/ /* IndexRead: fetch a record having the index value. */ /***********************************************************************/ @@ -779,7 +801,12 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, if (!valp->IsTypeNum()) { if (colp->GetColUse(U_VAR)) { +#if defined(WORDS_BIGENDIAN) + ((char*)&lg)[0]= ((char*)kp)[1]; + ((char*)&lg)[1]= ((char*)kp)[0]; +#else // !WORDS_BIGENDIAN lg= *(short*)kp; +#endif //!WORDS_BIGENDIAN kp+= sizeof(short); rcb= valp->SetValue_char(kp, (int)lg); } else @@ -797,7 +824,11 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, } // endif b } else +#if defined(WORDS_BIGENDIAN) + SetSwapValue(valp, kp); +#else // !WORDS_BIGENDIAN valp->SetBinValue((void*)kp); +#endif //!WORDS_BIGENDIAN kp+= valp->GetClen(); @@ -893,7 +924,12 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, if (!valp->IsTypeNum()) { if (colp->GetColUse(U_VAR)) { +#if defined(WORDS_BIGENDIAN) + ((char*)&lg)[0]= ((char*)p)[1]; + ((char*)&lg)[1]= ((char*)p)[0]; +#else // !WORDS_BIGENDIAN lg= *(short*)p; +#endif //!WORDS_BIGENDIAN p+= sizeof(short); rcb= valp->SetValue_char((char*)p, (int)lg); } else @@ -912,7 +948,11 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, } // endif b } else - valp->SetBinValue((void*)p); +#if defined(WORDS_BIGENDIAN) + SetSwapValue(valp, (char*)kp); +#else // !WORDS_BIGENDIAN + valp->SetBinValue((void*)kp); +#endif // !WORDS_BIGENDIAN if (trace) { char bf[32]; diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index ad7892469cd..307509848f4 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -1268,6 +1268,10 @@ void ODBCCOL::ReadColumn(PGLOBAL g) } // endif Buf_Type + // Handle null values + if (Value->IsZero()) + Value->SetNull(Nullable); + if (trace) { char buf[64]; @@ -1393,7 +1397,7 @@ void ODBCCOL::WriteColumn(PGLOBAL g) /* -------------------------- Class TDBXDBC -------------------------- */ /***********************************************************************/ -/* Implementation of the TDBODBC class. */ +/* Implementation of the TDBXDBC class. */ /***********************************************************************/ TDBXDBC::TDBXDBC(PODEF tdp) : TDBODBC(tdp) { diff --git a/storage/connect/xindex.h b/storage/connect/xindex.h index a4e98075222..51b678992ea 100644 --- a/storage/connect/xindex.h +++ b/storage/connect/xindex.h @@ -65,7 +65,11 @@ typedef struct index_def : public BLOCK { typedef struct index_off { union { +#if defined(WORDS_BIGENDIAN) + struct {int High; int Low;}; +#else // !WORDS_BIGENDIAN struct {int Low; int High;}; +#endif //!WORDS_BIGENDIAN longlong Val; // File position }; // end of union } IOFF; From 2a3166feff2ab25b4481dac51561a4f7f590e8c2 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Wed, 3 Jun 2015 17:54:11 +0200 Subject: [PATCH 16/39] Fix swapping key numeric values on Big Endian machines. Fix typo error in CntIndexRange (kp instead of p) Change version date modified: storage/connect/connect.cc modified: storage/connect/ha_connect.cc --- storage/connect/connect.cc | 6 +++--- storage/connect/ha_connect.cc | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index 7b7144dacbb..4e554b16638 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -15,7 +15,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /***********************************************************************/ -/* Author Olivier BERTRAND bertrandop@gmail.com 2004-2012 */ +/* Author Olivier BERTRAND bertrandop@gmail.com 2004-2015 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -949,9 +949,9 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len, } else #if defined(WORDS_BIGENDIAN) - SetSwapValue(valp, (char*)kp); + SetSwapValue(valp, (char*)p); #else // !WORDS_BIGENDIAN - valp->SetBinValue((void*)kp); + valp->SetBinValue((void*)p); #endif // !WORDS_BIGENDIAN if (trace) { diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 6769760c5fa..c2fb6481cb0 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -169,7 +169,7 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.03.0007 April 30, 2015"; + char version[]= "Version 1.03.0007 June 03, 2015"; #if defined(__WIN__) char compver[]= "Version 1.03.0007 " __DATE__ " " __TIME__; char slash= '\\'; From 2b2c61cc794954ce179e7ef468ee6b57becc287f Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 5 Jun 2015 17:21:04 +0200 Subject: [PATCH 17/39] Commit changes to json_udf.inc --- storage/connect/mysql-test/connect/t/json_udf.inc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/storage/connect/mysql-test/connect/t/json_udf.inc b/storage/connect/mysql-test/connect/t/json_udf.inc index c8b0487d6a7..098fff3663e 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.inc +++ b/storage/connect/mysql-test/connect/t/json_udf.inc @@ -5,6 +5,9 @@ if (`SELECT @@have_dynamic_loading != 'YES'`) { --skip UDF requires dynamic loading } +if (!$HA_CONNECT_SO) { + --skip Needs a dynamically built ha_connect.so +} let $is_win = `select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows")`; From 5d038d373489217f748e5068f6b6357c83fb051a Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 5 Jun 2015 23:33:23 +0200 Subject: [PATCH 18/39] commit win/ changes --- win/packaging/COPYING.rtf | 122 +- win/packaging/CPackWixConfig.cmake | 242 +-- win/packaging/ca/CustomAction.cpp | 84 +- win/packaging/custom_ui.wxs | 364 ++-- win/packaging/extra.wxs.in | 1826 ++++++++--------- win/packaging/heidisql.cmake | 46 +- win/packaging/heidisql.wxi.in | 102 +- win/packaging/heidisql_feature.wxi.in | 20 +- win/packaging/mysql_server.wxs.in | 178 +- win/upgrade_wizard/stdafx.h | 94 +- win/upgrade_wizard/targetver.h | 16 +- win/upgrade_wizard/upgrade.cpp | 114 +- win/upgrade_wizard/upgrade.h | 62 +- win/upgrade_wizard/upgrade.rc | 296 +-- win/upgrade_wizard/upgradeDlg.h | 146 +- .../upgrade_wizard.exe.manifest | 28 +- 16 files changed, 1870 insertions(+), 1870 deletions(-) diff --git a/win/packaging/COPYING.rtf b/win/packaging/COPYING.rtf index de1f0bbefde..9370fbcaa0c 100644 --- a/win/packaging/COPYING.rtf +++ b/win/packaging/COPYING.rtf @@ -1,61 +1,61 @@ -{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fcharset0 Arial;}} -{\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}} -\viewkind4\uc1\pard\s2\sb100\sa100\b\f0\fs24 GNU GENERAL PUBLIC LICENSE\par -\pard\sb100\sa100\b0\fs20 Version 2, June 1991 \par -\pard Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\fs24 \par -\pard\s2\sb100\sa100\b Preamble\par -\pard\sb100\sa100\b0\fs20 The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. \par -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. \par -To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. \par -For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. \par -We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. \par -Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. \par -Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. \par -The precise terms and conditions for copying, distribution and modification follow.\fs24 \par -\pard\s2\sb100\sa100\b TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par -\pard\sb100\sa100\b0\fs20 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". \par -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. \par -1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. \par -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. \par -2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: \par -\pard\fi-360\li720\sb100\sa100\tx720\f1\'b7\tab\f0 a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. \par -\pard\fi-360\li720\sb100\sa100\f1\'b7\tab\f0 b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. \par -\f1\'b7\tab\f0 c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) \par -\pard These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. \par -\pard\sb100\sa100 Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. \par -In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. \par -3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: \par -\pard\fi-360\li720\sb100\sa100\tx720\f1\'b7\tab\f0 a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \par -\pard\fi-360\li720\sb100\sa100\f1\'b7\tab\f0 b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \par -\f1\'b7\tab\f0 c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) \par -\pard The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. \par -\pard\sb100\sa100 If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. \par -4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. \par -5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. \par -6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. \par -7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. \par -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. \par -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. \par -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. \par -8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. \par -9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. \par -Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. \par -10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. \par -NO WARRANTY \par -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. \par -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \par -\pard\s2\sb100\sa100\b\fs24 END OF TERMS AND CONDITIONS \par -How to Apply These Terms to Your New Programs\fs20\par -\pard\sb100\sa100\b0 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. \par -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. \par -\pard one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. \par -\pard\sb100\sa100 Also add information on how to contact you by electronic and paper mail. \par -If the program is interactive, make it output a short notice like this when it starts in an interactive mode: \par -\pard Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. \par -\pard\sb100\sa100 The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c' ; they could even be mouse-clicks or menu items--whatever suits your program. \par -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: \par -\pard Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon , 1 April 1989 Ty Coon, President of Vice \par -\pard\sb100\sa100 This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.\par -\pard\f2\par -} - +{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fcharset0 Arial;}} +{\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}} +\viewkind4\uc1\pard\s2\sb100\sa100\b\f0\fs24 GNU GENERAL PUBLIC LICENSE\par +\pard\sb100\sa100\b0\fs20 Version 2, June 1991 \par +\pard Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.\fs24 \par +\pard\s2\sb100\sa100\b Preamble\par +\pard\sb100\sa100\b0\fs20 The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. \par +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. \par +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. \par +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. \par +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. \par +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. \par +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. \par +The precise terms and conditions for copying, distribution and modification follow.\fs24 \par +\pard\s2\sb100\sa100\b TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par +\pard\sb100\sa100\b0\fs20 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". \par +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. \par +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. \par +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. \par +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: \par +\pard\fi-360\li720\sb100\sa100\tx720\f1\'b7\tab\f0 a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. \par +\pard\fi-360\li720\sb100\sa100\f1\'b7\tab\f0 b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. \par +\f1\'b7\tab\f0 c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) \par +\pard These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. \par +\pard\sb100\sa100 Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. \par +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. \par +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: \par +\pard\fi-360\li720\sb100\sa100\tx720\f1\'b7\tab\f0 a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \par +\pard\fi-360\li720\sb100\sa100\f1\'b7\tab\f0 b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, \par +\f1\'b7\tab\f0 c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) \par +\pard The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. \par +\pard\sb100\sa100 If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. \par +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. \par +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. \par +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. \par +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. \par +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. \par +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. \par +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. \par +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. \par +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. \par +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. \par +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. \par +NO WARRANTY \par +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. \par +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. \par +\pard\s2\sb100\sa100\b\fs24 END OF TERMS AND CONDITIONS \par +How to Apply These Terms to Your New Programs\fs20\par +\pard\sb100\sa100\b0 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. \par +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. \par +\pard one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. \par +\pard\sb100\sa100 Also add information on how to contact you by electronic and paper mail. \par +If the program is interactive, make it output a short notice like this when it starts in an interactive mode: \par +\pard Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. \par +\pard\sb100\sa100 The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c' ; they could even be mouse-clicks or menu items--whatever suits your program. \par +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: \par +\pard Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. signature of Ty Coon , 1 April 1989 Ty Coon, President of Vice \par +\pard\sb100\sa100 This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.\par +\pard\f2\par +} + diff --git a/win/packaging/CPackWixConfig.cmake b/win/packaging/CPackWixConfig.cmake index d6fcf963ce3..474c207891c 100644 --- a/win/packaging/CPackWixConfig.cmake +++ b/win/packaging/CPackWixConfig.cmake @@ -1,121 +1,121 @@ - -IF(ESSENTIALS) - SET(CPACK_COMPONENTS_USED "Server;Client") - SET(CPACK_WIX_UI "MyWixUI_Mondo") - IF(CMAKE_SIZEOF_VOID_P MATCHES 8) - SET(CPACK_PACKAGE_FILE_NAME "mariadb-essential-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-winx64") - ELSE() - SET(CPACK_PACKAGE_FILE_NAME "mariadb-essential-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-win32") - ENDIF() -ELSE() - SET(CPACK_COMPONENTS_USED - "Server;Client;Development;SharedLibraries;Embedded;Documentation;IniFiles;Readme;Debuginfo;Common;connect-engine") -ENDIF() - -SET( WIX_FEATURE_MySQLServer_EXTRA_FEATURES "DBInstance;SharedClientServerComponents") -# Some components like Embedded are optional -# We will build MSI without embedded if it was not selected for build -#(need to modify CPACK_COMPONENTS_ALL for that) -SET(CPACK_ALL) -FOREACH(comp1 ${CPACK_COMPONENTS_USED}) - SET(found) - FOREACH(comp2 ${CPACK_COMPONENTS_ALL}) - IF(comp1 STREQUAL comp2) - SET(found 1) - BREAK() - ENDIF() - ENDFOREACH() - IF(found) - SET(CPACK_ALL ${CPACK_ALL} ${comp1}) - ENDIF() -ENDFOREACH() -SET(CPACK_COMPONENTS_ALL ${CPACK_ALL}) - -# Always install (hidden), includes Readme files -SET(CPACK_COMPONENT_GROUP_ALWAYSINSTALL_HIDDEN 1) -SET(CPACK_COMPONENT_README_GROUP "AlwaysInstall") -SET(CPACK_COMPONENT_COMMON_GROUP "AlwaysInstall") - -# Feature MySQL Server -SET(CPACK_COMPONENT_GROUP_MYSQLSERVER_DISPLAY_NAME "MariaDB Server") -SET(CPACK_COMPONENT_GROUP_MYSQLSERVER_EXPANDED "1") -SET(CPACK_COMPONENT_GROUP_MYSQLSERVER_DESCRIPTION "Install server") - # Subfeature "Server" (hidden) - SET(CPACK_COMPONENT_SERVER_GROUP "MySQLServer") - SET(CPACK_COMPONENT_SERVER_HIDDEN 1) - # Subfeature "Client" - SET(CPACK_COMPONENT_CLIENT_GROUP "MySQLServer") - SET(CPACK_COMPONENT_CLIENT_DISPLAY_NAME "Client Programs") - SET(CPACK_COMPONENT_CLIENT_DESCRIPTION - "Various helpful (commandline) tools including the mysql command line client" ) - # Subfeature "Debug binaries" - SET(CPACK_COMPONENT_DEBUGBINARIES_GROUP "MySQLServer") - SET(CPACK_COMPONENT_DEBUGBINARIES_DISPLAY_NAME "Debug binaries") - SET(CPACK_COMPONENT_DEBUGBINARIES_DESCRIPTION - "Debug/trace versions of executables and libraries" ) - #SET(CPACK_COMPONENT_DEBUGBINARIES_WIX_LEVEL 2) - - - #Subfeature "Data Files" - SET(CPACK_COMPONENT_DATAFILES_GROUP "MySQLServer") - SET(CPACK_COMPONENT_DATAFILES_DISPLAY_NAME "Server data files") - SET(CPACK_COMPONENT_DATAFILES_DESCRIPTION "Server data files" ) - SET(CPACK_COMPONENT_DATAFILES_HIDDEN 1) - - #Subfeature "Connect Engine" - SET(CPACK_COMPONENT_CONNECT-ENGINE_GROUP "MySQLServer") - SET(CPACK_COMPONENT_CONNECT-ENGINE_DISPLAY_NAME "Server data files") - SET(CPACK_COMPONENT_CONNECT-ENGINE_DESCRIPTION "Server data files" ) - SET(CPACK_COMPONENT_CONNECT-ENGINE_HIDDEN 1) - - -#Feature "Devel" -SET(CPACK_COMPONENT_GROUP_DEVEL_DISPLAY_NAME "Development Components") -SET(CPACK_COMPONENT_GROUP_DEVEL_DESCRIPTION "Installs C/C++ header files and libraries") - #Subfeature "Development" - SET(CPACK_COMPONENT_DEVELOPMENT_GROUP "Devel") - SET(CPACK_COMPONENT_DEVELOPMENT_HIDDEN 1) - - #Subfeature "Shared libraries" - SET(CPACK_COMPONENT_SHAREDLIBRARIES_GROUP "Devel") - SET(CPACK_COMPONENT_SHAREDLIBRARIES_DISPLAY_NAME "Client C API library (shared)") - SET(CPACK_COMPONENT_SHAREDLIBRARIES_DESCRIPTION "Installs shared client library") - - #Subfeature "Embedded" - SET(CPACK_COMPONENT_EMBEDDED_GROUP "Devel") - SET(CPACK_COMPONENT_EMBEDDED_DISPLAY_NAME "Embedded server library") - SET(CPACK_COMPONENT_EMBEDDED_DESCRIPTION "Installs embedded server library") - SET(CPACK_COMPONENT_EMBEDDED_WIX_LEVEL 2) - -#Feature Debug Symbols -SET(CPACK_COMPONENT_GROUP_DEBUGSYMBOLS_DISPLAY_NAME "Debug Symbols") -SET(CPACK_COMPONENT_GROUP_DEBUGSYMBOLS_DESCRIPTION "Installs Debug Symbols") -SET(CPACK_COMPONENT_DEBUGSYMBOLS_WIX_LEVEL 2) - SET(CPACK_COMPONENT_DEBUGINFO_GROUP "DebugSymbols") - SET(CPACK_COMPONENT_DEBUGINFO_HIDDEN 1) - -#Feature Documentation -SET(CPACK_COMPONENT_DOCUMENTATION_DISPLAY_NAME "Documentation") -SET(CPACK_COMPONENT_DOCUMENTATION_DESCRIPTION "Installs documentation") -SET(CPACK_COMPONENT_DOCUMENTATION_WIX_LEVEL 2) - -#Feature tests -SET(CPACK_COMPONENT_TEST_DISPLAY_NAME "Tests") -SET(CPACK_COMPONENT_TEST_DESCRIPTION "Installs unittests (requires Perl to run)") -SET(CPACK_COMPONENT_TEST_WIX_LEVEL 2) - - -#Feature Misc (hidden, installs only if everything is installed) -SET(CPACK_COMPONENT_GROUP_MISC_HIDDEN 1) -SET(CPACK_COMPONENT_GROUP_MISC_WIX_LEVEL 100) - SET(CPACK_COMPONENT_INIFILES_GROUP "Misc") - SET(CPACK_COMPONENT_SERVER_SCRIPTS_GROUP "Misc") - -#Add Firewall exception for mysqld.exe -SET(bin.mysqld.exe.FILE_EXTRA " - - " -) - + +IF(ESSENTIALS) + SET(CPACK_COMPONENTS_USED "Server;Client") + SET(CPACK_WIX_UI "MyWixUI_Mondo") + IF(CMAKE_SIZEOF_VOID_P MATCHES 8) + SET(CPACK_PACKAGE_FILE_NAME "mariadb-essential-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-winx64") + ELSE() + SET(CPACK_PACKAGE_FILE_NAME "mariadb-essential-${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}-win32") + ENDIF() +ELSE() + SET(CPACK_COMPONENTS_USED + "Server;Client;Development;SharedLibraries;Embedded;Documentation;IniFiles;Readme;Debuginfo;Common;connect-engine") +ENDIF() + +SET( WIX_FEATURE_MySQLServer_EXTRA_FEATURES "DBInstance;SharedClientServerComponents") +# Some components like Embedded are optional +# We will build MSI without embedded if it was not selected for build +#(need to modify CPACK_COMPONENTS_ALL for that) +SET(CPACK_ALL) +FOREACH(comp1 ${CPACK_COMPONENTS_USED}) + SET(found) + FOREACH(comp2 ${CPACK_COMPONENTS_ALL}) + IF(comp1 STREQUAL comp2) + SET(found 1) + BREAK() + ENDIF() + ENDFOREACH() + IF(found) + SET(CPACK_ALL ${CPACK_ALL} ${comp1}) + ENDIF() +ENDFOREACH() +SET(CPACK_COMPONENTS_ALL ${CPACK_ALL}) + +# Always install (hidden), includes Readme files +SET(CPACK_COMPONENT_GROUP_ALWAYSINSTALL_HIDDEN 1) +SET(CPACK_COMPONENT_README_GROUP "AlwaysInstall") +SET(CPACK_COMPONENT_COMMON_GROUP "AlwaysInstall") + +# Feature MySQL Server +SET(CPACK_COMPONENT_GROUP_MYSQLSERVER_DISPLAY_NAME "MariaDB Server") +SET(CPACK_COMPONENT_GROUP_MYSQLSERVER_EXPANDED "1") +SET(CPACK_COMPONENT_GROUP_MYSQLSERVER_DESCRIPTION "Install server") + # Subfeature "Server" (hidden) + SET(CPACK_COMPONENT_SERVER_GROUP "MySQLServer") + SET(CPACK_COMPONENT_SERVER_HIDDEN 1) + # Subfeature "Client" + SET(CPACK_COMPONENT_CLIENT_GROUP "MySQLServer") + SET(CPACK_COMPONENT_CLIENT_DISPLAY_NAME "Client Programs") + SET(CPACK_COMPONENT_CLIENT_DESCRIPTION + "Various helpful (commandline) tools including the mysql command line client" ) + # Subfeature "Debug binaries" + SET(CPACK_COMPONENT_DEBUGBINARIES_GROUP "MySQLServer") + SET(CPACK_COMPONENT_DEBUGBINARIES_DISPLAY_NAME "Debug binaries") + SET(CPACK_COMPONENT_DEBUGBINARIES_DESCRIPTION + "Debug/trace versions of executables and libraries" ) + #SET(CPACK_COMPONENT_DEBUGBINARIES_WIX_LEVEL 2) + + + #Subfeature "Data Files" + SET(CPACK_COMPONENT_DATAFILES_GROUP "MySQLServer") + SET(CPACK_COMPONENT_DATAFILES_DISPLAY_NAME "Server data files") + SET(CPACK_COMPONENT_DATAFILES_DESCRIPTION "Server data files" ) + SET(CPACK_COMPONENT_DATAFILES_HIDDEN 1) + + #Subfeature "Connect Engine" + SET(CPACK_COMPONENT_CONNECT-ENGINE_GROUP "MySQLServer") + SET(CPACK_COMPONENT_CONNECT-ENGINE_DISPLAY_NAME "Server data files") + SET(CPACK_COMPONENT_CONNECT-ENGINE_DESCRIPTION "Server data files" ) + SET(CPACK_COMPONENT_CONNECT-ENGINE_HIDDEN 1) + + +#Feature "Devel" +SET(CPACK_COMPONENT_GROUP_DEVEL_DISPLAY_NAME "Development Components") +SET(CPACK_COMPONENT_GROUP_DEVEL_DESCRIPTION "Installs C/C++ header files and libraries") + #Subfeature "Development" + SET(CPACK_COMPONENT_DEVELOPMENT_GROUP "Devel") + SET(CPACK_COMPONENT_DEVELOPMENT_HIDDEN 1) + + #Subfeature "Shared libraries" + SET(CPACK_COMPONENT_SHAREDLIBRARIES_GROUP "Devel") + SET(CPACK_COMPONENT_SHAREDLIBRARIES_DISPLAY_NAME "Client C API library (shared)") + SET(CPACK_COMPONENT_SHAREDLIBRARIES_DESCRIPTION "Installs shared client library") + + #Subfeature "Embedded" + SET(CPACK_COMPONENT_EMBEDDED_GROUP "Devel") + SET(CPACK_COMPONENT_EMBEDDED_DISPLAY_NAME "Embedded server library") + SET(CPACK_COMPONENT_EMBEDDED_DESCRIPTION "Installs embedded server library") + SET(CPACK_COMPONENT_EMBEDDED_WIX_LEVEL 2) + +#Feature Debug Symbols +SET(CPACK_COMPONENT_GROUP_DEBUGSYMBOLS_DISPLAY_NAME "Debug Symbols") +SET(CPACK_COMPONENT_GROUP_DEBUGSYMBOLS_DESCRIPTION "Installs Debug Symbols") +SET(CPACK_COMPONENT_DEBUGSYMBOLS_WIX_LEVEL 2) + SET(CPACK_COMPONENT_DEBUGINFO_GROUP "DebugSymbols") + SET(CPACK_COMPONENT_DEBUGINFO_HIDDEN 1) + +#Feature Documentation +SET(CPACK_COMPONENT_DOCUMENTATION_DISPLAY_NAME "Documentation") +SET(CPACK_COMPONENT_DOCUMENTATION_DESCRIPTION "Installs documentation") +SET(CPACK_COMPONENT_DOCUMENTATION_WIX_LEVEL 2) + +#Feature tests +SET(CPACK_COMPONENT_TEST_DISPLAY_NAME "Tests") +SET(CPACK_COMPONENT_TEST_DESCRIPTION "Installs unittests (requires Perl to run)") +SET(CPACK_COMPONENT_TEST_WIX_LEVEL 2) + + +#Feature Misc (hidden, installs only if everything is installed) +SET(CPACK_COMPONENT_GROUP_MISC_HIDDEN 1) +SET(CPACK_COMPONENT_GROUP_MISC_WIX_LEVEL 100) + SET(CPACK_COMPONENT_INIFILES_GROUP "Misc") + SET(CPACK_COMPONENT_SERVER_SCRIPTS_GROUP "Misc") + +#Add Firewall exception for mysqld.exe +SET(bin.mysqld.exe.FILE_EXTRA " + + " +) + diff --git a/win/packaging/ca/CustomAction.cpp b/win/packaging/ca/CustomAction.cpp index 67a17c2cc19..17bfca1debb 100644 --- a/win/packaging/ca/CustomAction.cpp +++ b/win/packaging/ca/CustomAction.cpp @@ -104,48 +104,48 @@ static void EscapeCommandLine(const wchar_t *in, wchar_t *out, size_t buflen) } pos= 0; - for(int i = 0 ; ; i++) - { - size_t n_backslashes = 0; - wchar_t c; - while (in[i] == L'\\') - { - i++; - n_backslashes++; - } - - c= in[i]; - if (c == 0) - { - /* - Escape all backslashes, but let the terminating double quotation mark - that caller adds be interpreted as a metacharacter. - */ - for(size_t j= 0; j < 2*n_backslashes;j++) - { - out[pos++]=L'\\'; - } - break; - } - else if (c == L'"') - { - /* - Escape all backslashes and the following double quotation mark. - */ - for(size_t j= 0; j < 2*n_backslashes + 1; j++) - { - out[pos++]=L'\\'; - } - out[pos++]= L'"'; - } - else - { - /* Backslashes aren't special here. */ - for (size_t j=0; j < n_backslashes; j++) - out[pos++] = L'\\'; - - out[pos++]= c; - } + for(int i = 0 ; ; i++) + { + size_t n_backslashes = 0; + wchar_t c; + while (in[i] == L'\\') + { + i++; + n_backslashes++; + } + + c= in[i]; + if (c == 0) + { + /* + Escape all backslashes, but let the terminating double quotation mark + that caller adds be interpreted as a metacharacter. + */ + for(size_t j= 0; j < 2*n_backslashes;j++) + { + out[pos++]=L'\\'; + } + break; + } + else if (c == L'"') + { + /* + Escape all backslashes and the following double quotation mark. + */ + for(size_t j= 0; j < 2*n_backslashes + 1; j++) + { + out[pos++]=L'\\'; + } + out[pos++]= L'"'; + } + else + { + /* Backslashes aren't special here. */ + for (size_t j=0; j < n_backslashes; j++) + out[pos++] = L'\\'; + + out[pos++]= c; + } } out[pos++]= 0; } diff --git a/win/packaging/custom_ui.wxs b/win/packaging/custom_ui.wxs index 8a87fb4d246..70fa3ba3abd 100644 --- a/win/packaging/custom_ui.wxs +++ b/win/packaging/custom_ui.wxs @@ -1,183 +1,183 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - - - - - - - 1 - - - - Create default [ProductName] instance - - - - {\WixUI_Font_Title}Default instance properties - - - - - - - Service '[SERVICENAME]' will be removed - - - - Remove default database directory '[DATABASELOCATION]' - - - - - 1 - - - 1 - - - 1 - - - - Remove default [ProductName] database - - - - {\WixUI_Font_Title}Default instance properties - - - - - - - - - - 1 - 1 - - - - WixUI_InstallMode = "Change" - !DBInstance=3 - WixUI_InstallMode = "Remove" - - - - - - - - - - - - - - - - - - SERVICENAME - - - - - - - - - - - - Running mysql_install_db.exe - - - - - - - - - - - - - - - - - - - - - - - - CMDLINE_SERVICENAME - - CMDLINE_DATABASELOCATION - - - - CMDLINE_SERVICENAME - - CMDLINE_DATABASELOCATION - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + + + + 1 + + + + Create default [ProductName] instance + + + + {\WixUI_Font_Title}Default instance properties + + + + + + + Service '[SERVICENAME]' will be removed + + + + Remove default database directory '[DATABASELOCATION]' + + + + + 1 + + + 1 + + + 1 + + + + Remove default [ProductName] database + + + + {\WixUI_Font_Title}Default instance properties + + + + + + + + + + 1 + 1 + + + + WixUI_InstallMode = "Change" + !DBInstance=3 + WixUI_InstallMode = "Remove" + + + + + + + + + + + + + + + + + + SERVICENAME + + + + + + + + + + + + Running mysql_install_db.exe + + + + + + + + + + + + + + + + + + + + + + + + CMDLINE_SERVICENAME + + CMDLINE_DATABASELOCATION + + + + CMDLINE_SERVICENAME + + CMDLINE_DATABASELOCATION + + \ No newline at end of file diff --git a/win/packaging/extra.wxs.in b/win/packaging/extra.wxs.in index d8c89f005b2..3425a76427b 100644 --- a/win/packaging/extra.wxs.in +++ b/win/packaging/extra.wxs.in @@ -1,913 +1,913 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win/packaging/heidisql.cmake b/win/packaging/heidisql.cmake index e429907cb2e..7893fb1f54e 100644 --- a/win/packaging/heidisql.cmake +++ b/win/packaging/heidisql.cmake @@ -1,23 +1,23 @@ -SET(HEIDISQL_BASE_NAME "HeidiSQL_8.3_Portable") -SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip") -SET(HEIDISQL_URL "http://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}") -SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME}) - -IF(NOT EXISTS ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP}) - MAKE_DIRECTORY(${HEIDISQL_DOWNLOAD_DIR}) - MESSAGE(STATUS "Downloading ${HEIDISQL_URL} to ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP}") - FILE(DOWNLOAD ${HEIDISQL_URL} ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP} TIMEOUT 60) - EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E chdir ${HEIDISQL_DOWNLOAD_DIR} - ${CMAKE_COMMAND} -E tar xfz ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP} - ) -ENDIF() - -SET(LIBMYSQLDLL_SOURCE ${HEIDISQL_DOWNLOAD_DIR}/libmysql.dll) -IF(CMAKE_SIZEOF_VOID_P EQUAL 4) - # Use our libmysql if it is 32 bit. - IF(LIBMYSQL_LOCATION) - SET(LIBMYSQLDLL_SOURCE "${LIBMYSQL_LOCATION}") - ENDIF() -ENDIF() -CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql.wxi) -CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql_feature.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql_feature.wxi) +SET(HEIDISQL_BASE_NAME "HeidiSQL_8.3_Portable") +SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip") +SET(HEIDISQL_URL "http://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}") +SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME}) + +IF(NOT EXISTS ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP}) + MAKE_DIRECTORY(${HEIDISQL_DOWNLOAD_DIR}) + MESSAGE(STATUS "Downloading ${HEIDISQL_URL} to ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP}") + FILE(DOWNLOAD ${HEIDISQL_URL} ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP} TIMEOUT 60) + EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E chdir ${HEIDISQL_DOWNLOAD_DIR} + ${CMAKE_COMMAND} -E tar xfz ${HEIDISQL_DOWNLOAD_DIR}/${HEIDISQL_ZIP} + ) +ENDIF() + +SET(LIBMYSQLDLL_SOURCE ${HEIDISQL_DOWNLOAD_DIR}/libmysql.dll) +IF(CMAKE_SIZEOF_VOID_P EQUAL 4) + # Use our libmysql if it is 32 bit. + IF(LIBMYSQL_LOCATION) + SET(LIBMYSQLDLL_SOURCE "${LIBMYSQL_LOCATION}") + ENDIF() +ENDIF() +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql.wxi) +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/heidisql_feature.wxi.in ${CMAKE_CURRENT_BINARY_DIR}/heidisql_feature.wxi) diff --git a/win/packaging/heidisql.wxi.in b/win/packaging/heidisql.wxi.in index 1e6e3d552a8..4df8d7cc914 100644 --- a/win/packaging/heidisql.wxi.in +++ b/win/packaging/heidisql.wxi.in @@ -1,51 +1,51 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - HEIDISQLINSTALLED - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + HEIDISQLINSTALLED + + + + + + + + + + + + + diff --git a/win/packaging/heidisql_feature.wxi.in b/win/packaging/heidisql_feature.wxi.in index 3f60fcd8f27..241554e035a 100644 --- a/win/packaging/heidisql_feature.wxi.in +++ b/win/packaging/heidisql_feature.wxi.in @@ -1,10 +1,10 @@ - - - HEIDISQLINSTALLED AND NOT REMOVE ~= ALL - - - + + + HEIDISQLINSTALLED AND NOT REMOVE ~= ALL + + + diff --git a/win/packaging/mysql_server.wxs.in b/win/packaging/mysql_server.wxs.in index 79fde801cf5..c10116830e7 100644 --- a/win/packaging/mysql_server.wxs.in +++ b/win/packaging/mysql_server.wxs.in @@ -1,89 +1,89 @@ - - - - - - - - - - - - - - - - NOT NEWERVERSIONDETECTED OR Installed - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @CPACK_WIX_FEATURES@ - - - @CPACK_WIX_DIRECTORIES@ - - - @CPACK_WIX_COMPONENTS@ - - - @CPACK_WIX_COMPONENT_GROUPS@ - - - @CPACK_WIX_INCLUDES@ - - - + + + + + + + + + + + + + + + + NOT NEWERVERSIONDETECTED OR Installed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @CPACK_WIX_FEATURES@ + + + @CPACK_WIX_DIRECTORIES@ + + + @CPACK_WIX_COMPONENTS@ + + + @CPACK_WIX_COMPONENT_GROUPS@ + + + @CPACK_WIX_INCLUDES@ + + + diff --git a/win/upgrade_wizard/stdafx.h b/win/upgrade_wizard/stdafx.h index 87db7036005..55f9e71ed70 100644 --- a/win/upgrade_wizard/stdafx.h +++ b/win/upgrade_wizard/stdafx.h @@ -1,47 +1,47 @@ - -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, -// but are changed infrequently - -#pragma once - -#ifndef _SECURE_ATL -#define _SECURE_ATL 1 -#endif - -#ifndef VC_EXTRALEAN -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers -#endif - -#include "targetver.h" - -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit - -// turns off MFC's hiding of some common and often safely ignored warning messages -#define _AFX_ALL_WARNINGS - -#include // MFC core and standard components -#include // MFC extensions - - - - - -#ifndef _AFX_NO_OLE_SUPPORT -#include // MFC support for Internet Explorer 4 Common Controls -#endif -#ifndef _AFX_NO_AFXCMN_SUPPORT -#include // MFC support for Windows Common Controls -#endif // _AFX_NO_AFXCMN_SUPPORT - - - - - - - - - - - - + +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently + +#pragma once + +#ifndef _SECURE_ATL +#define _SECURE_ATL 1 +#endif + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers +#endif + +#include "targetver.h" + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit + +// turns off MFC's hiding of some common and often safely ignored warning messages +#define _AFX_ALL_WARNINGS + +#include // MFC core and standard components +#include // MFC extensions + + + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // MFC support for Internet Explorer 4 Common Controls +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC support for Windows Common Controls +#endif // _AFX_NO_AFXCMN_SUPPORT + + + + + + + + + + + + diff --git a/win/upgrade_wizard/targetver.h b/win/upgrade_wizard/targetver.h index 90e767bfce7..87c0086de75 100644 --- a/win/upgrade_wizard/targetver.h +++ b/win/upgrade_wizard/targetver.h @@ -1,8 +1,8 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include +#pragma once + +// Including SDKDDKVer.h defines the highest available Windows platform. + +// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and +// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. + +#include diff --git a/win/upgrade_wizard/upgrade.cpp b/win/upgrade_wizard/upgrade.cpp index aa9efa15ecc..ea2f894c73e 100644 --- a/win/upgrade_wizard/upgrade.cpp +++ b/win/upgrade_wizard/upgrade.cpp @@ -1,57 +1,57 @@ - -// upgrade.cpp : Defines the class behaviors for the application. -// - -#include "stdafx.h" -#include "upgrade.h" -#include "upgradeDlg.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#endif - - -// CUpgradeApp - -BEGIN_MESSAGE_MAP(CUpgradeApp, CWinApp) - ON_COMMAND(ID_HELP, &CWinApp::OnHelp) -END_MESSAGE_MAP() - - -// CUpgradeApp construction - -CUpgradeApp::CUpgradeApp() -{ - // TODO: add construction code here, - // Place all significant initialization in InitInstance -} - - -// The one and only CUpgradeApp object - -CUpgradeApp theApp; - - -// CUpgradeApp initialization - -BOOL CUpgradeApp::InitInstance() -{ - // InitCommonControlsEx() is required on Windows XP if an application - // manifest specifies use of ComCtl32.dll version 6 or later to enable - // visual styles. Otherwise, any window creation will fail. - INITCOMMONCONTROLSEX InitCtrls; - InitCtrls.dwSize = sizeof(InitCtrls); - // Set this to include all the common control classes you want to use - // in your application. - InitCtrls.dwICC = ICC_WIN95_CLASSES; - - InitCommonControlsEx(&InitCtrls); - CWinApp::InitInstance(); - CUpgradeDlg dlg; - m_pMainWnd = &dlg; - dlg.DoModal(); - // Since the dialog has been closed, return FALSE so that we exit the - // application, rather than start the application's message pump. - return FALSE; -} - + +// upgrade.cpp : Defines the class behaviors for the application. +// + +#include "stdafx.h" +#include "upgrade.h" +#include "upgradeDlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CUpgradeApp + +BEGIN_MESSAGE_MAP(CUpgradeApp, CWinApp) + ON_COMMAND(ID_HELP, &CWinApp::OnHelp) +END_MESSAGE_MAP() + + +// CUpgradeApp construction + +CUpgradeApp::CUpgradeApp() +{ + // TODO: add construction code here, + // Place all significant initialization in InitInstance +} + + +// The one and only CUpgradeApp object + +CUpgradeApp theApp; + + +// CUpgradeApp initialization + +BOOL CUpgradeApp::InitInstance() +{ + // InitCommonControlsEx() is required on Windows XP if an application + // manifest specifies use of ComCtl32.dll version 6 or later to enable + // visual styles. Otherwise, any window creation will fail. + INITCOMMONCONTROLSEX InitCtrls; + InitCtrls.dwSize = sizeof(InitCtrls); + // Set this to include all the common control classes you want to use + // in your application. + InitCtrls.dwICC = ICC_WIN95_CLASSES; + + InitCommonControlsEx(&InitCtrls); + CWinApp::InitInstance(); + CUpgradeDlg dlg; + m_pMainWnd = &dlg; + dlg.DoModal(); + // Since the dialog has been closed, return FALSE so that we exit the + // application, rather than start the application's message pump. + return FALSE; +} + diff --git a/win/upgrade_wizard/upgrade.h b/win/upgrade_wizard/upgrade.h index 26c107b6ee8..b5dd10e72e7 100644 --- a/win/upgrade_wizard/upgrade.h +++ b/win/upgrade_wizard/upgrade.h @@ -1,32 +1,32 @@ - -// zzz.h : main header file for the PROJECT_NAME application -// - -#pragma once - -#ifndef __AFXWIN_H__ - #error "include 'stdafx.h' before including this file for PCH" -#endif - -#include "resource.h" // main symbols - - -// CzzzApp: -// See zzz.cpp for the implementation of this class -// - -class CUpgradeApp : public CWinApp -{ -public: - CUpgradeApp(); - -// Overrides -public: - virtual BOOL InitInstance(); - -// Implementation - - DECLARE_MESSAGE_MAP() -}; - + +// zzz.h : main header file for the PROJECT_NAME application +// + +#pragma once + +#ifndef __AFXWIN_H__ + #error "include 'stdafx.h' before including this file for PCH" +#endif + +#include "resource.h" // main symbols + + +// CzzzApp: +// See zzz.cpp for the implementation of this class +// + +class CUpgradeApp : public CWinApp +{ +public: + CUpgradeApp(); + +// Overrides +public: + virtual BOOL InitInstance(); + +// Implementation + + DECLARE_MESSAGE_MAP() +}; + extern CUpgradeApp theApp; \ No newline at end of file diff --git a/win/upgrade_wizard/upgrade.rc b/win/upgrade_wizard/upgrade.rc index 30656651b79..dbba9f67e89 100644 --- a/win/upgrade_wizard/upgrade.rc +++ b/win/upgrade_wizard/upgrade.rc @@ -1,148 +1,148 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#ifndef APSTUDIO_INVOKED -#include "targetver.h" -#endif -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#ifndef APSTUDIO_INVOKED\r\n" - "#include ""targetver.h""\r\n" - "#endif\r\n" - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "#define _AFX_NO_SPLITTER_RESOURCES\r\n" - "#define _AFX_NO_OLE_RESOURCES\r\n" - "#define _AFX_NO_TRACKER_RESOURCES\r\n" - "#define _AFX_NO_PROPERTY_RESOURCES\r\n" - "\r\n" - "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" - "LANGUAGE 9, 1\r\n" - "#include ""res\\upgrade.rc2"" // non-Microsoft Visual C++ edited resources\r\n" - "#include ""afxres.rc"" // Standard components\r\n" - "#endif\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDR_MAINFRAME ICON "res\\upgrade.ico" -#endif // German (Germany) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_UPGRADE_DIALOG DIALOGEX 0, 0, 320, 200 -STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_APPWINDOW -CAPTION "MariaDB Upgrade Wizard" -FONT 8, "MS Shell Dlg" -BEGIN - DEFPUSHBUTTON "OK",IDOK,113,169,50,14 - PUSHBUTTON "Cancel",IDCANCEL,191,169,50,14 - LISTBOX IDC_LIST1,24,39,216,80,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP - EDITTEXT IDC_EDIT1,97,124,193,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER - EDITTEXT IDC_EDIT2,98,138,181,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER - CONTROL "",IDC_PROGRESS1,"msctls_progress32",PBS_SMOOTH | WS_BORDER,26,153,243,14 - EDITTEXT IDC_EDIT3,98,151,40,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER - EDITTEXT IDC_EDIT7,27,124,65,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER - EDITTEXT IDC_EDIT8,27,137,62,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER - EDITTEXT IDC_EDIT9,27,151,62,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER - PUSHBUTTON "Select all",IDC_BUTTON1,245,61,50,14 - PUSHBUTTON "Clear all",IDC_BUTTON2,246,88,50,14 - LTEXT "Select services you want to upgrade and click on the [Upgrade] button.\nMake sure to backup data directories prior to upgrade.",IDC_STATIC,25,14,215,26 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_UPGRADE_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 313 - TOPMARGIN, 7 - BOTTOMMARGIN, 193 - END -END -#endif // APSTUDIO_INVOKED - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// -#define _AFX_NO_SPLITTER_RESOURCES -#define _AFX_NO_OLE_RESOURCES -#define _AFX_NO_TRACKER_RESOURCES -#define _AFX_NO_PROPERTY_RESOURCES - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE 9, 1 -#include "res\upgrade.rc2" // non-Microsoft Visual C++ edited resources -#include "afxres.rc" // Standard components -#endif - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#ifndef APSTUDIO_INVOKED +#include "targetver.h" +#endif +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#ifndef APSTUDIO_INVOKED\r\n" + "#include ""targetver.h""\r\n" + "#endif\r\n" + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "#define _AFX_NO_SPLITTER_RESOURCES\r\n" + "#define _AFX_NO_OLE_RESOURCES\r\n" + "#define _AFX_NO_TRACKER_RESOURCES\r\n" + "#define _AFX_NO_PROPERTY_RESOURCES\r\n" + "\r\n" + "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n" + "LANGUAGE 9, 1\r\n" + "#include ""res\\upgrade.rc2"" // non-Microsoft Visual C++ edited resources\r\n" + "#include ""afxres.rc"" // Standard components\r\n" + "#endif\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDR_MAINFRAME ICON "res\\upgrade.ico" +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_UPGRADE_DIALOG DIALOGEX 0, 0, 320, 200 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_APPWINDOW +CAPTION "MariaDB Upgrade Wizard" +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "OK",IDOK,113,169,50,14 + PUSHBUTTON "Cancel",IDCANCEL,191,169,50,14 + LISTBOX IDC_LIST1,24,39,216,80,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + EDITTEXT IDC_EDIT1,97,124,193,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_EDIT2,98,138,181,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + CONTROL "",IDC_PROGRESS1,"msctls_progress32",PBS_SMOOTH | WS_BORDER,26,153,243,14 + EDITTEXT IDC_EDIT3,98,151,40,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_EDIT7,27,124,65,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_EDIT8,27,137,62,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + EDITTEXT IDC_EDIT9,27,151,62,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER + PUSHBUTTON "Select all",IDC_BUTTON1,245,61,50,14 + PUSHBUTTON "Clear all",IDC_BUTTON2,246,88,50,14 + LTEXT "Select services you want to upgrade and click on the [Upgrade] button.\nMake sure to backup data directories prior to upgrade.",IDC_STATIC,25,14,215,26 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_UPGRADE_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 313 + TOPMARGIN, 7 + BOTTOMMARGIN, 193 + END +END +#endif // APSTUDIO_INVOKED + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +#define _AFX_NO_SPLITTER_RESOURCES +#define _AFX_NO_OLE_RESOURCES +#define _AFX_NO_TRACKER_RESOURCES +#define _AFX_NO_PROPERTY_RESOURCES + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE 9, 1 +#include "res\upgrade.rc2" // non-Microsoft Visual C++ edited resources +#include "afxres.rc" // Standard components +#endif + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/win/upgrade_wizard/upgradeDlg.h b/win/upgrade_wizard/upgradeDlg.h index 97243291748..636f94894a7 100644 --- a/win/upgrade_wizard/upgradeDlg.h +++ b/win/upgrade_wizard/upgradeDlg.h @@ -1,73 +1,73 @@ - -// upgradeDlg.h : header file -// - -#pragma once -#include "afxcmn.h" -#include "afxwin.h" -#include - - -// CUpgradeDlg dialog -class CUpgradeDlg : public CDialog -{ - // Construction -public: - CUpgradeDlg(CWnd* pParent = NULL); // standard constructor - - // Dialog Data - enum { IDD = IDD_UPGRADE_DIALOG }; - -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - // job object for current process and children - HANDLE m_JobObject; - - // Services are being upgraded - BOOL m_UpgradeRunning; - - // ProgressBar related: number of services to upgrade - int m_ProgressTotal; - - //ProgressBar related: current service being upgraded - int m_ProgressCurrent; - -protected: - HICON m_hIcon; - - // Generated message map functions - virtual BOOL OnInitDialog(); - void PopulateServicesList(); - afx_msg void OnPaint(); - afx_msg HCURSOR OnQueryDragIcon(); - DECLARE_MESSAGE_MAP() -public: - void SelectService(int index); - void UpgradeServices(); - void UpgradeOneService(const std::string& name); - void ErrorExit(const char *); - std::string m_InstallDir; - CCheckListBox m_Services; - CProgressCtrl m_Progress; - CButton m_Ok; - CButton m_Cancel; - CButton m_SelectAll; - CButton m_ClearAll; - int m_MajorVersion; - int m_MinorVersion; - int m_PatchVersion; - - CEdit m_IniFilePath; - afx_msg void OnLbnSelchangeList1(); - afx_msg void OnChkChange(); - CEdit m_DataDir; - CEdit m_Version; - afx_msg void OnBnClickedOk(); - afx_msg void OnBnClickedCancel(); - afx_msg void OnBnSelectAll(); - afx_msg void OnBnClearAll(); - CEdit m_IniFileLabel; - CEdit m_DataDirLabel; - CEdit m_VersionLabel; -}; + +// upgradeDlg.h : header file +// + +#pragma once +#include "afxcmn.h" +#include "afxwin.h" +#include + + +// CUpgradeDlg dialog +class CUpgradeDlg : public CDialog +{ + // Construction +public: + CUpgradeDlg(CWnd* pParent = NULL); // standard constructor + + // Dialog Data + enum { IDD = IDD_UPGRADE_DIALOG }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + // job object for current process and children + HANDLE m_JobObject; + + // Services are being upgraded + BOOL m_UpgradeRunning; + + // ProgressBar related: number of services to upgrade + int m_ProgressTotal; + + //ProgressBar related: current service being upgraded + int m_ProgressCurrent; + +protected: + HICON m_hIcon; + + // Generated message map functions + virtual BOOL OnInitDialog(); + void PopulateServicesList(); + afx_msg void OnPaint(); + afx_msg HCURSOR OnQueryDragIcon(); + DECLARE_MESSAGE_MAP() +public: + void SelectService(int index); + void UpgradeServices(); + void UpgradeOneService(const std::string& name); + void ErrorExit(const char *); + std::string m_InstallDir; + CCheckListBox m_Services; + CProgressCtrl m_Progress; + CButton m_Ok; + CButton m_Cancel; + CButton m_SelectAll; + CButton m_ClearAll; + int m_MajorVersion; + int m_MinorVersion; + int m_PatchVersion; + + CEdit m_IniFilePath; + afx_msg void OnLbnSelchangeList1(); + afx_msg void OnChkChange(); + CEdit m_DataDir; + CEdit m_Version; + afx_msg void OnBnClickedOk(); + afx_msg void OnBnClickedCancel(); + afx_msg void OnBnSelectAll(); + afx_msg void OnBnClearAll(); + CEdit m_IniFileLabel; + CEdit m_DataDirLabel; + CEdit m_VersionLabel; +}; diff --git a/win/upgrade_wizard/upgrade_wizard.exe.manifest b/win/upgrade_wizard/upgrade_wizard.exe.manifest index 6b40eebcbd9..ca89deae5c9 100644 --- a/win/upgrade_wizard/upgrade_wizard.exe.manifest +++ b/win/upgrade_wizard/upgrade_wizard.exe.manifest @@ -1,15 +1,15 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file From 7482f073ae8677e7fcfd2bb60087bd76dfc8a8d9 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 6 Jun 2015 19:23:06 +0200 Subject: [PATCH 19/39] Commit od last modifications made for version 10.0 --- .gitattributes | 6 +- .gitignore | 230 ++-------------------------------- storage/connect/colblk.cpp | 6 - storage/connect/filamdbf.cpp | 14 +-- storage/connect/filter.h | 4 - storage/connect/ha_connect.cc | 21 ---- storage/connect/json.cpp | 7 -- storage/connect/json.h | 3 - storage/connect/jsonudf.cpp | 8 -- storage/connect/rcmsg.c | 6 - storage/connect/tabjson.cpp | 10 -- storage/connect/tabxml.cpp | 17 --- storage/connect/value.h | 8 -- 13 files changed, 21 insertions(+), 319 deletions(-) diff --git a/.gitattributes b/.gitattributes index 24291691407..e2d8e1a836c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12,8 +12,10 @@ # Declare files that will always have LF line endings on checkout. *.result text eol=lf -storage/connect/mysql-test/connect/std_data/*.txt text eol=lf -storage/connect/mysql-test/connect/std_data/*.dat text eol=lf + +# Denote the files that should not be modified. +storage/connect/mysql-test/connect/std_data/*.txt binary +storage/connect/mysql-test/connect/std_data/*.dat binary # Denote all files that are truly binary and should not be modified. *.png binary diff --git a/.gitignore b/.gitignore index 0bc2dd6f1bb..0915fbaf23a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,226 +10,6 @@ *.ninja .ninja_* .gdb_history -errmsg.sys -typescript -CMakeCache.txt -CMakeFiles/ -MakeFile -cmake_install.cmake -install_manifest.txt -CPackConfig.cmake -CPackSourceConfig.cmake -CTestTestfile.cmake -Docs/INFO_BIN -Docs/INFO_SRC -Makefile -TAGS -Testing/ -VERSION.dep -configure -client/async_example -client/mysql -client/mysql_plugin -client/mysql_upgrade -client/mysqladmin -client/mysqlbinlog -client/mysqlcheck -client/mysqldump -client/mysqlimport -client/mysqlshow -client/mysqlslap -client/mysqltest -cmake_install.cmake -dbug/*.r -dbug/factorial -dbug/tests -dbug/user.ps -dbug/user.t -extra/comp_err -extra/innochecksum -extra/jemalloc/build/ -extra/jemalloc/tmp/ -extra/my_print_defaults -extra/mysql_waitpid -extra/perror -extra/replace -extra/resolve_stack_dump -extra/resolveip -import_executables.cmake -include/*.h.tmp -include/config.h -include/my_config.h -include/mysql_version.h -include/mysqld_ername.h -include/mysqld_error.h -include/sql_state.h -info_macros.cmake -libmysql*/libmysql*_exports_file.cc -libmysql*/merge_archives_mysql*.cmake -libmysql*/mysql*_depends.c -libmysql/libmysql_versions.ld -libmysqld/examples/mysql_client_test_embedded -libmysqld/examples/mysql_embedded -libmysqld/examples/mysqltest_embedded -make_dist.cmake -mariadb-*.*.*.tar.gz -mariadb-*.*.*/ -mysql-test/lib/My/SafeProcess/my_safe_process -mysql-test/mtr -mysql-test/mysql-test-run -mysql-test/var -mysys/thr_lock -mysys/thr_timer -packaging/rpm-oel/mysql.spec -packaging/rpm-uln/mysql.10.0.11.spec -packaging/solaris/postinstall-solaris -pcre/config.h -pcre/pcre*test.sh -pcre/pcre.h -pcre/pcre_chartables.c -pcre/pcregrep -pcre/pcretest -pcre/test*grep -scripts/comp_sql -scripts/make_binary_distribution -scripts/msql2mysql -scripts/mysql_config -scripts/mysql_config.pl -scripts/mysql_convert_table_format -scripts/mysql_find_rows -scripts/mysql_fix_extensions -scripts/mysql_fix_privilege_tables.sql -scripts/mysql_fix_privilege_tables_sql.c -scripts/mysql_install_db -scripts/mysql_secure_installation -scripts/mysql_setpermission -scripts/mysql_zap -scripts/mysqlaccess -scripts/mysqlbug -scripts/mysqld_multi -scripts/mysqld_safe -scripts/mysqldumpslow -scripts/mysqlhotcopy -scripts/mytop -scripts/wsrep_sst_common -scripts/wsrep_sst_mysqldump -scripts/wsrep_sst_rsync -scripts/wsrep_sst_xtrabackup -scripts/wsrep_sst_xtrabackup-v2 -sql-bench/bench-count-distinct -sql-bench/bench-init.pl -sql-bench/compare-results -sql-bench/copy-db -sql-bench/crash-me -sql-bench/graph-compare-results -sql-bench/innotest1 -sql-bench/innotest1a -sql-bench/innotest1b -sql-bench/innotest2 -sql-bench/innotest2a -sql-bench/innotest2b -sql-bench/run-all-tests -sql-bench/server-cfg -sql-bench/test-ATIS -sql-bench/test-alter-table -sql-bench/test-big-tables -sql-bench/test-connect -sql-bench/test-create -sql-bench/test-insert -sql-bench/test-select -sql-bench/test-table-elimination -sql-bench/test-transactions -sql-bench/test-wisconsin -sql/lex_token.h -sql/gen_lex_token -sql/gen_lex_hash -sql/lex_hash.h -sql/mysql_tzinfo_to_sql -sql/mysqld -sql/sql_builtin.cc -sql/sql_yacc.cc -sql/sql_yacc.h -storage/heap/hp_test1 -storage/heap/hp_test2 -storage/maria/aria_chk -storage/maria/aria_dump_log -storage/maria/aria_ftdump -storage/maria/aria_pack -storage/maria/aria_read_log -storage/maria/ma_rt_test -storage/maria/ma_sp_test -storage/maria/ma_test1 -storage/maria/ma_test2 -storage/maria/ma_test3 -storage/myisam/mi_test1 -storage/myisam/mi_test2 -storage/myisam/mi_test3 -storage/myisam/myisam_ftdump -storage/myisam/myisamchk -storage/myisam/myisamlog -storage/myisam/myisampack -storage/myisam/rt_test -storage/myisam/sp_test -storage/tokudb/ft-index/buildheader/db.h -storage/tokudb/ft-index/buildheader/make_tdb -storage/tokudb/ft-index/buildheader/runcat.sh -storage/tokudb/ft-index/ft/log_code.cc -storage/tokudb/ft-index/ft/log_header.h -storage/tokudb/ft-index/ft/log_print.cc -storage/tokudb/ft-index/ft/logformat -storage/tokudb/ft-index/ft/ftverify -storage/tokudb/ft-index/ft/tdb-recover -storage/tokudb/ft-index/ft/tdb_logprint -storage/tokudb/ft-index/ft/tokuftdump -storage/tokudb/ft-index/portability/merge_archives_tokuportability_static.cmake -storage/tokudb/ft-index/portability/toku_config.h -storage/tokudb/ft-index/portability/tokuportability_static_depends.cc -storage/tokudb/ft-index/src/merge_archives_tokufractaltree_static.cmake -storage/tokudb/ft-index/src/tokufractaltree_static_depends.cc -storage/tokudb/ft-index/toku_include/toku_config.h -storage/tokudb/ft-index/tools/ba_replay -storage/tokudb/ft-index/tools/ftverify -storage/tokudb/ft-index/tools/tdb-recover -storage/tokudb/ft-index/tools/tdb_logprint -storage/tokudb/ft-index/tools/tokudb_dump -storage/tokudb/ft-index/tools/tokudb_gen -storage/tokudb/ft-index/tools/tokudb_load -storage/tokudb/ft-index/tools/tokuftdump -storage/tokudb/ft-index/xz/ -support-files/MySQL-shared-compat.spec -support-files/binary-configure -support-files/config.huge.ini -support-files/config.medium.ini -support-files/config.small.ini -support-files/mariadb.pc -support-files/my-huge.cnf -support-files/my-innodb-heavy-4G.cnf -support-files/my-large.cnf -support-files/my-medium.cnf -support-files/my-small.cnf -support-files/mysql-log-rotate -support-files/mysql.10.0.11.spec -support-files/mysql.server -support-files/mysql.spec -support-files/mysqld_multi.server -support-files/wsrep.cnf -support-files/wsrep_notify -tags -tests/async_queries -tests/bug25714 -tests/mysql_client_test -storage/mroonga/config.sh -storage/mroonga/mrn_version.h -storage/mroonga/data/install.sql -storage/mroonga/vendor/groonga/config.h -storage/mroonga/vendor/groonga/config.sh -storage/mroonga/vendor/groonga/groonga.pc -storage/mroonga/vendor/groonga/src/grnslap -storage/mroonga/vendor/groonga/src/groonga -storage/mroonga/vendor/groonga/src/groonga-benchmark -storage/mroonga/vendor/groonga/src/suggest/groonga-suggest-create-dataset -storage/mroonga/mysql-test/mroonga/storage/r/information_schema_plugins.result -storage/mroonga/mysql-test/mroonga/storage/r/variable_version.result # C and C++ # Compiled Object files @@ -270,6 +50,11 @@ storage/mroonga/mysql-test/mroonga/storage/r/variable_version.result *.x86_64 *.hex +# Cmake files +*.stamp +*.stamp.* +*.rule +*.cmake ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. @@ -286,6 +71,10 @@ storage/mroonga/mysql-test/mroonga/storage/r/variable_version.result *.vcproj.* *.vcproj.*.* *.vcproj.*.*.* +*.vcxproj +*.vcxproj.* +*.vcxproj.*.* +*.vcxproj.*.*.* # Build results [Dd]ebug/ @@ -462,3 +251,4 @@ UpgradeLog*.htm # Microsoft Fakes FakesAssemblies/ + diff --git a/storage/connect/colblk.cpp b/storage/connect/colblk.cpp index 010c097c712..80b405be041 100644 --- a/storage/connect/colblk.cpp +++ b/storage/connect/colblk.cpp @@ -297,15 +297,9 @@ FIDBLK::FIDBLK(PCOLUMN cp, OPVAL op) : SPCBLK(cp), Op(op) Buf_Type = TYPE_STRING; *Format.Type = 'C'; Format.Length = Long; -<<<<<<< HEAD #if defined(__WIN__) Format.Prec = 1; // Case insensitive #endif // __WIN__ -======= -#if defined(WIN32) - Format.Prec = 1; // Case insensitive -#endif // WIN32 ->>>>>>> ob-10.1 Constant = (!((PTDBASE)To_Tdb)->GetDef()->GetMultiple() && To_Tdb->GetAmType() != TYPE_AM_PLG && To_Tdb->GetAmType() != TYPE_AM_PLM); diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 2865fa47a76..8afda723578 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -239,9 +239,9 @@ PQRYRES DBFColumns(PGLOBAL g, char *dp, const char *fn, bool info) buftyp, fldtyp, length, true, false); if (info || !qrp) { - if (infile) + if (infile) fclose(infile); - + return qrp; } // endif info @@ -498,7 +498,7 @@ bool DBFFAM::OpenTableFile(PGLOBAL g) if (!(Stream = PlugOpenFile(g, filename, opmode))) { if (trace) htrc("%s\n", g->Message); - + return (mode == MODE_READ && errno == ENOENT) ? PushWarning(g, Tdbp) : true; } // endif Stream @@ -585,7 +585,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) for (cdp = tdp->GetCols(); cdp; cdp = cdp->GetNext()) if (!(cdp->Flags & U_SPECIAL)) { descp++; - + switch ((c = *GetFormatType(cdp->GetType()))) { case 'S': // Short integer case 'L': // Large (big) integer @@ -602,7 +602,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) c, cdp->GetName()); return true; } // endswitch c - + strncpy(descp->Name, cdp->GetName(), 11); descp->Type = c; descp->Length = (uchar)cdp->GetLong(); @@ -785,7 +785,7 @@ int DBFFAM::InitDelete(PGLOBAL g, int fpos, int spos) else if (fwrite(To_Buf, 1, lrecl, Stream) != lrecl) sprintf(g->Message, MSG(FWRITE_ERROR), strerror(errno)); else - rc = RC_NF; // Ok, Nothing else to do + rc = RC_NF; // Ok, Nothing else to do return rc; } // end of InitDelete @@ -853,7 +853,7 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) if (!Abort) { // Copy any remaining lines bool b; - + Fpos = Tdbp->Cardinality(g); Abort = MoveIntermediateLines(g, &b) != RC_OK; } // endif Abort diff --git a/storage/connect/filter.h b/storage/connect/filter.h index 3c391b7a576..15730e2cc44 100644 --- a/storage/connect/filter.h +++ b/storage/connect/filter.h @@ -106,11 +106,7 @@ class FILTERX : public FILTER { // Fake operator new used to change a filter into a derived filter void * operator new(size_t, PFIL filp) {return filp;} -<<<<<<< HEAD #if defined(__WIN__) -======= -#if defined(WIN32) ->>>>>>> ob-10.1 // Avoid warning C4291 by defining a matching dummy delete operator void operator delete(void *, PFIL) {} #else diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 349ff3b3a1f..c2fb6481cb0 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -169,22 +169,13 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { -<<<<<<< HEAD char version[]= "Version 1.03.0007 June 03, 2015"; #if defined(__WIN__) -======= - char version[]= "Version 1.03.0007 April 30, 2015"; -#if defined(WIN32) ->>>>>>> ob-10.1 char compver[]= "Version 1.03.0007 " __DATE__ " " __TIME__; char slash= '\\'; #else // !__WIN__ char slash= '/'; -<<<<<<< HEAD #endif // !__WIN__ -======= -#endif // !WIN32 ->>>>>>> ob-10.1 } // extern "C" #if defined(XMAP) @@ -204,14 +195,8 @@ extern "C" { /***********************************************************************/ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); PQRYRES VirColumns(PGLOBAL g, bool info); -<<<<<<< HEAD PQRYRES JSONColumns(PGLOBAL g, char *db, PTOS topt, bool info); PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info); -======= -PQRYRES JSONColumns(PGLOBAL g, char *dp, const char *fn, char *objn, - int pretty, int lvl, int mxr, bool info); -PQRYRES XMLColumns(PGLOBAL g, char *dp, char *tab, PTOS topt, bool info); ->>>>>>> ob-10.1 void PushWarning(PGLOBAL g, THD *thd, int level); bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, const char *host, const char *db, char *tab, const char *src, int port); @@ -5021,15 +5006,9 @@ static int connect_assisted_discovery(handlerton *, THD* thd, char *tab, *dsn, *shm, *dpath; #if defined(__WIN__) char *nsp= NULL, *cls= NULL; -<<<<<<< HEAD #endif // __WIN__ int port= 0, hdr= 0, mxr= 0, mxe= 0, rc= 0; int cop __attribute__((unused))= 0, lrecl= 0; -======= -#endif // WIN32 - int port= 0, hdr= 0, mxr= 0, mxe= 0, rc= 0, lvl= 0; - int cop __attribute__((unused))= 0, pty= 2, lrecl= 0; ->>>>>>> ob-10.1 #if defined(ODBC_SUPPORT) POPARM sop = NULL; char *ucnc = NULL; diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 315904f2b05..3d03bea5d00 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -23,11 +23,7 @@ #define ARGS MY_MIN(24,len-i),s+MY_MAX(i-3,0) -<<<<<<< HEAD #if defined(__WIN__) -======= -#if defined(WIN32) ->>>>>>> ob-10.1 #define EL "\r\n" #else #define EL "\n" @@ -1163,7 +1159,4 @@ bool JVALUE::IsNull(void) { return (Jsp) ? Jsp->IsNull() : (Value) ? Value->IsZero() : true; } // end of IsNull -<<<<<<< HEAD -======= ->>>>>>> ob-10.1 diff --git a/storage/connect/json.h b/storage/connect/json.h index e08846149a3..da45157f124 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -267,7 +267,4 @@ class JVALUE : public JSON { PJVAL Next; // Next value in array bool Del; // True when deleted }; // end of class JVALUE -<<<<<<< HEAD -======= ->>>>>>> ob-10.1 diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 23cef5cb99b..ff4025ee0fb 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -410,11 +410,7 @@ void Json_Array_Add_deinit(UDF_INIT* initid) } // end of Json_Array_Add_deinit /***********************************************************************/ -<<<<<<< HEAD /* Delete a value from a Json array. */ -======= -/* Add values to a Json array. */ ->>>>>>> ob-10.1 /***********************************************************************/ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { @@ -455,11 +451,7 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } else { n = *(int*)args->args[1]; arp = jvp->GetArray(); -<<<<<<< HEAD arp->DeleteValue(n); -======= - arp->DeleteValue(n - 1); ->>>>>>> ob-10.1 arp->InitArray(g); if (!(str = Serialize(g, arp, NULL, 0))) { diff --git a/storage/connect/rcmsg.c b/storage/connect/rcmsg.c index 3bc82dc85a1..75759e03314 100644 --- a/storage/connect/rcmsg.c +++ b/storage/connect/rcmsg.c @@ -21,15 +21,9 @@ #include "msgid.h" #endif // NEWMSG -<<<<<<< HEAD #if !defined(__WIN__) #define stricmp strcasecmp #endif // !__WIN__ -======= -#if !defined(WIN32) -#define stricmp strcasecmp -#endif // !WIN32 ->>>>>>> ob-10.1 char *msglang(void); diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 59ca1113e01..fafba6228b9 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -1287,17 +1287,7 @@ PJSON JSONCOL::GetRow(PGLOBAL g) break; case TYPE_JAR: if (!Nodes[i].Key) { -<<<<<<< HEAD arp = (PJAR)row; -======= - if (Nodes[i].Op != OP_NULL) { - arp = (PJAR)row; - - if (Nodes[i].Rank) - val = arp->GetValue(Nodes[i].Rank - 1); - else - val = arp->GetValue(Nodes[i].Rx); ->>>>>>> ob-10.1 if (Nodes[i].Op == OP_EQ) val = arp->GetValue(Nodes[i].Rank); diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 9fef4498abc..49fa9a1c554 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -117,11 +117,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) static XFLD fldtyp[] = {FLD_NAME, FLD_TYPE, FLD_TYPENAME, FLD_PREC, FLD_LENGTH, FLD_SCALE, FLD_NULL, FLD_FORMAT}; static unsigned int length[] = {0, 6, 8, 10, 10, 6, 6, 0}; -<<<<<<< HEAD char *fn, *op, colname[65], fmt[129], buf[512]; -======= - char *op, colname[65], fmt[129], buf[512]; ->>>>>>> ob-10.1 int i, j, lvl, n = 0; int ncol = sizeof(buftyp) / sizeof(int); bool ok = true; @@ -438,11 +434,7 @@ XMLDEF::XMLDEF(void) /***********************************************************************/ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) { -<<<<<<< HEAD char *defrow, *defcol, buf[10]; -======= - char *defrow, *defcol, buf[10]; ->>>>>>> ob-10.1 Fn = GetStringCatInfo(g, "Filename", NULL); Encoding = GetStringCatInfo(g, "Encoding", "UTF-8"); @@ -511,13 +503,8 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Usedom = (toupper(*buf) == 'M' || toupper(*buf) == 'D'); // Get eventual table node attribute -<<<<<<< HEAD Attrib = GetStringCatInfo(g, "Attribute", NULL); Hdattr = GetStringCatInfo(g, "HeadAttr", NULL); -======= - Attrib = GetStringCatInfo(g, "Attribute", ""); - Hdattr = GetStringCatInfo(g, "HeadAttr", ""); ->>>>>>> ob-10.1 return false; } // end of DefineAM @@ -1271,11 +1258,7 @@ void TDBXML::CloseDB(PGLOBAL g) { if (Docp) { if (Changed) { -<<<<<<< HEAD char filename[_MAX_PATH]; -======= - char filename[_MAX_PATH]; ->>>>>>> ob-10.1 // We used the file name relative to recorded datapath PlugSetPath(filename, Xfile, GetPath()); diff --git a/storage/connect/value.h b/storage/connect/value.h index 91a7581d07c..780917c9962 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -360,15 +360,7 @@ class DllExport DTVAL : public TYPVAL { public: // Constructors DTVAL(PGLOBAL g, int n, int p, PSZ fmt); -<<<<<<< HEAD DTVAL(int n); -======= -//DTVAL(PGLOBAL g, PSZ s, int n); -//DTVAL(PGLOBAL g, short i); - DTVAL(int n); -//DTVAL(PGLOBAL g, longlong n); -//DTVAL(PGLOBAL g, double f); ->>>>>>> ob-10.1 // Implementation virtual bool SetValue_pval(PVAL valp, bool chktype); From 3a9a3b98b729b9095e6f24ff0595299ad2b3d24a Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Mon, 8 Jun 2015 00:03:52 +0200 Subject: [PATCH 20/39] Fix test txt files line endings --- .../mysql-test/connect/std_data/boyswin.txt | 12 +- .../mysql-test/connect/std_data/emp.txt | 9090 ++++++++--------- .../mysql-test/connect/std_data/expenses.txt | 48 +- 3 files changed, 4575 insertions(+), 4575 deletions(-) diff --git a/storage/connect/mysql-test/connect/std_data/boyswin.txt b/storage/connect/mysql-test/connect/std_data/boyswin.txt index ada3b2dc45c..bf6eee6238c 100644 --- a/storage/connect/mysql-test/connect/std_data/boyswin.txt +++ b/storage/connect/mysql-test/connect/std_data/boyswin.txt @@ -1,6 +1,6 @@ -John Boston 25/01/1986 02/06/2010 -Henry Boston 07/06/1987 01/04/2008 -George San Jose 10/08/1981 02/06/2010 -Sam Chicago 22/11/1979 10/10/2007 -James Dallas 13/05/1992 14/12/2009 -Bill Boston 11/09/1986 10/02/2008 +John Boston 25/01/1986 02/06/2010 +Henry Boston 07/06/1987 01/04/2008 +George San Jose 10/08/1981 02/06/2010 +Sam Chicago 22/11/1979 10/10/2007 +James Dallas 13/05/1992 14/12/2009 +Bill Boston 11/09/1986 10/02/2008 diff --git a/storage/connect/mysql-test/connect/std_data/emp.txt b/storage/connect/mysql-test/connect/std_data/emp.txt index aa45d2644c0..08cafdb8cab 100644 --- a/storage/connect/mysql-test/connect/std_data/emp.txt +++ b/storage/connect/mysql-test/connect/std_data/emp.txt @@ -1,4545 +1,4545 @@ -5745ESCOURCHE BENEDICTE 21935 71962121994051834514275.50 0MTECHN -9692VICENTE LAURENCE 21941 81967101989011621213032.80 0MANGL -9146NICOLAS ROGER 11941 61964071995023417325098.65 0MSANS -2985TESSEREAU MARIE HELENE 21941 91967011990011932314933.78 0VSANS -3368MOGADOR ALAIN 11941 11961091993114330331420.55 0CSANS -7394CHAUSSEE ERIC DENIS 11944 91965111983123200223583.86 0MANGL -4655MAILLOT GEORGES 11945 51970091986122470018541.64 0CANGL -2825CAMILLE NADINE 21956 91994011993011949415050.45 0MSANS -1460BRUYERES JEAN MARC 11958 81984081988052090215980.07 0MSANS -4974LONES GERARD 11959101979011994121608112916.70 0MSANS -8811CROISILLES DOMINIQUE 11961101983051991011868714507.13 0MSANS -4682MUY CHRISTINE 21962101986051985051288210745.30 0MANGL -2974SEYSSAUD GERARD 11963 91984101989051949415050.55 0MALLEM -3185QUINET OLIVIER 11966 71985061993111868714507.94 0MSANS -9543KOMITAS YVES 11967 21993011992011330611017.70 0MTECHN -3493COUDET ERIC CHRISTIAN 11935101955041992063417325097.97 1MTECHN -9039CHAMBOURCY JEAN PAUL 11936 21965031995033417325098.51 1MALLEM -3731CLERE BRIGITTE 21936111963091995082666519900.77 1CSANS -2935BONVIN ROBERT 11937 71960121985042273717261.66 1MANGL -4278VALBOSQUET VERONIQUE SIMONE 21939 21972071992021932314933.54 1MSANS -1653LIEGE LAURENCE 2193912198901198605 8656 8145.57 1.SANS -4477LECOURBE DIDIER 11939121965051993011663613342.67 1MSANS -1400AVENE ANDRE 11940111969121993041557012568.44 1MALLEM -9742YZENGREMER MICHEL 11941121968011995042201216756.19 1MVENTE -7255PEYRESTORTES MARIE CHRISTINE 21941 11962041988072470018541.83 1MANGL -1725EPEND MARIE AGNES 21941 41973071989011621213033.65 1VSANS -4647PERADONNERIE JACQUES 11941121974071992071369311287.41 1MSANS -7633SCHEFFER CLAUDE 11944 11969031991011433211714.46 1MSANS -9793SABLONS MARIE FRANCE 21945 5199408199308 9126 8456.87 1VSANS -6057EAU BRUNO 11947 91972041991071433211715.33 1MSANS -6465JADES CATHERINE 21947121970011995042137316331.60 1MINFOR -8298BERGERS BERNARD 11947101975091993011369311287.29 1MSANS -9254LEGROS SUZANNE 21947 41971111995111684813422.57 1MESP -7761KAMAL ALAIN 11948 91977041993111471512024.08 1MCOMPT -5772GAUTHIER SABINE 21948 61977071994041471512025.34 1MTECHN -9643BARTHELEMY DOMINIQUE 11949 519871019901111131 9657.16 1LSANS -3906ROUYRE LAURE 21949 31973071972071326611016.21 1MSANS -8707SICILE JEAN PIERRE 11950 11976071993011369311286.56 1MANGL -0091THIVERNAL DIDIER JEAN 11951101980051991101471512024.71 1MSANS -5757CLOPERIE FABIENNE 21951 71972051995071684813423.26 1MSANS -7795LATOUR CATHERINE 21952 4199406199306 8359 7953.72 1MSANS -4879EGUILLES GILLES 11952 61972121990071621213032.51 1MANGL -8311VINS JEAN PIERRE 11952 119930919920910407 9272.06 1MTECHN -5964JUST STEPHANE BERNARD 11952 51974061993011369311286.48 1MSANS -2822NEMAN ELISABETH 21952 7199304199204 9597 8728.14 1MSANS -1340ABBE MICHELE 21953101973071991041578112722.60 1MSANS -5357ZOLA BERNARD 11954 41980061992011471512024.35 1MSANS -8456DHUYS CORINNE ANNE 21954 71979031993041471512025.50 1MINFOR -4618FERRY BRUNO 11954 41977041995011578112722.24 1MSANS -8212CIRCLE BERNARD 11955111975041991071578112722.42 1MSANS -8015BACHELET DOMINIQUE 11956121977031994072644919744.10 1MTECHN -4320SUPERI MONIQUE 21956 319940519920111389 9852.00 1MSANS -0442CONTOUR ALAIN 11957 91977031995062201216757.70 1MSANS -1034PROLONGEE MICHELINE 21957 61980051994071471512024.15 1MSANS -2106BARDE JEAN CLAUDE 11958 219840719830711131 9659.17 1MANGL -1977FOCH BERNADETTE 21958 3199202199102 8656 8145.03 1.SANS -3620BAGNOLET ANDRE 11958 11978061992051471512024.33 1MSANS -3344PEUPLIERS JOSIANE 21959 8199207199201 8656 8146.16 1DSANS -9038MALVILLE ETHEL LINKA 21959 31993091992011202810240.59 1MTECHN -0475PIERREFONTAINE BERNARD 11959 61984081987112090215979.62 1MSANS -4077MONTMELIAN NOELLE 21960 21984031983031288210743.92 1MSANS -1421FONTCHANDON PATRICE 11961 71984081989052090215980.97 1MALLEM -7043MOULERON MARTINE 21962 5199303199203 8656 8145.83 1.SANS -7239EPARGNE PASCALE 21962 91983011982011608112915.57 1MSANS -0361BRUANT LAURENCE 21962 31983041994091894014661.48 1CSANS -1988MIGNARD ANNE 21962 51993081992011249910473.36 1MSANS -8159GOLFE JEAN CLAUDE 11963 81985101992071288210745.49 1MANGL -7227BLEU MICHELE 21963 21994071992011249910472.61 1MTECHN -2721SATGE SOPHIE JULIE 21963 6199503199403 8656 8146.07 1MESP -1514PANNES JOEL ETIENNE 11964 11984101983101288210743.81 1MSANS -1595SEPTEMBRE PATRICE 11964 11988031987031527112373.40 1MSANS -5702CONCORDE PAUL 11965 71994051994011288210744.94 1MMARKT -3500DRIONNE JEAN XAVIER 119651119860119850110791 9501.81 1MSANS -3597PIERAM DOMINIQUE 11966 31991101990101381911366.72 1MINFOR -3537JEAN ANNE MARIE 2196610199610199510 9894 8921.90 1MSANS -0036CHATEAUBRIAND FRANCOISE 21967 8199307199207 7803 7681.42 1.SANS -2501GASTA PIERRE 11967101987091988071949415051.95 1CESP -5621KERGUILLE PASCAL 11967 71988071994061381911364.83 1MALLEM -5823BRIAC MONIQUE 21968 51994011993011360611210.93 1MSANS -3717FRADINIERE DANIEL 11968 51988041991041249910472.01 1MTECHN -2374PETITS SYLVIE FRANCOISE 21969 91992091991091330611018.24 1MSANS -8139POMPE ERIC 11969 21989041995031249910472.21 1MESP -3293GUSTAVIA MICHEL 11969 11993021992021420611637.74 1CINFOR -6848IMPASSE CLIVE 11969 71988071994011249910471.88 1MSANS -2857ERMITE DOMINIQUE 11969 319910719900710407 9271.86 1MTECHN -9167PARENT JEAN CLAUDE 11969 919930419920411389 9850.61 1CTECHN -6582OR MARYSE 21970 419920719910710024 8998.62 1MSANS -3685ANNEAU CORINNE JEANNE 21970 919920819910811389 9852.27 1MSANS -4890CIMIEZ PHILIPPE 11971121994101993101360611209.89 1MSANS -7740MARCEAU AGNES 21971 119920919910911389 9852.45 1MANGL -5934RANCHO DOMINIQUE 11971 91992071991071420611637.60 1CANGL -6784WEST JEAN LOUIS 11971 71995011994031202810241.57 1CSANS -0502ARRALLES GILLES 11971121993121994011249910473.27 1CSANS -5900LESIGNY OLIVIER 11972 6199606199506 8656 8145.74 1CVENTE -9357EGLISE ROGER 11972 5199207199312 9597 8728.89 1CINFOR -2647MONASTERE PHILIPPE JEAN 11972 919940619930610363 9233.31 1CSANS -7752RANCE GERARD 11973 2199607199507 7803 7680.14 1CINFOR -2565AQUITAINE GENEVIEVE 21973 119940619920111389 9852.22 1CALLEM -6946ORBAY CHRISTIANE 2197311199207199101 8656 8146.88 1MSANS -3358SALONINA ETIENNE 11973 419930919920911389 9852.36 1CANGL -7527BOULEYGUE PATRICK PIERRE 119741219940419930410668 9426.72 1CSANS -4780VALMORE ALBERT 11974 81995011994011206910241.16 1CSANS -6139PALMAROLE BERNADETTE 21975 1199504199404 8359 7952.78 1CSANS -2461CHAFFARD FREDERIC 11975 1199408199308 7803 7680.62 1CANGL -4422KAZ ELISABETH 2197612199607199507 7803 7681.11 1CSANS -3477CABRINE SYLVIE 21978 7199608199508 7803 7679.51 1CTECHN -6323FABIA RENE 11935 31960121990082273717260.44 2MSANS -5986ANNA DANIEL 11935 41970041991011433211714.88 2DSANS -1512FONTAIN HENRY 1193511198901198801 9894 8922.57 2VESP -6902BLANCS BRUNO 11935 61958071993052470018541.64 2MSANS -1158CORNEBARRIEU JEAN FRANCOIS MARCEL11936121964011994011557012566.45 2CTECHN -8277PRIEURE CORINNE 21936 51963011991072273717260.26 2CANGL -3981TERME FREDERIC 11937 71959021989013844228044.89 2MSANS -1713DANVILLE DANIEL 11937 51961101985022470018540.87 2MANGL -9871CAZALIS THIERRY 11938 61966121989062947921840.15 2MANGL -0383CRESSELY JOELLE 21938111962091990012273717260.55 2VANGL -3742PYRENEES CHRISTIAN 11938121971101995011663613342.85 2MESP -6595BAGUIERE FRANCOIS 11938121964081983102022115556.35 2MALLEM -6543PIERRON PATRICK 11939 7198901198801 9894 8921.33 2CSANS -8167CLAUX MARTINE 21939 21967011992021932314934.48 2CSANS -4406LESBACHES COLETTE 21940111973071994041894014662.43 2MSANS -8258HARTMANN MARC 11940 31968061995011663613343.06 2MVENTE -3848BARAUDIERE JEAN CLAUDE 11940 11964101990042739020404.83 2MANGL -1529PICOURENC ANNY 21940 71967011989062470018541.86 2DVENTE -3069PERIER MICHELE 2194010199601199501 7803 7681.25 2MSANS -8473COLONIE PIERRETTE 21941 31968041991041932314933.58 2MINFOR -0084NIEMEN ODILE 21941 51970071991101932314933.73 2CSANS -6401ALLERAY ARLETTE 21941 21972121993071894014662.64 2CSANS -8343LEDION FRANCOIS RENE 11941 71972031991071663613344.41 2MALLEM -9940LAUNES LILIANE 2194210199005198606 8656 8145.83 2.SANS -7584MARSAT SERGE 11942101964081994011557012567.26 2MSANS -1051ROSAN STEPHANE 11942 51962041991072273717261.13 2MANGL -8928POINCARE ANNE MARIE 21942 41965021994051834514275.50 2MANGL -0874FRANCS KATHERIN 21942 61968031992021932314934.00 2MSANS -3411CORDELIERS ELISABETH 219421119931119921110152 9116.90 2MSANS -8736PERTUADE DIDIER 11943 31973071992041403411520.93 2MANGL -5553OLIVIER CHANTAL 21943 71964071992102137316331.97 2MTECHN -8502AUGUSTE JOCELYNE 21943101962121991072273717261.16 2CTECHN -7314DRAIO TOMOKO 21943111969111991072273717260.71 2MSANS -7892HAUTIL MARIE AGNES NICOLE 2194312199201199101 7803 7681.35 2.SANS -1146RUES LAURENT 11943 51970041990032022115556.13 2MSANS -5013POURNAY STEPHANE 11943 71969101991011433211714.01 2MMARKT -1970SARREBOURG CHRISTOPHE 11943 91962121988122470018540.20 2MTECHN -2665SAVOIE HELENE 21944 91968091986062470018540.53 2MSANS -9470KALISTE SUZANNE 21944 31970071991041578112722.12 2DSANS -7109PEREIRA JOSIANE 21944 71965011982102470018541.72 2CSANS -0293COURDIMANCHE JEAN CLAUDE 11944 41967011991012273717260.50 2MSANS -6308BASQUES ERIC WILLEM 11944 71970051988042273717261.30 2MSANS -9758ROSSA ROBERT 11944 21976051991101369311286.71 2MSANS -0368GEROFOSSE JOELLE 21944 5198810198306 8656 8146.34 2.ANGL -3899SALIVE JACQUES 11945 81971051991071433211713.67 2MTECHN -4807RONDINELLE NOELLE 21945 81968091993062470018540.42 2MSANS -1251CAP CLAUDE 1194510198907198903 8656 8146.20 2.ANGL -8624FREVILLE ALAIN 119451119820119810111389 9852.74 2MSANS -2995ROI JEAN 11946 91972011990101433211715.50 2MANGL -2130POMPE JEAN MARIE 11946 11972081991071578112722.03 2MSANS -1524ANTARES CHRISTIAN 11946 41972011990011433211714.43 2MTECHN -2651AUBE YVES 11946 71971071987041932314934.48 2MALLEM -5389YVON CAROLE 21946101969031993031834514275.34 2CSANS -5055BERTHIER CAROLE SIMONE 21947 319931019921010024 8999.31 2MINFOR -9623LAGER NORMA 21947 61982071992121471512024.51 2MSANS -9198CAGEAC MICHEL 11947101971031991011433211715.45 2MTECHN -1117MONS JOELLE 21948 41970081986052334017609.84 2MSANS -3883BELFORT FLORENCE 21948 2199503199403 8359 7952.96 2MINFOR -1886CHERCHE CHRISTIANE 21948 3199412199312 9597 8729.72 2MSANS -9452MORGANE ISABELLE HELENE 21948 61971061989011621213032.70 2MVENTE -1240POSTEL JOHN 11948111974071992011403411520.33 2MTECHN -2793DALHIAS EUGENE 11948 71974041992031518612336.02 2MSANS -1264TRESSERVE EVELYNE 21948 71969081991012990722149.03 2MTECHN -2964PUJADE ROBERT 11949 81974071992041403411521.74 2MANGL -9832COUTURIER PATRICK 11949 11972031988102273717260.76 2MSANS -7619ETIGNY FLORENCE 21949 21970111995042137316332.59 2DVENTE -3262FABRONITA ANNE 21949 11969091993061834514274.66 2MSANS -2312SENONCHES ERIK 11949111977041993041369311287.23 2MALLEM -8743GALLA DANIEL 11949 31970081991012137316331.79 2MALLEM -0857RAYNOUARD JEAN PIERRE 11950 91982061993111369311287.65 2MSANS -2136DEROISIN JEAN MARIE 11950 11979061992011608112916.74 2CSANS -4603LEPURDIE PHILIPPE 11950 91977101990101684813422.12 2MSANS -2694JOSEPH ERIC 11950 31979021992011249910471.62 2SANGL -0601SAOUVES PATRICIA 21950 51971021990101834514275.83 2MTECHN -7409RENE DANIEL 11950 11973051990122470018541.83 2MANGL -0950SENNELY JEAN PIERRE 11950 51977081986091621213033.28 2MANGL -1214LOTHIERS ALAIN 11951 51976101993011608112915.65 2MSANS -6388LAGRANGE ANDRE 11951 81976031984112470018541.20 2MSANS -2773MORGON ALBAN 11951 91974051988122334017610.33 2MANGL -7718PIEDS PASCAL BRUNO 11951 61981061993011471512025.91 2CSANS -8483MEDITERRANEE FREDERIC 11951101970101991112334017610.56 2MSANS -6772TRARIEUX GUY 11952 91976041992121932314933.54 2MTECHN -3860MONTABO GHYSLAIN 21952121972041979101684813421.64 2MMICRO -4868SEVRIER BERNARD 11952 31981041992121369311287.50 2MANGL -5715CHEVREUSE CATHERINE 21953 11974081991092175716600.56 2MSANS -3702CALIFO BEATRICE 21953 21973021993012017815517.91 2MESP -4778LABORDE SHOKO 21953 61973041990101578112723.50 2MSANS -4134GABONNAISE GHISLAINE 21953 61980071979071202810241.30 2DESP -4174GAGNEUR JEAN FRANCIS 11953 81979011991101369311288.22 2CSANS -6892NOLET JEAN LOUIS 11953 81982051992041369311287.41 2MSANS -5817SERPENTINE CLAUDE 11954 11973111989122175716601.28 2MSANS -9960GASSIN PASCAL 11954 81974121991012334017610.60 2MSANS -4935ANNE EVELYNE 21954101975021986101684813423.38 2CANGL -7050LUBECK MARIE CHRISTINE 21954 81975101993091608112915.33 2DESP -4537ANNECY ROBERT 11954 91974061992011578112721.89 2MANGL -1403CHAUVETS CHRISTINE 21954 31977031992011471512025.55 2MINFOR -3733JAUSSERANNE MASAYO 21955 41978011981091834514274.29 2MSANS -3799VAILLANT ANNE MARIE 2195558199606199506 7803 7679.58 2MSANS -1112CHAUMINE RUTH 21956 71985091984091288210745.99 2MSANS -8102AUSSOU MARCELINE 21956 91985061984061288210744.53 2MMICRO -3321GABRIE JEAN LOUIS 11956101976031993041471512024.75 2MSANS -6037SENART JEAN PIERRE 11956 419810319921011389 9852.47 2MSANS -2073CHAUFOURNIERS FRANCOIS 11956 61976111994041471512026.24 2MSANS -3246LAMANON VERONIQUE 21956111980041995101527112374.97 2MTECHN -5182MA PIERRE 11957 41978121994071911114779.14 2MALLEM -1023GIONO PATRICK 11957 91989011995011249910472.21 2MSANS -6811GENERAL ALAIN 11957 219930719940111302 9775.56 2MSANS -9879FOUJU PATRICK 11958 91983051987052090215979.70 2MSANS -9605ATLANTIQUE CATHERINE 21958 4199510199410 7803 7681.20 2MSANS -4610COLMAR YVES 11958111982021981021608112916.50 2MSANS -1905INGRANDES GILLES 11958 11978061993041471512024.03 2MSANS -6585VERON PHILIPPE 11958 41990091989111450311831.69 2MINFOR -1508DOBROPOL ERIC JEAN 11958 71978071995041249910473.33 2MTECHN -9616AIGUELONGUE JEAN PIERRE 11958 71979101994051783213884.92 2MTECHN -5207GANDOUX PATRICK 11958 11980081985112256617145.24 2MSANS -5107FABRON CLAUDE 21959101982021981021326611016.48 2MTECHN -6821ARCADIE RAPHAEL 11959 519810119800111389 9851.34 2MSANS -9011TUTELLE CLAUDINE 21959 3199201199101 7803 7680.57 2.INFOR -9117TOURISTIQUE AGNES 21959 31983111982111326611016.24 2MSANS -2719CRECH DOMINIQUE 11959 81983101991012781920673.39 2MSANS -9688BAUME BRIAC 11960 1198901198801 9894 8921.36 2MVENTE -0734CIPRES DOMINIQUE MAURICE 11960 21984111993041527112374.40 2MSANS -2402VALBOIS DOMINIQUE 11960 419880419870410407 9271.77 2MSANS -4887ARBAUD JACQUES 11961 61985101993011168610047.18 2MSANS -3196ARCADES YVES 11961 619910819900810024 8999.88 2MSANS -0090SENLIS COLETTE 21961 7199610199510 8656 8147.17 2MSANS -1096BOULOGNE AIME 11961111982061981061326611016.53 2MTECHN -2728ABOUT CATHERINE MARIE 21961 219841019831011389 9851.55 2DSANS -9891EXELMANS PATRICK 11961 61992061991061249910472.97 2DSANS -4344SANTA MARYLENE 21962 91993081992011249910472.41 2DSANS -6050PROSPER JOELLE 21962 41982051981051326611018.19 2MESP -1207CAUSSADE MONIQUE ESTELLE 21962 91982111995011450311831.07 2DTECHN -0864MIOLLIS FRANCOISE 21962 6199501199401 8656 8146.41 2MANGL -0149MONVALLON BRIGITTE 21962 41983011982011326611016.29 2CSANS -2375ALIZE CAROLE 21962 91983011982011215710280.24 2MANGL -8618RESID CHRISTIANE 21962101996111995111202810241.90 2MSANS -2736PAPIN GERARD 11962 51982051993091949415052.11 2MSANS -3073JONCS PATRICK FRANCOIS 11962 919890519880510407 9270.62 2MANGL -6231ENFER PHILIPPE 11962 61988031993041288210744.28 2CALLEM -5886CHANAZ RENE CHARLES 11962 41992091991091839014312.94 2MSANS -7276ORGEMONT DANIEL 11962 119830719910711131 9658.28 2MINFOR -8307GUILLAUME BRIGITTE 21963 21986051985051288210744.10 2MALLEM -6242ESCLIMONT MARC 11963121986071993051288210745.94 2MMARKT -2593CARNOT JEROME HENRI 11963 719890619880610407 9271.23 2MSANS -9494TAILLANDERIE JOSETTE 21963 41985101984101249910472.84 2MANGL -6039BOURRIER ODILE 21963121984051992011288210745.88 2DSANS -8408MARINE JEAN PHILIPPE 11963 419850619840610791 9502.46 2MSANS -3121DOMAINES MICHEL 11963121983061983081326611016.74 2CALLEM -3716LANDES DANIEL 11963 919851019841010791 9503.30 2MCOMPT -7915LAMBALLE CHRISTIAN 11963 7199009199510 8656 8145.48 2.SANS -9027RUGBY NICOLAS PHILIPPE 11964111993051992051249910472.12 2MSANS -2392MAXIME FRANCIS 119641219850419840410791 9501.95 2MCOMPT -3798BORNEL PATRICE 11964 51984061993071527112374.31 2MANGL -8092DOURNAZAC MARIE CLAUDE 21964 71988031995091450311831.39 2DTECHN -9707FEUILLANTS STEPHANE 11964 91985041984041288210744.95 2MSANS -1926ESCLAPON JEAN PIERRE 11964101987071990011288210744.14 2MSANS -9268DOCKS CATHERINE 21965 81985101984101288210745.97 2MALLEM -6133MOULYN JEAN NOEL 11965 519950119940110024 8999.58 2MANGL -2064GABRIELLE CLAUDE 119651119940419940110363 9232.71 2MANGL -3515ARZENS JEAN MICHEL 11966121987061994101249910473.45 2CSANS -1327LEVALLOIS CHRISTIAN HENRI 11966 419870119860110407 9270.96 2MALLEM -4538VALLEE PATRICK 11966111987091986091527112373.35 2MSANS -3705TOLLARE GUY 11966 319900219890210407 9271.28 2MANGL -2150SUD FREDERIC 11966 819891119881110407 9271.41 2MANGL -0295WEBER PATRICK 11966121989041994071249910471.94 2MANGL -8904ARMAGNAC BRIGITTE 21966 21993011992011839014312.78 2MSANS -0895ABORD CHANTAL 21966 31992021991011202810241.94 2MINFOR -3361MONTMORENCY LUC 11967 119891219890411302 9775.47 2MANGL -5793CHANEZ OLIVIER 11967 61989021988021539912452.16 2MTECHN -9149AUBEPINES JEAN CLAUDE 11967 919950619920110024 8999.72 2MSANS -6376MYANS DIDIER 11967 419900919890910024 8998.71 2CINFOR -7437KERILIS CHRISTINE LUCIENNE 21967 219950519940510668 9426.77 2MMARKT -5688TALLOIRES DOMINIQUE LOUISETTE 21968 81992121991121949415052.16 2MINFOR -3037GRANADOS BRIGITTE 219681119921119911111389 9851.33 2MSANS -0075CROUESTY PIERRE G 119681119900619890610407 9271.65 2MTECHN -7531UCHA GERARD 11968 319880619870610407 9270.24 2MALLEM -7464MORLET CHARLES 11968 319890419880410024 8999.79 2CVENTE -0214BLAZY CECILE MARIE NOELLE 2196812199405199305 9894 8922.34 2MMARKT -4596BONHEUR PHILIPPE 11969 81990011992061202810240.46 2MTECHN -3345ERESTE ERIC 119691219900919890910024 8999.72 2CSANS -2283MONTS PIERRE 11969 3199606199506 7803 7681.34 2CALLEM -5377ROGER FRANCK ANTOINE 1196912199306199206 8656 8147.19 2.SANS -2310PANORAMA JEAN PIERRE 11969 1199407199307 8656 8146.86 2MSANS -5201LINCON ALAIN 11969 11990101989101202810240.66 2MSANS -0199ROLAND ERIC JOSE 11969 119890719880710407 9270.29 2MSANS -9200FABREGAS LIONEL 11970 419940219940310024 8999.90 2MTECHN -7648PEPINIERES JEAN PAUL 11970 119920419910410024 8999.90 2MANGL -0531FALAISE PATRICK 11970111993101994051450311831.87 2MTECHN -0234TERTRE GILLES 11970 419940419930510363 9233.63 2CALLEM -4680FREIGNEAUX TORBEN 119711119910519931110024 8999.31 2MANGL -6897BRIGAND MAGGUY 21972 719910719900710024 8998.62 2MSANS -3962VIMANEY DOMINIQUE 219721119940719930411389 9852.18 2MSANS -3186VALLAURIS STEPHANE DENIS 119721119931219921211389 9851.57 2CSANS -8810GRENELLE BERTRAND 11972 219931219921211389 9851.21 2CSANS -4405ROBIAC FLORENT 11972 41992121993021420611638.14 2CTECHN -1562PORTO DENIS 11972 31992021994011249910471.76 2CSANS -9401VIEILLE DOMINIQUE PIERRE 11972 119940619930610363 9232.37 2CSANS -6240ROMARINS MAURICE 11973 61993031994011202810241.12 2CTECHN -7717INDRE GEORGES 11973 7199306199201 9597 8728.41 2CTECHN -4476AUGUSTIN CHRISTIAN 11974 419941119931110668 9425.55 2CSANS -1784LOIN MARTINE 21975 3199607199507 7803 7680.09 2CSANS -3218FLORENCE PIERRE 11977 1199606199506 7803 7681.25 2CESP -2085HEOL GUY PAUL 11977 5199410199502 8359 7951.66 2CSANS -0871BOUCHE MICHELE 21934 9199201199409 7803 7680.72 3.SANS -6519INGRES CLOTILDE 2193511199202199102 8656 8146.47 3.ALLEM -4038ADAM JANICK 21936111960061980062470018542.10 3MSANS -5872MURES MARYSE 2193610199210199110 9085 8417.54 3VSANS -1672LECOIN MIREILLE 21938 7199505199405 7590 7562.85 3MANGL -7357DETRIE MARIE PIERRE 21939 61962071983032470018540.96 3MSANS -6152LAVA MICHEL 11939 71962111991013844228045.78 3MSANS -3943SOUPANE MARIE HELENE 21940 31967011990011932314934.18 3MANGL -3325REVIREE ALAIN 11941 21973071992011403411521.25 3MANGL -2673HENNER LILIANE 21942 6199501199401 8656 8145.91 3CSANS -1755THEBAIDE MICHELE 21942 71966061995011834514275.86 3CSANS -7360DUCHEMIN VALERIE 21942 61970051991091932314933.73 3MANGL -1599CHALETS ALAIN 11943121988031993011215710279.23 3MSANS -9946AULNAY LAURENT 11945111972061995072470018540.87 3MVENTE -2412GILLES ANNE 21946101969081990012137316330.83 3MSANS -0843EPICEAS COLETTE 21947111971011994051834514274.26 3MANGL -6293TERRAS ERIC 11949 41976021992012470018542.13 3MSANS -0336AMOUR MARC 11949 31978081993121471512024.17 3MSANS -5125BASTIDES GUY 11949 91975091990011684813422.12 3DESP -7428LEGENDRE ELISABETH 21950 91979121978121249910472.15 3MSANS -5015GERARD VALERIE 2195112199307199207 8656 8146.11 3.ALLEM -4029SUISSE HERVE 11951 41970101990101932314935.08 3MTECHN -3802BARTHELEMY JEAN 11951 11976051994041471512025.77 3MESP -1871FELIX JEAN CLAUDE 11951 419811119870411131 9657.08 3SSANS -0467MALMAISON HENRI 11952 81976041992011578112722.66 3MANGL -4342PEYRE ANDRE 11953 519820419810411389 9851.64 3MESP -4047DORDOGNE GERARD 11954 11984081993011471512025.01 3MANGL -0870CHARBONNIERE HERVE MICHEL 119541219860119850111131 9658.11 3MANGL -5403CLEMENT RICHARD 1195511198103198910 2079 1.27 3MANGL -2799LOUBET HENRI 11955111980051995041249910473.33 3MANGL -8532LEDRU GERARD 11956 41975061992081868714506.76 3MCOMPT -6909NICOLAS SYLVIE MARIE FRANCOI21956 91977041992021471512026.04 3MALLEM -4518CLAUDE BRIGITTE 21956 21978041992021471512025.74 3CSANS -9477MERE MARIE LAURE 2195612199201199101 7803 7679.73 3.SANS -5508BATHIE PAUL 11957 31979051995041249910473.65 3MSANS -8413MARRONIERS ROBERT 11957111979121992011471512025.46 3MANGL -4314MAUGARNY VERONIQUE 21958 11978071992121471512026.22 3MTECHN -4329MAREUIL JEAN PAUL 11958 21981051994011471512025.56 3MVENTE -8123CANADA FRANCOIS 119581219940719930711389 9852.20 3MCOMPT -8870NEUVE JEAN FRANCOIS 11959 81978071992091471512025.02 3MTECHN -8119RAMPART PIERRE 11961121981061993051527112374.76 3MALLEM -7639ASSAS ERIC 119611019850119840111131 9657.96 3MANGL -7720SIFFRET PATRICK 11961 719870319870410791 9502.58 3MVENTE -5003PUYBERNARD DANIEL 119611119930419920410024 8999.03 3MSANS -8713VAGNE FREDERIQUE JOSEE 21961111982021981091608112916.97 3MANGL -1064CASSANYES JACQUES 11962121988061995011373711327.43 3MSANS -6331CORMIER MIREILLE 21962 51985091984091249910472.33 3MSANS -8037FARRERE JEAN LOUIS 11962 91987071992052529918967.97 3MVENTE -2186JOZON CLAUDINE 21963111984091992011949415051.54 3MSANS -6036VERQUIERES YVON 119641119880719911010407 9271.97 3MSANS -7970FOIRAIL MARC 119641119850319840310791 9502.86 3MALLEM -1484VICTORET NICOLE 21965 5199610199510 8359 7952.10 3MANGL -7412FLERS GUY 11965 219880219870210407 9270.06 3MSANS -3857DENIS BRIGITTE 21965 91993091992011202810240.55 3MESP -5856ILIZ THIERRY 119651119860519850510791 9503.61 3CALLEM -0008CESAR ERIC 11966 91987081986081249910472.87 3CANGL -8742MONTANT CATHERINE 21966 91993101992011202810240.28 3MALLEM -9552LACOMBE FRANCK 11966 51989021991121450311832.47 3MSANS -4423ROC CLAUDE 119671019931119930110024 8998.17 3MSANS -2631MORIZET SERGE 11967 51988041992051450311830.88 3CSANS -2963BEAUMONT PASCAL 11968 2199306199301 9597 8728.13 3MINFOR -1467OTTO JEAN 11968111991111990111467711987.67 3MANGL -9461BARREAU PHILIPPE 11968 11990011989011202810240.08 3MSANS -8108ARCANG PATRICK 11969 51990021989021381911365.41 3MSANS -7093HERAULTS DANIEL 1196911199408199308 9597 8728.82 3CSANS -3952LEDOUX VERONIQUE 21969 919910919900911389 9851.84 3MSANS -7563SUPER THI VIET 11971 21990081994011249910473.67 3MSANS -4441MIRAPOL DOMINIQUE 21971 819930619920611389 9851.34 3MSANS -2892LOTS THIERRY 11971 2199303199510 9597 8728.23 3MSANS -5535HOULGATES PASCAL 11971 6199607199507 7803 7681.13 3CSANS -2838PLAGE JEAN LUC ANDRE 11972 11992071991071420611638.68 3MTECHN -9036MERCEDES YVES 11972 51993101992101420611639.01 3CSANS -2537MONTSOURIS PATRICK EMILE 1197211199505199505 9597 8727.87 3MALLEM -0228AUBERTS JACQUES YVES 11972 6199404199201 9597 8729.43 3CVENTE -5626VERNEDE ROGER CL 11973 41994101993091450311831.06 3CSANS -6525AVES SYLVIANE 21973 2199204199104 8656 8145.93 3.TECHN -9781OLLIER ANNE MARIE 21973 619931119921111389 9850.97 3CSANS -1379ROSTAND PIERRE 11974 4199507199504 9126 8457.54 3MSANS -5204CRAVANT DOMINIQUE 11974 1199601199501 7803 7681.40 3CSANS -6619HORIZON JEAN MICHEL 1197410199606199506 7803 7681.44 3CANGL -5826VALBONNE ANTOINE 11974 71993091994081202810240.77 3CMICRO -0256GRANG DOMINIQUE 21974 5199508199408 7590 7563.95 3MTECHN -4230FAISANDERIE ANNE MARIE 21974 819930819920811389 9852.69 3MALLEM -4212ORME HERVE 11976 8199606199506 7803 7681.44 3CSANS -6753PINTADES HERVE 11977 9199608199508 7803 7679.99 3CANGL -7715VAILLANT CHANTAL 2193111198801199302 7677 7603.76 4.ALLEM -8632CLAIRETTES JACQUES 11935 51964081994011557012566.54 4MSANS -3535CASANOVA THIERRY 11936 91963081995112022115555.22 4MESP -1574AVENUE PIERRE ALAIN 11936 719890119920811131 9657.20 4MINFOR -4591VINCIN NICOLE 21939121966071993012137316332.68 4CSANS -3788POTERIE MICHEL 11939 81972061990011403411520.75 4MALLEM -0118BRETHON GUY 11939 419871119950310407 9270.03 4MSANS -2869LIMERGUE BRIGITTE 21939 91963041991072273717260.91 4CANGL -8403BOSQUET FABRICE 11939 81966071990011433211714.79 4MSANS -3617VATA JEAN 119401019930819910110407 9270.62 4MSANS -4772SAENS BERNARD 11940 719900519890510024 8999.04 4MSANS -3869MARIUS MIREILLE 21941 81961101995072137316330.70 4VESP -3900PERDONNET PHILIPPE 11941 119921219911210407 9270.44 4MSANS -7958CARDINALE ROSELYNE 21942 21963101992072137316331.25 4MSANS -9381LOTOS CAROLINE FREDERIQUE 21942 11968011990011932314934.90 4MESP -1020FLORIDE KATIA 21942 71972071993111834514276.10 4DSANS -9843MEON GERARD 11943 41973101991011621213032.20 4MSANS -0204GAILLARD CHRISTIANE 21944 71964071993012137316331.82 4MSANS -1733VUE CATHERINE 21944 61963111992072137316331.78 4MVENTE -6248AYGUESVIVES MICHELE 21944 41970071991071684813421.33 4MANGL -4598FEUILLERAIE JEAN MARIE 11945 219890119910610791 9502.23 4CSANS -3077SAPIAC ALAIN 11945 71971111991012470018542.09 4MANGL -2431RENAUDES NADINE 21946 61968111990012137316330.56 4CSANS -1120SATUR JOSIANE 21946 51969031990012137316331.03 4CSANS -0145ITALIENS EDITH 21946 81968111984062470018540.30 4CSANS -4624COURDIMANCHE JEAN LOUIS 11947 81968121989102273717259.95 4MTECHN -8599LONGCHAMP JOSETTE 21948 7199201199101 7803 7679.49 4.ANGL -3219SERNAGLIA FREDERIQUE 21948 51969031968031326611016.35 4MMICRO -7793ANATOLE ERIC 11948 519910119941010024 8998.50 4MSANS -4753VENT JEAN MARC 11948 61970011988012273717261.76 4MSANS -5892CHARLEROI MARTINE 21949101968111992091834514275.70 4DSANS -8687GOELETTES JEAN LOUIS 11950 91975041995011578112721.71 4MSANS -5669ADRIENNE CATHERINE 21950 61972101991072017815517.59 4CESP -2743CLAIR MARC 11950 11978031994011369311286.26 4MANGL -1234DAMPIERRE MICHELLE 21950111969081995042334017608.88 4MSANS -9403LECLERC CLAIRE 21951 71971071991042137316331.51 4MSANS -0934ENCLAVE JEAN CLAUDE 11951 21981051990041621213033.38 4MALLEM -9416BLEU JEAN CLAUDE 11951 21976051991011369311286.78 4MSANS -9196PYANDIERE MARIE NOELLE 21951 41982021981021326611016.03 4MSANS -3568MOISSAN JEAN PAUL 11952111976071991071578112723.29 4MALLEM -7750TONNELIERS MARIE 21952111973011993071471512024.35 4MINFOR -2095MARS BRIGITTE 21952 81984011992011288210744.49 4DMARKT -4777GORBIO MARIE DENISE 21953 61973061991011578112723.74 4MALLEM -8945VASSY MICHELLE 21953 11973051993041471512025.88 4MSANS -3712MAURUCHES PHILIPPE 11953 819860119850111131 9658.99 4MALLEM -6740EUZKADI JOEL 11953 11973031990071578112722.87 4MANGL -7024BRUSC EVELYNE 21953 71976041991121578112723.36 4MMICRO -8219INFIRMERIE JEAN PAUL 11954 91980051990101608112916.59 4MANGL -5540BRUAND DANIEL 11954 51974031993031684813422.75 4MANGL -7460MATISSE MARGIE 21954 61975041991101578112723.42 4MANGL -2655THEZAN MONIQUE 21954 91975081991091578112722.28 4MSANS -9672BORON ERIC 11955 51975081992102017815516.74 4MSANS -8145BOULETS DOMINIQUE 21956 1199105199005 9894 8921.63 4MSANS -3110CERF VALERIE 21956111993081992011249910472.37 4MTECHN -7652BAY PATRICK 11956 71976071992011578112722.47 4MCOMPT -4074FRANK DANIELLE 21957101992111991011202810241.17 4MSANS -4741ESCOUTADOU FRANCOISE MARIE 21957 2198901198505 8656 8145.06 4.ANGL -0933SOUCARRADE BEATRICE 21957 5199312199212 9894 8922.21 4MALLEM -7852CAILLOTS CLAUDINE 21958 71978091992091471512025.14 4MSANS -5344THEODORE CHRISTINE 2195811199310199210 7803 7680.44 4.SANS -8813MILLIERE BEATRICE FRANCOISE 21959 51981071980071202810241.36 4MSANS -5426NATIONS ISABELLE 21959101981111980111463211946.14 4MSANS -4656TILLET FRANCOISE 21960 71983041982041608112916.59 4CANGL -8524ALLIER ANNE MARIE 21960 1199209199109 8656 8146.28 4.SANS -0380MARAINVILLERS NATHALIE 21961 2199410199310 8656 8147.15 4CSANS -1404FAISANS ERIC 119611219830319830811131 9658.86 4CSANS -6501MERICOURT FRANCOISE 21961 519951119941110668 9426.09 4MANGL -4607CHAPPEL CHANTAL 21961 41982091981091330611017.46 4MANGL -1959PEY JOSIANE 21961111982111981111608112916.95 4MALLEM -8843TIMSIT HUBERT 11961 61982041988011326611017.25 4MSANS -1688BENOITE JEAN CLAUDE 11961 91987071992121249910472.51 4MTECHN -5712FOUENT VINCENT EMILE 11961101983071982071326611016.03 4MSANS -7184FRANCE RAYMOND 11961 419880319870310024 8998.35 4MINFOR -5235HAUTS YANNICK CLAUDE 11961 819871019861010791 9503.90 4MVENTE -6310PEYRIGOUE PATRICK 11962 81982031989071326611016.78 4MALLEM -5397COURCELLES MIREILLE 21962 9198810198505 8656 8145.89 4.SANS -4469PASSELEU CHRISTIANE 21962 41984011983011381911366.72 4MANGL -8234MAIAUX BRIGITTE 21963111991071991011249910473.22 4DANGL -9770JARD MINELLE ODILE 21963 91988111987111249910471.84 4MSANS -5324CERF CLAUDE 11964 419870719920510791 9503.34 4MSANS -9061ROMAGUE MARTINE 21964 71983111982111326611016.12 4CANGL -8920PORQUIER DANIELLE 21964 41987021986021527112374.66 4CALLEM -7098CHATENAY ANDRE 119641119841019831010791 9503.94 4CVENTE -8128PRECONIL YVES 11965 71988021987031527112373.94 4MSANS -6719KEFYSSIA CHANTAL 21965 319940619920111389 9851.03 4MSANS -6244MANGEON MICHELINE 21965 8199402199304 7803 7680.34 4MINFOR -3461LUCIA CHRISTIANE 2196610199308199208 8656 8145.56 4.ANGL -9241ROTOURS PIERRE 119661119900819890810024 8999.13 4CSANS -6268TOURING GENEVIEVE 21966 1199403199303 8359 7952.46 4MSANS -4829COLLES EMILE 11966 419910719900710024 8998.31 4MESP -0750CADET YVES 11966 919860419850410791 9503.79 4MTECHN -0057ESCALE THIERRY 11967 71989021988021450311831.93 4MSANS -9924CHINON BRIGITTE 21968 8199207199107 8656 8146.65 4.SANS -7821AILES CECILE 21968 41991051992111202810239.81 4CSANS -7114LANCIER WILMA 21968111994031992011202810241.07 4CESP -4765TILLEULS JEAN 11969 51992041994011249910472.59 4MINFOR -4429EDOUARD FRANCOIS 11969 319890419921010407 9272.09 4MINFOR -1431GIORDAN SONIA 21970 5199201199101 8656 8145.51 4MANGL -9920BOUIN CATHERINE 21970 919900419890410876 9502.28 4MSANS -5522AURELIA MARIE CHRISTINE 21971 31993031993051267210590.24 4MSANS -7479TRINITE NOEL 11971 3199604199504 7803 7680.36 4MSANS -3516GASPARDES KUMIKO 21971 41993061992061267210590.05 4MSANS -5784BOITE REMY 11972 819910619900610024 8998.26 4CANGL -1143MACORNAY ROGER 11972 6199212199112 9597 8728.58 4MSANS -0244FEUQUIERES CLAUDINE 21972 719921019911011389 9851.57 4MSANS -0161LONGAGES FREDERIC 11973 119920819910811389 9852.02 4MSANS -5206TISSOUS ELIANE 2197311199405199305 8359 7951.97 4CESP -6992FOUGERAIE JEAN YVES 119731119931219921211389 9852.45 4CSANS -3522REST ANNICK 21974 9199306199206 7803 7680.08 4.TECHN -9573FONTAINE CATHERINE JEANNE 21975 2199407199307 7803 7679.87 4CSANS -5048HAUTES JEAN RENE 11975 619961219951211389 9850.74 4CSANS -1152QUARTIER MARTINE 21975 6199408199308 9894 8921.41 4CSANS -0049LAUNAY NOUARA 21976 6199607199507 7803 7679.85 4CSANS -4557ROBARESSES HELENE 2197611199507199407 7803 7680.53 4CANGL -4244GEMEAUX DANIELE 21977 9199608199508 7803 7679.33 4CALLEM -0257PUNAAVIA GUY 11935 219930119920110407 9271.82 5MSANS -4173ALPINS FRANCOIS 1193510198811198505 8827 8263.65 5.SANS -5358CHEVRY JEAN DENIS 11936 9199503199201 9085 8418.03 5MCOMPT -4903WILSON SERGE 119361119890119930210791 9503.49 5CMANAG -2411BINEAU RENE 11937 41970081991011433211713.71 5MSANS -5097OURS MADELEINE 2193910198810198506 8656 8145.20 5.SANS -1099VILLAINE YAN CLAUDE 11939101968061990011433211713.58 5MINFOR -0060ATTAMRK CORINNE 21939 41962061983102470018542.06 5MSANS -7199LECONTE EDMOND 11940 51972061995012201216757.94 5MSANS -7870PIA PHILIPPE 11940 71967071991101433211715.00 5MSANS -4990ROSSAYS SERGE 11940 21963091988012273717260.31 5MSANS -3381BUSSEROLLES ISABELLE 21940 8199505199201 9085 8418.09 5DSANS -0099RAHAL PHILIPPE 11940 11961051984062470018541.16 5MSANS -5909TOURRETTES LILIANE 21940 91961101983102470018540.93 5MTECHN -8941BEZIERS CLAUDE 21941 11961051992102137316332.72 5MSANS -7223CHARMETTES MARCO 11941 41972091991011433211714.06 5MSANS -8980LARMINAT FRANCOISE 21941 4198910198512 8656 8146.16 5.INFOR -1164PROVENCAL NICOLE ALIX 21942 91968101991072273717260.89 5CSANS -7010DELOISON SYLVIA 21942 51968121991101932314934.72 5MSANS -3304ROSES MARIE THERESE 21942 81968091993111834514275.11 5MSANS -7469BUTTE MARIE FRANCE 21943 21962121991072273717261.13 5MSANS -8184VANNES MARC 11943 11971051994011621213032.96 5MSANS -1647CLAIRES CEDRIC 11944121969011991011433211713.67 5MTECHN -0926BEACH CLAUDE 21944 41970041991101932314934.45 5MANGL -3781COULANGES CHRISTINE 21944 61965021992091932314934.21 5VSANS -7004GUILBAUD MARTINE 21944 41966061995042137316330.61 5MSANS -5511CAPUCINS JACQUELINE 21944 41965121990082470018540.74 5MSANS -0535OLLIERES MARIE JOSE 21944111964071993072137316331.95 5DALLEM -6700DOLET FREDERIC 11944 91973041992011403411521.64 5MSANS -9005SUCE LYDIE 21945111977061992011471512025.50 5MTECHN -2933PEGOMAS MONIQUE 21945 81982061981061326611016.62 5VALLEM -1543GATTIERES MICHEL 11945 81970091991041433211715.59 5MSANS -0725AUBIERS PHILIPPE 11945 91976051993011369311286.75 5MANGL -2098ENTREES ANNY 21945101968061994102666519899.56 5MSANS -8761WAGRAM JEAN FRANCOIS 11946 21971101988061932314935.35 5MTECHN -2003PAULINE AGNES 21947 2199303199203 8656 8146.59 5.SANS -1732RELAIS GILLES 11948 31970031993111834514274.96 5MSANS -6970THIERS MICHEL 11948 71970101994071834514274.42 5MALLEM -4216HUGO FRANK 11948 21971031991012990722149.47 5DALLEM -6627ABBAYE GERALD 11948 619810319800311389 9850.65 5MANGL -5230DUNANT PHILIPPE 11948121983101993041326611016.87 5MANGL -2460POINTE DENIS 11949 51975081992011578112722.47 5MANGL -7858ARBONNE FRANCIS 11949 71974081992012470018541.70 5MSANS -3903CHAMPAUBERT PIERRE J 11949 41976101992011369311286.24 5MANGL -8857DIVE MYRIAM 2195012199311199211 8656 8146.88 5.SANS -0497KARINE JEANNINE 21950 5199311199211 7677 7604.39 5.SANS -3876SANGUINAIRES FLORENCE 21950111970021991091834514275.86 5MTECHN -3265PAVILLON PHILIPPE OLIVIER 11950111970041987102470018542.13 5MSANS -2421VERDIER MARTINE 21950 41970071994031834514274.80 5MANGL -8685PROVENCALES JEAN MICHEL 11950 11978061992121471512026.06 5CANGL -6880CHARONNE GISELLE 21950 21971031994071834514275.47 5MCOMPT -3995BELLEVUE CHANTAL 21950101977011992011471512024.48 5MSANS -1936MANHASSET JULES 11951 31970101991021834514276.22 5MVENTE -8771MAURIN JEAN MICHEL 119511119930819910110791 9503.74 5CSANS -8918MORON DANIEL 11951101971031986072470018541.02 5MCOMPT -7486HAUTACAM JEAN PIERRE 11951 11979061992011249910472.78 5MSANS -8979PARE LUCIEN 11952 41973071991041578112723.72 5MSANS -8316MOUSLIM PASCAL 11952 31972051990071621213032.39 5CSANS -0252AUNES CLAUDINE 21952 71972051992111684813421.69 5MALLEM -4525CHAVONNES FRANCOIS 11952 31976111992071578112721.79 5CANGL -2153CROULEBARBE JEAN JACQUES 11952111972121994011684813423.34 5MSANS -4523PITARD JACQUES 11952 91973081990123417325097.24 5MSANS -0877MILLION CLAUDE 11952 31974121992012017815516.65 5MALLEM -0553CRABERE HERVE 11953 91979051992121471512025.97 5DANGL -4593COLLINES FRANCOISE 21953 81973051994031911114779.59 5CSANS -5525MILLY JEAN HUGUES 11953 11976091991012022115555.39 5MSANS -8419CREMIEUX CHRISTIAN 11953 71972071991072137316332.68 5MSANS -5466CHENEY JOSE 11953101977031994011578112723.31 5MALLEM -8647MOTHE DOMINIQUE 11953 21984071992051326611017.10 5MVENTE -7550BORDEAUX GILBERT 11953 8199006198709 8656 8146.61 5.VENTE -5317SIMAREGRE MARION 21954 21975081993071608112916.88 5MSANS -7895BEAULIEU ALAIN 11954 41982031994011471512025.55 5MSANS -7110BRUNES MICHELINE 21954 91977011994011471512024.69 5MSANS -9833MOULINS FLORENCE 21954 3197505197405 8530 8066.58 5MSANS -9346RIVIERE BRIAN 11955 31980081992011249910473.42 5MESP -3155ALAUDA CATHERINE 21955 51977051993071471512025.55 5MSANS -4303MARJORIS PATRICK 11955121980041992121369311286.96 5MSANS -8955LACRETELLE ANNE 21955 419960719950710668 9426.57 5DSANS -0292ENCLOS CHANTAL 21956101977071977041834514275.97 5MVENTE -7044ENGHIEN GERARD 11956 11978061992041369311286.93 5DESP -3352LOZERE SERGE 11957 81983021991092529918968.46 5MANGL -7626HENIN PHILIPPE 11957101986081993011168610046.99 5MALLEM -1198MARTYRS WILLIAM RENE 11957121977031991052043315671.24 5CSANS -4601CEYZERIEU PHILIPPE 11958101979121987111684813421.72 5MSANS -6850BEAUSOLEIL BRIGITTE 21958 81981031986021527112374.79 5MANGL -0505CLAPIERS MARIE CLAUDE 2195810199403199303 9126 8456.57 5MSANS -6127MONTEE CHRISTINE 21958 31980091994071471512024.15 5MSANS -4080FOCH SERGE 11959 319810319810511131 9658.24 5MSANS -8151ECUREUIL OLIVIER 11959 21989071996012815620945.31 5.TECHN -2121BOURDAILLERIE SIMONE 21959 11979071993041471512024.56 5MSANS -5078FERNAND ANNE MARIE 2195912199110198510 8656 8146.61 5.SANS -2667BERGERE PIERRE 11959 51978061985041684813422.48 5MANGL -2407SOLEIL NADIA INGRID 21959 61989061988061249910472.73 5MTECHN -2235VILLEMARECHAL GERARD 11959 61983061989121326611017.72 5CINFOR -0110ANDRE NADIA 21959 319930519920510363 9233.61 5MANGL -4644AVIGNON CHARLES 11959 519830319920611131 9657.56 5MANGL -7070MONGE HONORINE 21960111980051985061608112916.23 5MSANS -8043EGAL LIVIA 21960 11985101984101288210744.85 5CTECHN -5249THEODULE REMY 11960 41987051991041949415052.11 5MALLEM -7737CLUB ISABELLE ANDREE 21960111980061994011471512025.77 5MANGL -3853DZOANH CHRISTOPHE 11960 61988101994041288210744.58 5MANGL -2653MARSACQ CLAUDE 11960 31985111984112256617146.01 5MTECHN -6452POSTFACH ALAIN 11961 31985081984081288210744.98 5MTECHN -0681LOGE PASCAL 11961 11985031991021527112372.86 5MSANS -9537JEAN MICHEL 11961 31988061991121249910471.84 5MVENTE -6327NOUES ANTOINE 11961121982101981101608112916.14 5MSANS -6682VATONNE BRIGITTE 21961 71982011981011608112916.65 5MSANS -9847GAMBADES JOCELYNE 21961101982011981011288210744.17 5MANGL -6375GAUTIER CLAUDUNE 21961101984071994011450311832.63 5CINFOR -6651RIVA PIERRE 11961 919830619820611131 9657.62 5MSANS -1485REUILLY JOSETTE 2196212198901198603 8656 8146.41 5.ALLEM -9501BETHUME MICHEL 11962 81985031993041326611016.65 5MSANS -9435PROVENCE JEAN MARC ROBERT 11962 919940919920110024 8999.30 5CSANS -6492VENDELAIS DANIEL 11963 119830419820411131 9657.66 5CINFOR -9242REVELLATA BRUNO 11963111987071993041288210744.41 5MSANS -4454ETANG BEATRICE 21963 31983081982081326611017.61 5MESP -7265AMPHYTRION JOEL 11963 31990091993041249910472.78 5CSANS -2299ADRIAN ALAIN 11963121988101987101288210745.70 5MESP -8642ALE MYRIAM 219631219940719930411389 9851.34 5MALLEM -9850BOULOURIS CHARLY BERTRAND 11963121987091986092090215980.25 5MINFOR -3445COLOMBE SYLVIE 21964 319870619860611389 9850.74 5MSANS -1844GUY PAUL 11964121985121994011433211715.27 5MANGL -7102QUINQUENAIS MICHEL 11964101984091994041574112685.17 5MSANS -1584KERVENEL JEAN CLAUDE 11964 71984061987121288210745.76 5MANGL -2604LIBERATION FRANCOIS DANIEL 11964 819841019840810791 9503.36 5MSANS -0403HERMITTE PHILIPPE 11964 61983051993051527112374.04 5MSANS -5722CHATAIGNERAIE LIONEL 11964 91983121992061527112373.67 5MSANS -3237HUYMANS MICHEL 11964 21984021990011527112372.81 5MALLEM -5398TASSIGNY CHANTAL 21964 51988111987112090215981.24 5MSANS -1027VRAUX PHILIPPE CLAUDE 11965 91993091993031202810240.76 5MSANS -3198BERIN DENIS 11965 81987011994091693613499.07 5MANGL -1036MADAME EDOUARD 11965 81986091985091288210744.77 5CSANS -6124ABELIAS DELIA 21965 519940919930411389 9850.65 5MSANS -1462BLANCHE MARIE FRANCE 219651219940319930311389 9852.60 5MTECHN -0587ORMEAU GENEVIEVE 21965 51990011989011249910471.76 5CSANS -8260BROSSAY JEAN PIERRE 11965 319931119911010407 9270.24 5MESP -8146BROC ANDRE PAUL 11966 319940219920110024 8998.37 5MANGL -8310HOTTINGUER ISABELLE MADELEINE 21966 1198906198512 8656 8145.98 5.INFOR -6654TAHITI MARIE LOUISE 21966 6199501199401 9597 8729.13 5MSANS -5470LAGARDELLE XAVIER 119661119900719890710407 9271.97 5MSANS -8823ROUCHERETS EVELYNE 21966 61985101984101249910472.06 5MTECHN -8327BARRELLET PASCAL 11966 41987021993121288210743.92 5MTECHN -8879GROULT ANNE MARIE 21966 41993011991011202810241.70 5CANGL -5928DREZERY ALAIN 11966 91989081988081539912453.11 5MSANS -3229THOMAS SABINE DOMINIQUE 219671019940519920111389 9852.59 5MTECHN -1136BRECHE MARIE AGNE 21967 3199601199501 9126 8456.70 5MANGL -5446POMMERAIE GUY 11967 8199606199506 8656 8145.80 5MSANS -0654CARAVELLES ROBERT AH 11967 81989071989021450311831.55 5MANGL -0015TAVANNES LOAN 21967 419930619920610024 8999.72 5MINFOR -8197NETTER GILBERT 11967 61987051994041249910472.06 5MSANS -5236PASSERO MARC 11967 8199309199209 9085 8418.26 5CSANS -3054WILSON GERARD 11967 119870919860910407 9272.09 5MSANS -9725GUILHEM DANIEL 11967111990021989021539912451.67 5MSANS -6092CLEME MARIE CHANTAL 21968 3199201199101 8656 8146.46 5.SANS -2456HOLBERN FREDERIC 11968 2198902198802 7207 7448.96 5.ANGL -6716VILLERSEXEL TANGI FRANCOIS 11968 2199306199206 9597 8727.78 5MSANS -6119RAVAS ANNE MARIE 21968 6199502199402 8656 8146.19 5MSANS -2294VILLAGE SYLVAINE 21968 91992041991041202810240.68 5MINFOR -8140CAMIN JEAN MARCEL 11968 51988121993121249910473.45 5CANGL -7302MERIDIEN MAURICE 11968 219880519910210407 9271.32 5MANGL -7914JOLI MAURICE 11969 31989041992121249910472.06 5MANGL -2148ESPAGNE BRUNO 11969 819920319910310024 8999.36 5MSANS -1823BOUCICAULT NICOLE 21969 519941019930411389 9851.82 5MSANS -9657MAGESCQ EMMANUEL 119691119920519941010024 8999.97 5CSANS -9896MIO JEAN 11969 11991101990101330611017.19 5MTECHN -8478SOURCE SIDNEY 11969 61989041988101249910473.49 5LSANS -6336HASARD ERIC 11969 4199305199205 9597 8729.63 5CANGL -5471LEVAINVILLE LAURENT 1197011199301199201 9597 8729.97 5MVENTE -5314HALLES JACQUES 11970121991101990101467711985.86 5MSANS -1685NORMANDIE MICHEL 11970 319900719890710024 8999.40 5CANGL -6830LAOUADIE GWENAELLE 21970 2199608199508 8359 7953.65 5MTECHN -1727CAUVETS MARTIAL 11970 7199311199409 9597 8728.99 5CSANS -5830BRIOLLAY JEAN PAUL 11970 21991011994011249910473.24 5MINFOR -8526CAMPION FRANCOISE 21970101991111990111202810240.91 5MANGL -6622TANANARIVE GILBERT 11971 51992071992091330611016.75 5CSANS -7788JOCELYN CHRISTIAN 11971 6199302199202 9597 8728.05 5CESP -2781SAFRENIER PIERRE 11971 8199301199201 9597 8729.63 5CSANS -6277PAULEL HERVE 1197112199403199201 9597 8729.54 5MANGL -6618NOTRE PIERRE 11972 519930919920910363 9232.44 5MSANS -6648SAKAKINI BERNARD 11972 319920419910911389 9851.24 5MANGL -8593JULLIEN JEAN PIERRE 11972 8199604199504 9894 8922.45 5CVENTE -8229CHANTELOUP CHANTAL 21972 11992101991101420611637.21 5MSANS -8361OUCHES FRANOISE 21972 4199508199408 7803 7680.80 5CSANS -3075LUMIO JEAN LUC 11972 41991111994011249910472.52 5LSANS -5865FERROLLES MARIE CECILE 2197210199403199303 7803 7680.27 5MCOMPT -0134SEVRES DOMINIQUE 11973 5199507199407 7803 7679.72 5CTECHN -4254HENIN SERGE 11973 3199409199510 9597 8728.17 5CSANS -8695AMBASSADE MARIE BEATRICE 21973 8199605199505 7803 7680.62 5CALLEM -4411DAVOUST FRANCIS ALAIN 11973 719930419940711389 9851.73 5CCOMPT -3332COUST JEAN PIERRE FLORENT 11973 2199507199407 7803 7679.46 5CSANS -4946SAUVAGE PATRICIA 21974 5199604199504 7803 7680.77 5MSANS -1918BABY DOMINIQUE 21974 519941019950810668 9425.45 5MINFOR -6316CORENTIN MARTINE RENEE 21974 119930919920911389 9851.84 5CANGL -3700PROSPER MARTINE 21974 4199508199408 7464 7524.42 5CANGL -2405COUDUN WALID 1197411199605199505 7803 7679.55 5CALLEM -7545DELEY MARTINE 21975 2199606199506 7803 7679.91 5MSANS -3372HARRETCHEVERRIA FRANCISCO 11975 3199506199406 9894 8921.49 5CALLEM -4733SIMON CATHERINE 21975 9199608199508 7464 7525.73 5CESP -3419LAVIROTTE MICHELE 2197510199507199407 7803 7679.76 5CALLEM -3469VASNIER CORINNE 21976 6199607199507 7803 7679.73 5CSANS -7472VERLAI JEAN MARIE 11977 3199606199506 7803 7680.84 5CSANS -5601PEYNIBLOU ROBERT 11977 1199606199506 7803 7680.44 5CANGL -3668NARCISSES MARIE FRANCE 21977 9199606199506 7803 7681.07 5CSANS -9202GARE BRIGITTE MARIE MADEL21977 3199507199407 7803 7679.58 5CTECHN -4110KEROUAL FABRICE 1197711199607199507 7803 7679.54 5CSANS -3531OUCHE ALAIN 11935 31965081995011557012568.13 6MSANS -3428DAUPHINS NOUNA 21935 81967011990071578112723.50 6MSANS -8594BAIE JACQUES 11936 51962021994033844228045.97 6MALLEM -1267ORGE GERARD 11938 41964041994011557012567.81 6MSANS -7513PINSONS PATRICK 11938 41963071995082947921839.78 6MSANS -4234DORMANT CHANTAL 21939 71970011991011932314934.66 6CINFOR -4904PANORAMIC LAURENCE 21940 9198901198610 8656 8146.50 6.SANS -3727GUYNEMER VERONIQUE 21940 51972051989101621213032.21 6CSANS -8364COUDERC ANNICK 21941111973101990071621213033.61 6CANGL -1743VALLEES GERARD 11941 71970041995062470018540.61 6MANGL -5058LIBERATION THIERRY 11941111973101991011403411521.37 6MSANS -8875BRAILLE CLAUDE 11941 71974041989101834514274.74 6MSANS -5325HESPERIDES JACQUES 11942 81963041991072273717260.64 6MANGL -9083PONS JEANNE 21942111972101994041894014662.64 6MSANS -3082SIROIS JEAN 11942 11965111989071663613342.67 6MANGL -0164ENCRABE DOMINIQUE MARIE 21942 8198810198410 8656 8145.03 6.ANGL -5264PARLY MARIE HELENE 21943 61963031993032922321685.16 6MANGL -3102GRDE GERARD 11943 11966061991012470018540.24 6MANGL -6225GRAVAS GILBERT 119431219750819881211389 9852.47 6MINFOR -0486TOCQUEVILLE MICHEL 11943 71965061990012470018541.72 6MSANS -6103DAUDIN MICHEL 11943 31971081991071433211713.97 6MANGL -9562JULES MARYSE 21943 71962091984062470018540.75 6VANGL -1659EVANS MARIE NOELLE 21944 21963121994072137316331.91 6MSANS -5753SAXE BERNARD 11944 51964111985063200223582.85 6MSANS -5551AMBROISE GILES 11944 21972081991012470018541.97 6MSANS -2734FELICE PHILIPPE 11945 91970051991011433211715.24 6MSANS -2627SAVIGNY ANDRE AUGUSTE 11945 71964121990052470018542.04 6MSANS -2707VAUGIRARD HELENE 21945 8199407199307 7590 7562.63 6MSANS -0420DARDOUNELLES DANIEL 11945 21971021990011433211714.52 6MINFOR -0574JAURES MARC 11946101972081994011663613343.70 6MANGL -4658BORA JEAN PIERRE 11946 31973091992011403411520.69 6MMARKT -2852BERLIOZ PASCAL ALAIN 11946121969111991012273717260.45 6MSANS -9183STATION BERNARD 11947 61976101991011283810705.62 6MSANS -7225BONSECOURS ANNE 21947 51976071993111471512024.74 6DSANS -5915ANTILLES ISABELLE 21948 61969081995101433211714.47 6MSANS -7173GIOTERAIE ROBERT 11948 61967111986042470018541.91 6MANGL -7940NICOT ERIC 11949121974041992011403411520.15 6MSANS -6066CLEMENCEAU YVES 11949 31971041995012201216756.31 6MSANS -8113VITRY DOMINIQUE 21949 7199311199211 9597 8728.28 6DVENTE -6047TASSIGNY THIERRY 11950 41973081994122470018541.72 6MTECHN -9002BERRAT BRUNO 11950 51977051993041369311286.29 6CANGL -8038AUDIBERT PATRICK 11950 719770119931211389 9850.58 6MINFOR -4759BLANCHE MAYAKO 21950 51970101991071578112723.11 6MSANS -6982CYRANO DANIELLE 21950 51974111991071578112723.74 6CANGL -9782BARRAGE CLAUDINE 21950 3199109198902 8656 8146.01 6.ANGL -4552ABBADIE MONIQUE 21950 61976011991101578112722.87 6MANGL -3112AGENT DANIELLE 21950 11993121992011202810240.31 6MESP -4893GRANDE ISABELLE 2195012199507199301 7677 7604.70 6MINFOR -6863FERTE MARIE JOSE 21950 71970101991012137316330.65 6MINFOR -3487TALARIC MICHELINE 21950 21973101991071578112722.51 6MANGL -7125FERRAYONN JEAN MICHEL SERGE 11951101977101994041249910473.47 6MVENTE -5445RON DOMINIQUE 11951121971101991013200223582.31 6MSANS -0070PLASCASSIER DANIEL 11951121975051991011369311286.30 6MSANS -0688PARGAMINIERE JEAN 11951101976061993011369311286.15 6MSANS -0032FOUR CLAUDE 11951 61975111991011684813421.95 6MCOMPT -2442BOULOC MARIE FRANCOISE 21951 31974051986052334017609.66 6MALLEM -3898KENNEDY YVES 11951121977101991011369311287.25 6MANGL -8228LEFRANC JEAN LOUIS 119521219931119910110791 9502.26 6MSANS -7142LEGER VINCENT 11952 81976051991011684813421.99 6MANGL -0571DOMINICAINES JERZY 11952 31971101991013200223582.94 6MSANS -0382KERHAM CATHERINE 21952 21974041991071578112722.07 6MSANS -8150BEARN FRANCK 11952 21982091993011527112372.87 6MSANS -7995BAUDIN DANIEL 11953 91975051994011369311287.19 6MSANS -4159CHASSENARD JEAN BERNARD 11953 519870619860610791 9503.21 6MSANS -3964FAREMOUTIERS LAURENCE 21953 6199311199211 8656 8145.08 6MSANS -0454CHERBOURG ISABELLE 21953 6199610199510 7803 7679.81 6MVENTE -5111CROIZAT CHRISTOPHE 11953111973031990071578112722.69 6MALLEM -2014LISIERE XAVIER 11953 8198911199501 9894 8923.22 6MSANS -9741PARIS PASCAL ELIE 11954101978081991012022115555.53 6MTECHN -0737YERRES GERARD 11954 61976091995042529918968.84 6MTECHN -3053TORRE PAULE 21955 91976061995101881314585.97 6MVENTE -2120CORMEILLE JEAN LUC 11955 5199610199510 8656 8146.74 6MSANS -1540PIJOUNIE ANGELE 21956 51977021981091834514274.87 6MANGL -6259VICQ CATHERINE COLETTE 21956 219780719770710668 9425.82 6MSANS -8345DAGOBERT DJARN 11956 719820919871111131 9658.24 6MINFOR -3734GARNIER PASCAL FRANCOIS 11956101977081994042201216756.71 6MSANS -4365ESSO ANTOINE 11956121976061994011369311288.10 6MSANS -0262ROLLAT HERVE 11956111979081991012175716601.93 6MSANS -7989RHONE YVES 11956 71977051994041249910472.06 6MANGL -4035ISLIP ANNIE CLAUDE 21957 41993101992011249910472.06 6MINFOR -8638DUNOIS JACQUES 11957 51981031995062273717260.50 6MINFOR -6417ALBI RENE 11957111980091993121369311288.04 6MANGL -7559MARIENTHAL MONIQUE 21958 319940919930411389 9852.59 6MSANS -1621CAMBRIDGE ALAIN 11958 8199312199212 9597 8729.04 6MINFOR -3476CREPY ALICE 2195811198711198611 9511 8688.22 6MSANS -2482CHORON EVELYNE 21958 7199110199409 8656 8145.42 6.SANS -4165BALZAC MICHEL 11958 71985121995011433211713.76 6MSANS -9040FERDINAND CHARLES 119581219781019771011389 9852.24 6MANGL -6858CUVRAY MARTINE 21959 71980041994011471512025.82 6MMARKT -2723PAPARA FRANCOISE 21959 61980051994011471512025.70 6MTECHN -1222FOSSES MONIQUE 21959 21980041993121804514081.78 6MTECHN -8741BOULEVARD MICHEL JACQUES 11959 91979021993041471512024.62 6MTECHN -5441ZOLA BRIGITTE 21959111979081993071471512025.82 6MINFOR -9947ERMITA CATHERINE 21959 81982081981081326611017.38 6MSANS -2563FLORISSANT PHILIPPE 11959 51981071989052256617145.21 6MMANAG -3583MOLLAY JEROME 11959 81981031993051608112916.41 6MALLEM -6466ORMES ANNIE 21961 21981081995071433211713.85 6MALLEM -1432AGRIANT ROBERT 11961 31984031991091527112372.83 6MCOMPT -3657NOVEMBRE SERGE 11961 51986071992101527112374.36 6MSANS -5054FRANCK HUGUES 11961111984031983031608112915.87 6MALLEM -7313CRESTET JEAN PIERRE 11961 41984091994091326611017.55 6MSANS -1383ORIOL ANNE 21961 61983021982021288210744.01 6DSANS -9235DANTE JEAN MARIE 11962 71984031993081527112374.13 6MANGL -1924MALVEZIN MARTINE 21962111984071983071608112915.47 6MSANS -0722MUSSE JOELLE 21962101982081981081608112916.65 6MMICRO -2536BEAUSOLEIL DOMINIQUE 11962 219830419851210791 9502.17 6MSANS -3286DEEPFIELD GERALD 11962 319930819921210876 9502.09 6CSANS -9760CHAMPET MARTINE 21962121988101987101202810241.67 6DTECHN -0459FERRAILLONS NICOLAS 11962 819850919840910791 9501.95 6MSANS -9070ROUGUETS JEAN RENAUD 11962 919920519910510024 8999.54 6MSANS -5609MONNEGER GEORGES 11962 61984101993051527112374.00 6MALLEM -8699COLMAR CATHERINE 21962 21988061987061202810241.09 6MINFOR -0121PARAY JEAN FRANCOIS 11963 219830419920311131 9658.07 6MVENTE -9033TIMBAL FRANCOIS 11963 91991021991022529918969.60 6MSANS -0477HORTENSE ALAIN 11963 51984021992101527112374.84 6CSANS -9565CARRETIER JOSE 11963 81986121992121450311830.53 6MINFOR -5210BARTHOU PASCAL 11963 319850419850511131 9657.21 6MANGL -7365GALLAIS PATRICE 11963101984031983081288210745.79 6MSANS -3436TADJOURAH PATRICK 11964 51984061991011288210744.35 6MTECHN -0043HILLS JEAN MARC 11964 719840619830610791 9503.67 6SSANS -6646ROOSEVELT FLORENCE ANNICK 21964 51989111988111249910472.39 6MESP -5680PORSMORIC MARIE MADELEINE 21964 31983041982041326611017.97 6MANGL -6503MONCEY JEAN PAUL 11964 319940219930110024 8998.77 6MALLEM -9162BROSSOLETTE MARYVONNE 21964 91984111983111288210744.28 6MSANS -5895QUATRE DANIEL 11964 31984101993011616712994.89 6MSANS -3689ETOILE ALAIN 11965 31985051992011527112374.54 6MSANS -6754MAXIMIN JEROME 119651119930819920811389 9851.10 6MANGL -1818BOYARDVILLE KINEO 11965 919850519840510791 9501.83 6MALLEM -6998HONORE PATRICIA 21965 31989051994011381911366.18 6DSANS -0086COLLETTE SERGE 11965 41985091991121288210744.14 6MALLEM -2914ESPAGNET ERWAN 11965 21984051983051288210744.17 6MSANS -9284COLIBRIS JEAN JACQUES 11965 41993101992101330611018.00 6MTECHN -5732LEUTHREAU ALAIN CHRISTIAN 11965 11987081992011450311831.39 6MSANS -7234MARDELLE ROGER 11965 81986041993051450311832.14 6MALLEM -2688TILLEUL FREDERIC 11965 619930719940110876 9503.04 6MSANS -6325MIGNEAUX FRANCOIS 11965 419940119920110407 9270.44 6MANGL -0520PIBRAC STEPHANE 11965 219850819840810791 9503.76 6MSANS -5142HUBIES BRIGITTE NOELLE 21966 41991071990071202810241.79 6MCOMPT -2662PEYLONG GHISLAINE 21966 9199201199101 7803 7680.36 6.SANS -5787PRADIER PHILIPPE 11966 11987051994091693613499.34 6MALLEM -0594PARK GILLES 11967 11989101988101249910472.52 6MSANS -9155VIADIEU DIDIER 119671219940419920110024 8998.50 6MSANS -9944STRASBOURG ROBERT 11967121993061992061267210590.24 6MALLEM -0751MONTDAUPHIN CLAUDE 11967 819910319950610024 8998.80 6CANGL -6596INFROIT STEPHEN 11967 41990011994011249910473.45 6MSANS -2539CARTHY ANNICK 21967 41994071992011202810241.09 6MSANS -9966ENFERT BRIGITTE 21967 919930719920711389 9851.37 6MALLEM -8934REGNIER ANNICK 219671019950319930411389 9851.96 6MALLEM -1654LEADER MICHEL 11967101995101994101839014312.60 6CANGL -7794ANEMONES EVELYNE FRANCOISE 21968 11993031991011202810241.66 6MTECHN -5095BLAIRE MARIE JOSE 21968111989101988101539912453.06 6CSANS -3446RICHOIN JEAN PIERRE 11968121990091994121450311832.51 6MINFOR -0591FERON CHRISTINE 21968101994031992011202810240.76 6CSANS -6142SORBIERS ROSWITHA 21968 81993061992061267210589.60 6CSANS -4698JEAN GERARD 11969 51989101991091249910472.96 6MTECHN -9192SAVIGNE ALAIN 11969 31991011990011202810240.26 6MESP -0014NANTAUX ETIENNE 11969121994061992011202810240.46 6MANGL -6632JULLIAN FREDERIC 11969 9199102199002 8656 8145.20 6.SANS -1053MORTIER GUY 11969111992121991121330611016.35 6CALLEM -3261SUCHET MARIE THERESE 21969111994031992011202810239.91 6MSANS -4711BLANCHE ALAIN 11969121992121993031267210589.55 6MCOMPT -5942FLOREAL JEAN PAUL 11969 11990111989111381911366.49 6CVENTE -1744ESPAGNE JEAN PAUL 11969 119900219890210024 8998.41 6MESP -7503TOUCHARD ANNE MARIE 21970 21990111989111202810241.57 6MSANS -2585ESTIENNES JEAN 11970111993111992111330611018.18 6MANGL -8805CHENIER ROBERT 11970 71992071991071420611638.05 6MSANS -7438ROSELINES SYLVIE 21970101994031992011202810240.72 6CSANS -6724POTHONNIER MARIE JEANNE 2197011199206199106 8656 8146.42 6.SANS -5056POINCARRE KARINE 21970111994031992011202810241.45 6MINFOR -2915REILLE MICHEL 11970 7199602199502 9256 8533.59 6CANGL -3988ATALANTE BRUNO YVES 1197012199402199302 9597 8728.68 6CANGL -3548JOURDAN GUY 11970101994061992011202810240.35 6CALLEM -1071CHAROLLES JACQUES 11970 1199306199206 9597 8728.82 6CINFOR -7830BOCH BERNARD 11970 3199304199308 9597 8729.09 6CINFOR -7543REIN PIERRE 11970 9199501199401 8656 8146.05 6MSANS -0754ELANS EVELYNE 21970 5199010198910 8656 8146.07 6.SANS -0414CHARDON HERVE 119711019931019921011389 9852.65 6MESP -3628VILLACOUBLAY PHILIPPE 11971 919930319920311389 9851.12 6MALLEM -0150ADDAX MICHEL 119711219940719920110024 8999.70 6CVENTE -9176CAHEN HUGUES JEAN LUC 11971 219921019911011389 9852.24 6CSANS -2846COOLE SERGE 11971 1199403199201 9597 8729.70 6CSANS -2967LANCIERS KLAUS 11972 819930319920311389 9851.59 6CANGL -5218EXELMANS JEAN JACQUES 11972 1199210199101 9597 8727.83 6MMICRO -5276ALLEE JEAN JACQUES 11972 519931219921210363 9233.79 6MALLEM -7650FARLED DANIEL 119721119941219931210363 9232.28 6MTECHN -1760COURTILLE FLORENCE CLAUDE 21972 419940819920111389 9851.61 6MSANS -0061FLORIDA CLAUDE 21972 719930519920511389 9851.24 6CANGL -4799DUBAN REMY 11973121993011994011202810240.82 6CSANS -5516LUZAC BERNARD 11973 5199606199506 7803 7680.27 6CMICRO -2886KERINEL PATRICK 1197311199309199209 9126 8456.47 6CALLEM -2318BURNOL MICHEL 11973 6199310199210 9597 8729.58 6CALLEM -2243BASCH GEORGETTE 21973 319930919920911389 9852.41 6MSANS -9674JAUNE SANDRINE 219731219951219941210668 9426.66 6MVENTE -3507CAMPANULES GERALDINE 21973111994031993031267210590.14 6CTECHN -8457ROAD MARTINE 21974 719940619930610668 9426.03 6MSANS -5644PERROQUETS PHILIPPE ANDRE 11974 3199407199307 9126 8455.98 6MANGL -5222PASTEUR CLAUDE 11974 3199606199304 9126 8456.34 6CTECHN -2362GORBELLA ANNIE 21974 21994091994071450311830.61 6CANGL -3214NELSON JEAN YVES 11974 2199412199312 8359 7953.60 6CINFOR -2883CHEIRON MICHEL 1197511199611199511 9256 8532.96 6CSANS -3892LENNON NICOLE 21975 3199207199307 7803 7681.02 6.INFOR -2980ROASSAL JEAN MARC 11975 7199507199407 7803 7680.67 6CTECHN -3954BARONNETTE FRANCOISE 2197612199610199510 7803 7680.59 6CANGL -8734MARGUERITE ANNIE 21977 6199606199506 7803 7679.49 6CSANS -2986ROURE CLAUDE 11977 8199608199508 7803 7679.40 6CSANS -2812FABIEN CATHERINE SYLVIE 21930 1198905199501 8827 8264.04 7.SANS -4059LECOURBE FREDERIQUE 21935 41961101982052470018540.38 7VSANS -3810LACS ELIANE 21935 51961111987012273717261.07 7MANGL -1179VIES FRANCOISE 21935 1199306199501 8656 8146.82 7.TECHN -4536CAPUCINS JEAN PIERRE 11936 61958121993103200223584.44 7MSANS -5665CAMOIN MARIE CLAUDE 21936 8198910198511 8656 8145.15 7.SANS -5858BONODIERE MARIE CECILE 21937 41962071985102273717261.25 7MALLEM -3737MAREY ANDRE 11937101973071992011403411520.80 7MALLEM -3343ECLUSE SERGE 11939 21970081995062201216755.92 7MMARKT -7410MONNETIER MARIE JOSEPH GEORGE 21939 51963051991072273717260.50 7MANGL -9145ULI MARC 11940 31969061991011433211714.60 7MALLEM -4704MANOLA MICHELLE 21941 11961081987032572519241.16 7CALLEM -6915PLERGUER JOSE 11941 81973071992041403411521.34 7MSANS -1437DIGUE GEORGES 11942 11973071992011403411521.70 7DSANS -7658DOYENNES PATRICIA 21942 51964101992072273717261.07 7MSANS -3938DOMINE OLIVIER 11943 51971041991011433211714.10 7MALLEM -4424CORBEIL JEAN PIERRE 11943 81974051993011369311287.59 7MSANS -7614PHILIPPE MICHEL 11943 31963091986012273717260.13 7MSANS -3959RONCIERE MARIE CLAUDE 21943 21973071990041621213033.19 7MSANS -9296THABAS ANITA 21944 51964071990102273717261.39 7CALLEM -9017DELAPORTE ANNE PATRICIA 2194511199201199101 7803 7679.64 7.SANS -3629RAMBUTEAU JEAN PIERRE 11945121972061991071433211715.51 7MANGL -3070ETIOLLES MICHEL 11946 21975031994121471512025.95 7MANGL -3212CYCLADES BEATRICE 21946 31966121995072017815517.38 7MSANS -8064ARCANGUES MARIE CHRISTINE 21946 71969031984062470018542.19 7CSANS -4281GAURBETS CHRISTIAN 11946 319890119941110791 9502.01 7MANGL -0562BLANQUET ANNE 21946 6198810198511 8656 8145.21 7.SANS -2853MESTE MARYSE 21946 1199301199201 9085 8417.91 7MTECHN -4550CHEVRY CLAIRE 21947 71968041993111834514275.06 7MVENTE -2513EUDES SABINE 21948 11970041993121834514276.18 7MTECHN -2928HEYRAULT FRANCOIS 11948 21972041991012137316331.56 7MESP -8846LIGNIERES JEAN CLAUDE 11948 41975061991011369311287.77 7MSANS -0470POTEL PHILIPPE 11949 21974051991112043315669.51 7MCOMPT -7926OUSTAOU CATHERINE 21949 31970111988042334017610.69 7CVENTE -1398NOUVEAU MARIE PIERRE 21949111969101990012137316331.39 7CSANS -7196THIERS PASCAL 119501019800619790611389 9852.33 7MSANS -8076DELANNE COLETTE EMMANUELLE 21951 71971061990011621213033.43 7MSANS -8525VOISIN PIERRE 11951 61976051991071578112723.68 7MTECHN -7965DELESTRAINT MARIE CLAIRE 21952111973021992102017815517.91 7MALLEM -2553CONVENTION MONIQUE 21952 91978061992121471512025.64 7MTECHN -3819SOLEMAR ANNE 21952 81979061979021684813422.18 7CTECHN -3540SAISSY DANIEL 11953 81980081989041684813422.77 7MALLEM -1880GOUFFE JEAN CLAUDE 11953 71983061995011578112722.61 7MSANS -7620MOIRAX REINE 2195310199307199207 9894 8923.11 7MSANS -2953TOMBE PATRICIA GABRIELLE 21953 41975101991091578112723.06 7MTECHN -5507ALEXIS JOCELYNE 21954 41975011974011288210745.40 7MSANS -4941FONVAL MAX 11954 41978051994011369311286.83 7MSANS -4394BRIAND JOSETTE 21954 71975051995011881314584.61 7MALLEM -6207FOINS CLARISSE 21954121976071992011578112723.18 7CSANS -9748CHARVE MARIE CLAUDE 21954 1199103198801 9894 8921.67 7MSANS -9682TIPHAINE JEAN CLAUDE 11955101978091994041471512026.06 7MINFOR -1788NAJY ALAIN 11955 11975031991071578112721.89 7MINFOR -7956NOTAIRE FRANCOISE MADELEINE 21955 31977011981041684813422.41 7MSANS -3415PRAIRIE PASCALE 21956 719911219901210024 8999.63 7MSANS -9208ESCADENIERES JEAN FRANCOIS 11956 61984081993011471512026.22 7MSANS -0945MAISON HEIKE 21956121977021992011471512024.30 7MSANS -2271LANDE MICHEL 11957 41982021994011471512025.56 7MSANS -3201BANGKOKNOI CATHERINE MONIQUE 21957 41978081977081834514275.41 7MANGL -6914BANCHEREAUX JOSETTE 21957 31981051995041433211714.15 7MANGL -8957LAFFON BENOIT 11958111977091994011621213033.05 7MSANS -4169FOUBERT AUGUST 11959 819820519871011131 9658.59 7MANGL -7880DIV JOELLE 21959111982041981041330611017.86 7MMICRO -7448ORSAY SYLVIE 21959 11984111983111608112917.15 7MSANS -6126SAUVEUR ANNICK 21961 21981051980051288210745.75 7MSANS -7782PETRO CHRISTIANE 21961 4199004198706 8656 8145.57 7.SANS -3730PEREIRE FABIENNE 21962 51982091981091608112916.37 7MTECHN -4013TROUIN ETIENNE 11962 21987061993091839014312.81 7MTECHN -1602VINCENT MICHEL 11963 51986111985112090215979.83 7MSANS -1113AVENYE PASCALE 21963 8199407199307 7803 7680.81 7MSANS -5901GIORDAN JACK 119641119840219830210791 9503.99 7MTECHN -5007CASTEBELLE PATRICE 11964 41984061993121288210745.40 7MVENTE -5706QUIOU SUMIYO 21965121986091985091288210745.79 7MSANS -8009COULOMMIERES FRANCIS 11965 119880819870810407 9271.16 7CSANS -4505VERGNE IRENE 21966 61991031990031381911366.63 7MSANS -2764BALAN GABRIEL 11967 21988051992121249910472.84 7MSANS -5527CHAMIER BLAISE 11968 81992011991011381911366.84 7MSANS -9559OUSTALET JACQUES 11970 2199207199402 8656 8146.28 7.ANGL -9156GUILHERMY YUKO 21972 8199208199108 7803 7679.37 7.SANS -2342LAJARRIGE MARIE JOSE 219721219920719910710363 9233.39 7.SANS -0358MERINDOL JEAN PIERRE 11974 81995051994071288210745.57 7CALLEM -7473MERMOZ JACQUELINE 21931 7198810199501 8656 8147.15 8.SANS -7635DERAIN NATHALIE 21933 4198903199501 8656 8145.62 8.COMPT -2535TREVISE PHILIPPE 11935 61963081994122666519901.15 8MSANS -4757GERMINY MARIE LOUISE 21935 81954091982072273717260.53 8MANGL -5975FAVORITE MICHEL SERGE 11935121963041981052470018541.88 8MSANS -3758CALANDRELLES YVES 11935 51968021993011663613344.05 8MVENTE -3094TARN ANNICK 21935 61959081982052470018541.01 8MSANS -7689COURONNE MICHEL 11936 91958091995012666519900.32 8MSANS -0853COLLEDEBOEUF PIERRE 11936 71973031992041403411520.30 8MSANS -5252COSSIGNY PASCAL PAUL 11936 21964121989072947921839.52 8VSANS -2084HARET COLETTE 21937 5199605199505 7803 7680.09 8MSANS -8285MASSENET MARIE FRANCE 21937 81963091991072273717260.26 8CANGL -7176ROBESPIERRE PATRICK 11938111962121985072273717260.68 8MANGL -1151QUERCIOLO ABDELAZIZ 11938 31965111995011834514274.24 8CSANS -1464SANE CLAUDE 11938 9198801198604 8656 8145.80 8.INFOR -6980MARTIN CHRISTIAN 11938 71972101990011433211714.42 8MSANS -7189CUERS JEAN BAPTISTE 11939 81966071993011663613344.45 8MSANS -7123BOISSIER MARIE JOSEE 21939 61962121990102273717260.22 8CINFOR -7519VACHET CATHERINE 21939 11983081992011326611016.12 8MANGL -2640BARBERAZ MARYSE 21939 61967011989091932314933.85 8MSANS -1630GRACAY ISABELLE 21939 71966071991101932314933.67 8MSANS -6303DOUBLE YVELINE 21939 51964071994102666519901.01 8DANGL -8547BEAU SOPHIE 21939 71967071990071578112722.87 8VSANS -7642ROCHEREAU ANNICK 21939 41966061994072137316330.94 8MSANS -4913LAURICESQUE JEAN FRANCOIS 11939 619900719920710407 9271.92 8MSANS -0289CARIBOU ELISABETH 21940 21959051992091932314934.03 8MSANS -5838MAUPERTHUIS CLAUDE 11940111961061994053417325097.60 8MVENTE -1874GRANGES CATHERINE 21940 819940919920110024 8999.72 8MSANS -1504FONTENAY GERARD 11940 51963121988113200223582.58 8MSANS -9111MONTILS DENIS 11940 31973031992071369311287.46 8MSANS -8171VIVES FRANCOIS 11940101966071989071433211715.65 8MSANS -5585COLLEGE REMY 11941111971121991052022115556.35 8MSANS -6338ANSE FRANCIS 11941 11963071992041557012568.02 8MVENTE -9521ARBOUSIERS ANNY 21941 71963031993122334017609.66 8DSANS -5504HONORE MARC 11941101966071990011433211715.68 8MSANS -0434ROUGET ELIANE 21941 41961051994101684813421.91 8MINFOR -8697ROCHEFORT MARIE CLAIRE 21941 81963031991072273717259.86 8CANGL -5183NID BRIGITTE 21941111969011992121834514274.42 8MANGL -4171LAFFITTE ODILE 21941 6199201199101 7803 7679.41 8.ALLEM -9168OISANS DOMINIQUE 11942 61976101992011578112723.00 8MSANS -0577REDERSKAAI ANNE 21942 41971011994071834514275.68 8VSANS -4455LORREZ ERIC 11942 4198810198604 8656 8146.28 8.ESP -1456ALESIA LIONEL 11942 41963041984102470018541.64 8MANGL -6360QUESSINE PATRICK 11942 51962111993123200223584.16 8MSANS -9206RAVAGERS LUC 11942 71967011994121557012567.18 8MSANS -5506ORA MARCK WITOLD 11942 81964071992012470018540.60 8MANGL -0645MALOUET MYRIAM 21942 81962101991072273717261.18 8MSANS -2325LONGUERAIE GUY 11943 61975031990011433211713.61 8MSANS -6153LUNAIN LINETTE 21943 9198810198604 8656 8147.06 8.SANS -8628ANCIENS PATRICK 11943 21963041992032739020403.89 8MVENTE -7345FLORENT FREDERIQUE 21943 41962121987082470018541.61 8CTECHN -9650GODARD GERARD JEAN 11943121975021993011369311286.71 8CANGL -0047BEUNE YANNICK MARIE 11943 71962121984092470018540.80 8MSANS -9696RAFFET CHRISTOPHE 11943121993041992041642313188.35 8.ESP -2868MONTREAL SABINE PASQUA 2194312199401199301 8656 8146.11 8MSANS -9052ORANGE JACQUES 11943 61972071992011433211714.46 8MANGL -0622GEOFFROY MARTINE 21943111970091991101932314934.93 8VVENTE -5329VILETTE GUY 11944 21967121990041433211714.75 8MSANS -7979BORDS MAEVA 21944121964071993061834514275.97 8MSANS -0046GREENS BRIGITTE 21944 4199009198909 8656 8147.19 8.SANS -7861LAGACHE CAROLINE 21944121963111991072273717260.85 8MSANS -6041MAIRIE MICHEL 11944 61969101989056400345693.48 8MSANS -6790VAUX ARIANE ELIANE 21944 31964071993102137316332.47 8MANGL -7706NICOLE CHRISTIAN 11945 31966041995072137316330.79 8CSANS -3032VOIE CLAUDE 2194510199501199401 7803 7680.95 8CSANS -4678GASCOGNE LYDIA 21945 51966121993011471512025.37 8MTECHN -6211LEFEVRE MIREILLE 21945 61966021995042137316330.58 8MSANS -4373CHENAIE FRANCOIS 11945 419940919930910363 9232.55 8MSANS -6516SABLONS ROBERT 11946 91982011992101249910472.66 8CSANS -3672CORVETTE JOELLE 21946101968111992121834514274.53 8DALLEM -6368ALPES ANNE CLAIRE 21946 31965121993031834514276.15 8DTECHN -9883MATRUT NICOLE 21946121973041993041471512025.11 8MSANS -1004DUNOIS GERARD 11946111973071992121518612335.69 8MSANS -5302REMUSAT ALAIN 11946 11975051991011578112723.33 8MSANS -0673VASES DANIEL 11946 41969051995032666519900.02 8MINFOR -5739COUR CLAUDE 21946 3199512199412 8656 8146.09 8MSANS -0992EVENOS GERARD 11947 819941119920110407 9271.52 8MCOMPT -2791BERTHELOT ANNIE 21947 51977071991101578112723.00 8CSANS -7501GOUBET FRANCOIS PIERRE 11947121972121991071621213032.53 8MTECHN -8208PIERRAILLES MICHELINE 21947 91971011995011834514275.91 8MSANS -2702BLAQUE JEAN JACQUES 11947 11970061991102739020405.01 8MTECHN -8704COLLINE JEAN PIERRE 11947 119890119880110152 9116.67 8MSANS -4666HELLEN PIERRE 11947 61979021993041471512024.60 8MSANS -8568AQUILON ISABELLE 21947 11969011991012137316332.22 8MANGL -7824REVA JOSIANE 21948 6199003198608 8656 8146.61 8.SANS -9576MONTET LIONEL 11948 61969121994072470018541.95 8MSANS -3165HAUTS MYRIAM 21948 51970121991022022115555.81 8MANGL -9783THOMAS MARIE PAULE 21948 51971101990072022115555.44 8CMANAG -0892EPARGNE PIERRE 11948121973051990011684813423.29 8MSANS -8463GIMONT MARIE LAURE 21948111970011991071834514274.30 8MSANS -3612GLENAN ALAIN 11948 11973071990011834514276.06 8MSANS -3989AVENIR HERVE 11948 41979071992011249910472.66 8MSANS -1849GRASSE JEAN MARIE 11948 51974111992041403411521.97 8MSANS -5860GRANGES MARLENE 21949121969031989011621213032.26 8MSANS -0021ECOLES MARTIAL 11949 91981091992011249910472.37 8MSANS -5620BLANC MARIE SABINE 21949 1199107198704 8656 8146.01 8.SANS -9485MONT PHILIPPE 1194911198704198604 8656 8146.68 8.SANS -5814TERMES YVES 11949 41978021993121369311286.03 8MSANS -7863YESILKOY DOMINIQUE 11949 71969031990012137316330.92 8MANGL -0579HILARION ETIENNE 11949 31968121989021932314934.09 8MSANS -4379FORGERONS JEAN FRANCOIS 11949 11977041993011369311287.16 8CANGL -3965BOISGELOUP ANNE ANDREE 21949 81971011984082470018542.24 8MINFOR -8322FLAYAT RICHARD 11949 119800919860911389 9851.64 8MSANS -3220PLASCASSIER CATHERINE 21950 91974051991071578112721.53 8CSANS -2062NOIRAY GUY 11950 31993111992111642313189.25 8.SANS -1017COROT MICHEL 11950 11977021993041369311286.53 8CANGL -5913CITEAUX YVES 11950 61978031995082000715437.49 8MTECHN -4766COLOMBE GUY 11950 81972041989101621213033.97 8CANGL -8829CARCE ANNICK 21950 51970111991071578112723.22 8MSANS -5482ENTREPIERRES DOMINIQUE 21950 81974081991081578112723.00 8MMARKT -6118THEOPHILE PHILIPPE 11950 21970041995102666519900.36 8MSANS -6158PUYGARD PHILIPPE 11950121971041993103916628549.82 8MSANS -7664FRANCOIS HUBERT 11950 41974071993011369311287.46 8MANGL -3674HOP VINATIER ANNE ODETTE 2195010199507199407 8359 7952.07 8MINFOR -8401STADE YVES 11951121972051990011621213032.80 8MINFOR -4992SOLEIL MURIEL NICOLE 21951101972021991072137316330.58 8MANGL -4163FRESNAIE PHILIPPE 11951121977051991011684813423.49 8MALLEM -6140VERTE ICHIKO 21951 51972071993042017815516.20 8MANGL -7521SILLAT JOELLE 21951 71973081991021684813421.81 8MSANS -8682HUYSMANS DANIEL 11951 61977051993011471512025.47 8CSANS -4383JAVELOT CLAIRE 21952 21975041995101881314584.67 8MANGL -3010CARLA ANNE 21952 21972081980102470018540.07 8MSANS -5234BELLEGARDE GHISLAINE 21952 51972021991121608112916.45 8MSANS -4958NAPOULE ANDREE 21952 71974011973011288210743.90 8MSANS -8132ALDE PATRICK 11952 61971121989071621213032.29 8MSANS -6296ALEXANDRIE CATHERINE 21952 11973051994041450311832.36 8MALLEM -2851FEDERATION JACKY BRUNO 11952 419830419820411389 9851.21 8MSANS -2922TRIERE JEAN PIERRE 11952 21972041989101621213032.87 8MESP -4520BARONNETTES MICHEL 11952 51975121993011369311287.43 8MSANS -7884LEPINE YAN MICH 11952 11986061995071288210745.04 8MSANS -2916GRENADIERS LAURENT 11952 71977101991041578112721.89 8CSANS -6995CIVRY MARILYN 21953111975041993041471512025.05 8MVENTE -8042BERTHE DANIEL 11953 11976071993011369311286.57 8MSANS -4389CARPATODE JACQUELINE 21953 31974051993012017815517.95 8MSANS -4164THENIOUX THIERRY MICHEL 11953 31972071992072175716602.09 8DTECHN -9986ARS DOMINIQUE 21953111974051991071578112721.65 8MMARKT -2077VELETA CHRISTIAN 11953 81977121991071684813421.55 8MANGL -7207VICT MICHEL 11954 71979091994041249910472.66 8CSANS -0617ARBOUSIERS MARC 11954111981041991011608112915.62 8MANGL -6266PALOMBES ALEXIS 11954121978061994011578112723.22 8MSANS -3336REPUBLIQUE LOIC PIERRE 11954121986031991121288210745.67 8MTECHN -6034LAMOTHE ROBERT 11955 71976081994011369311286.38 8MSANS -8420COULEUVRE DIDIER BERNARD 11955 21978061994011369311286.30 8MVENTE -7021INVILLE JEAN MICHEL 11955 11975051994012397418037.86 8MSANS -2224EGALITE ISABELLE 21955121978031992021471512025.97 8MALLEM -3309HELENE ISABELLE 21955 41986041992011288210745.22 8MSANS -2341LANGUEDOC ANDRE 11955 61980081979081684813421.33 8MTECHN -5599KOETZINGUE MARTINE 2195512199402199302 7803 7679.49 8MSANS -1570ORB NATHALIE 21955 21976061992072043315669.60 8CTECHN -0095DUNOISE DANIELLE 21955 21977041981011608112915.51 8MTECHN -5288CHELLAH MARIE HELENE 21955 91976071991121578112721.88 8CALLEM -9228CARDINALE PATRICK 11955 81979071994101249910472.03 8MSANS -5668FOY MARC LAURENT 11955 419840319830710791 9503.63 8MSANS -2007NEUVILLE PHILIPPE 11956 31976091991011578112721.79 8MSANS -8560MAI DANIEL 11956121983041995101433211715.69 8MSANS -6777PALAIS ANNE MARIE 21956 21977071976071834514274.96 8MSANS -0514GRENIER MARIE CLAUDE 21956111978061992051471512025.43 8MANGL -2450MEYRAN CHRISTOPHE 11956 91978081990052022115554.36 8MSANS -0738CHATEAU SYLVIE 2195611199310199210 9894 8921.99 8MVENTE -4115MIROIRS LINE 21957 71977071981091834514275.11 8MCOMPT -2843BERRIERE THIERRY 11957 319930819940110876 9503.70 8MSANS -1706KERDANIOU FREDERIQUE YVELINE 21957111979081993051608112916.01 8MTECHN -3794MAL GERARD 11957 71989061993011326611016.03 8CANGL -4102ZOUAVES ALAIN 11957 51980051986112256617145.74 8MMARKT -6349GALLEU LAURENCE 21957101977021992011471512024.60 8MSANS -1461BORGHESE TEVA 11957 91977081995041249910472.91 8MSANS -1587CALIFO ROLAND 11958 6199305199201 9597 8729.39 8MSANS -1182GRANCEY VALERIE 21958 11978031992021471512024.17 8CALLEM -9993VALLON JEAN FRANCOIS 11958 21982031994011471512024.97 8MCOMPT -3559OR CAROLINE 21959111979081993071471512025.77 8MSANS -8859BERENGUIER MARTINE 21959 81980051993071527112373.49 8DSANS -9596SINGER MARIE ODILE 21959111981081980081326611016.26 8MALLEM -1614PIED JOCELYNE 21959101979081993071471512025.56 8MSANS -7872CASTELET CATHERINE 21959 31980101979101684813422.12 8MSANS -3066SCHWEITZER JEAN JACQUES MARIE 11959101984091993121326611016.80 8MSANS -6764EGEOIRES DIDIER PIERRE 11959 519890819880810407 9271.56 8CANGL -0114EGLISE ANDRE 11959121981101992101608112917.19 8MANGL -8832ISOLA ERIC 11959121981061993121471512025.47 8MSANS -0083BRUZETTES JEAN PAUL 11959 31984081991061326611016.78 8MSANS -9690MAUPERTUIS GEORGES 11959 61981011989111608112915.03 8MANGL -5294GIRONNETS MURIEL 21959 31981041980041684813421.54 8CSANS -2982HORACE SATO 21959 7198609198507 9511 8689.07 8MSANS -1765ARGE PHILIPPE 119591019930519920510024 8998.08 8CALLEM -9648MOLENE HEYMAN 11960 21984111991092529918968.43 8MSANS -2260BOULAZAC FRANCOISE 21960 11980101979101684813423.35 8MSANS -0614RENOIR JEAN ADRIEN 11960 31983081993011215710279.72 8MSANS -5022CARTOUCHERIE JACQUES 11960111984121994011578112723.60 8MSANS -7019AULNES BETTY 21960121980091988051527112374.16 8MTECHN -1225GRANIER DIDIER 11960121982091993011527112374.09 8MSANS -0305CANTARON JACQUELINE ANNE 21960 21979111993101471512025.92 8MANGL -9818ULBACH NATHALIE 21960 81982011981011326611018.09 8MALLEM -6769TOURENNE MARIE HELENE 21960 81993081992011249910471.66 8MSANS -4168CAILLE NELLY 21960 11980101979101684813423.35 8MSANS -2371PILATTE PHILIPPE 11960121984071991061326611018.09 8MSANS -1380SALLE BRUNO GEORGES 11960 31982011988112090215980.82 8MSANS -1410REPUBLIQU ROZENN 21960 51983041982041608112915.17 8MSANS -1668VALESCURE GILBERT 11961 619880319930111302 9775.91 8CESP -4486CHANZY GILBERT 11961 81984061988052090215979.76 8MSANS -4667CLAIR ANNICK 21961 51982071981071326611017.91 8MSANS -3248CAMPANELLES MARTINE 21961 51982081989112090215981.29 8CSANS -6422BARBELET THIERRY 11961 319810119800111131 9657.47 8MSANS -5543JUMIN HENRY 1196111199405199201 9597 8729.85 8MANGL -2561SAURSON MICHEL 11961 319820419900111131 9658.72 8MANGL -3290CHARBONNEL PATRICIA 21961 7199607199507 8359 7952.19 8MSANS -4075ORSAY JEAN MARC 11961 919890619950910407 9272.24 8MINFOR -3928DAVID BERNARD 11961 51981091993121326611016.78 8MALLEM -3502MONTGOINS ODILE 21961 91984091983091288210744.01 8CSANS -2628MANET MICHELE 21961 51984091983091288210745.57 8MSANS -3679LAY CAROLE 21961 81982101993071527112374.70 8CTECHN -9476FERREOL PATRICE 11961 51985101993011168610047.54 8CALLEM -6300VALLIER NICOLE 21961 3199207199107 8656 8146.11 8.ANGL -2306RAHO BERNARD 11961 919900319890510407 9270.44 8MSANS -7612VIEUX PASCAL CHRISTOPHE 11961101983051982051326611017.92 8MCOMPT -9056CRAPONNE PHILIPPE 11961121985031989112090215981.60 8MSANS -5891PRESIDENT ROBERT 11961 21992121993122401918074.91 8MSANS -4133AIR PIERRE 11961 71981071991091326611016.35 8MSANS -9028OUSTALET JEAN 11961 819821219811211131 9658.52 8MTECHN -3462MONTEIL JACKY 11962 819820619810611131 9657.15 8MSANS -7126JUSTICE MARIE PIERRE 2196211199504199404 7803 7680.66 8MSANS -2705VILLA MIREILLE 21962 2199201199101 7803 7681.04 8.VENTE -6788EXTE DOMINIQUE 21962101984111991091527112373.05 8MSANS -6035AUMALE SYLVAIN 11962 619840319830311131 9658.70 8MSANS -3359CERNOY PHILIPPE 11962121988061989091527112374.58 8CSANS -8236CANAULET LOIC 11962 919870219870110407 9271.16 8MSANS -2285FAURE NICOLE 21962101982071981071326611016.83 8MSANS -6765PICARD AXEL 11963 61992121991121330611016.03 8CSANS -6602COUDREE LAURENT MARCEL 11963111986051994111693613498.86 8MSANS -6537BOTZARIS MANUEL 11963 91984031991091288210744.23 8MSANS -9865CARDELINO ELISABETH 21963121986061985061288210744.19 8MSANS -7936GAMBARDELLA MONIQUE 21963101984111983111288210743.92 8CSANS -1490PAUTEL PATRICIA 21963 21993091992011202810241.21 8MSANS -8828CAMP JEAN FRANCIS 11963 31983101993011949415050.78 8MSANS -6652SURESNES BRIGITTE 21963121989081988081249910472.82 8DSANS -9991PROF CHANTAL 21963 819950319940311389 9850.74 8MSANS -4136ONDINE LAURENCE 21963 61984111983111608112915.66 8MTECHN -2731DRIVE MICHEL 11963 81983051982051326611017.83 8MSANS -7391SOIE BEATRICE MARIE 21964 11986101985101168610048.22 8CALLEM -7157CEDEX GERARD 11964111991121990121330611016.53 8MSANS -1010ARCES ELISABETH ANNE 2196412198811198606 8656 8145.62 8.ANGL -7723GRATENTOUR FRANCOIS 11964121991051995081202810240.84 8MSANS -7515JARUNSANITWONG PIERRE JEAN 11964 3199612199401 9597 8729.36 8CSANS -7251ISIDRO DANIEL 11964 91988051987052090215980.28 8MSANS -4749AVERTIN CLAUDE 11964101986071993041288210744.26 8MTECHN -2395LOGNES HEDWIGE 21964 61984091983091288210744.23 8MSANS -1171DELMAS DANIEL 11965 11988051992041249910473.45 8MTECHN -8804MAHON FRANCINE 21965 51993061992061202810240.46 8MANGL -0367DANTZIG JEAN 119651219940619930610363 9232.62 8CANGL -4984SOULT ERIC ANDRE 11965 219931119921110024 8999.21 8CANGL -5821POMPIDOU GINETTE 21965 51985061985061347711131.13 8MSANS -6382LABOURD CATHERINE 21965 71989071995091249910472.66 8VTECHN -0635WILLOWCREST JEAN CLAUDE 11965 71985071992121288210745.13 8MSANS -0760PENIL PASCAL 119651019870119860110791 9501.81 8MTECHN -6467HAVRE ANDREE 21965101987051986101527112374.07 8MSANS -9897ONGUI PATRICE 11965 619940119930111389 9851.07 8CSANS -5429HINODE FRANCOISE 21965 2199304199204 9126 8456.10 8MESP -6900MANTEAUX GERARD 11966 719910219930610024 8997.99 8MSANS -0370CASTELL MONIQUE 21966 41989031988031249910473.24 8MALLEM -8517WASHINGTON BERNARD 119661219890119860410407 9272.17 8.ANGL -9967TREMEUR HERVE MARIE 11966 81989081988081249910472.59 8SCOMPT -6163MOLLARD JACQUES 11966 21993021992011249910473.00 8MANGL -7120SOGNES HELENE 21966 31989031988031249910472.73 8MINFOR -6709KERIMEL MICHEL 11966101988011987011539912453.47 8MANGL -5303HETROLLIER MARIE LAURE 21966 119940919930411389 9852.11 8MANGL -7075CEZAIRE JEAN LOUIS 11966 61985041992061527112374.63 8MTECHN -5072SAUVETAT ALAIN 11966 919910519900510024 8999.27 8MANGL -6154CALME MICHEL 11967 91988041991061249910472.82 8MANGL -3329DOME PATRICE 119671219921119931110024 8999.31 8MSANS -6319CALVAIRE YANICK 11967 119920819910810024 8998.01 8MSANS -4968LYCEE MICHEL 11967 31991101990101467711987.34 8CSANS -0009LOS JEROME 11967 2199611199511 8656 8146.86 8CSANS -1878BEAUVILLE ERIK 11967 91990031994011249910473.09 8MSANS -9800DORET CAROLINE LILIANE 21967 719930619920611389 9851.28 8MTECHN -4797PORTOI MIVA 21967 61989111989111839014313.36 8MSANS -7931LABERTRANNE SYLVETTE 21967 81994051992011202810241.97 8MTECHN -8940BARRES MICHAELLE 21967 81990021993071330611016.66 8MSANS -3164CROUY ANDRE 11967 71992091991091839014314.38 8MSANS -1556CAMP VERONIQUE 21967 9199302199202 8656 8145.66 8.SANS -2245FRINGANE VINCENT 11968 419940219920110024 8999.94 8CTECHN -0888CURIE JEAN BERNARD 11968 91988091993121249910471.74 8MSANS -3431BOUEL BERNARD 119681019880919870910407 9270.97 8MSANS -3147ROCHERS ISABELLE 21968 51994071992011202810239.96 8CTECHN -7236SIMENTAL BERNARD 11968 219910719910510407 9270.44 8MCOMPT -9853YAN DAMIENNE 21968 71994011992011202810241.16 8CSANS -3267LONG BRIGITTE 21968 11992091991091330611016.93 8MSANS -8141EXUPERY GERALD 11968 51994011993011267210590.11 8CSANS -3839MINIMES JEAN PIERRE 11968 71989011988011450311831.78 8MESP -6386PAUCOURT SALOLOM 11969 91994011993011420611639.24 8MTECHN -5948CARRERE JOCELYNE 21969 6199205199105 8656 8145.60 8.SANS -1726ASQUES SYLVIE 21969101994021992011202810240.50 8MANGL -3067CHEVRAINVILLIER BERTRAND 11969 119940119920110024 8999.90 8MSANS -5762WINSTON JEAN 11969 11989101988101450311832.69 8MSANS -6200MONTGOMERY DANIEL 11969 91990041995011330611016.47 8MSANS -9177RIEUX BERNARD 119691119920619910611389 9852.27 8MINFOR -6151CANTAGALLO EDDY FELIX 11969 71994011993011202810240.23 8MSANS -8371MOUTHON HERMINE 21969 919950319930411389 9852.29 8MTECHN -5982LONGWOOD MARIE NOELLE 21969 71991091991051330611016.84 8MVENTE -3924ANGELES MARYSE 21970 219940719920111389 9850.74 8MSANS -5000MARCHAND ANDRE 11970 8199306199206 9597 8727.91 8MSANS -6053EXINCOURT DOMINIQUE 11970 419940619920110024 8999.43 8CESP -6405ORMILLES ALAIN 119701119910819900810024 8999.57 8MSANS -4367OURCHES AGNES 21970 1199506199406 7803 7680.36 8CSANS -6055LACATE DENIS 11970 9199308199208 9597 8729.66 8CTECHN -4701DUCA ANDRE 11970 71991051990051467711985.86 8CESP -6470ALLEES YVON 11970 71991021990021467711987.75 8MALLEM -6121RIVAGE FRANCOIS MARCEL 11970 419950119950110363 9233.88 8CSANS -0867FOURS CHRISTINE 21970 3199409199309 8359 7952.10 8MTECHN -9075SEMBAT FREDERIC 11970 3198912198812 8656 8145.26 8.ALLEM -9637JUAN MURIEL 21970 5199310199210 8656 8146.70 8.TECHN -6609GAYE NICOLE 21970 8199607199507 7803 7680.41 8MSANS -5493LAUZES MICHEL 11970 11991071990071202810241.09 8MSANS -6491BRAS BEATRICE 21971 619921019950410668 9425.45 8MSANS -7556YOLA PHILIPPE 11971121994041993041360611209.94 8CTECHN -7031ECOLE CHRISTINE EMILIE 21971 419910219920111389 9851.19 8MSANS -5834ORANGERIE SERGE 11971 8199302199202 9597 8728.46 8CSANS -4526LOT PHILIPPE 1197110199407199307 9597 8729.27 8CSANS -4363QUART VINCENT 11971 4199404199201 9597 8728.44 8CSANS -7702MONTARNAUD PIERRE 11971121992111991111420611638.97 8MVENTE -8710GAULTIER ISABELLE 21971 31994011993011267210589.57 8CSANS -5198ROUILLON CLAIRE LUCIE 21971 819940519920111389 9851.97 8CANGL -6286WATTEAU JEAN CLAUDE 11971 81994071993071360611211.56 8MSANS -3787TAUDE JACQUES 11971121993121994011202810241.40 8MSANS -3968CAPRI MARIE CHRISTINE 21972 8199607199507 7803 7681.22 8CESP -5435BERRE JOELLE 21972 21994091993091360611211.42 8CSANS -2682VINGT GENEVIEVE 21972 7199406199306 7803 7681.40 8CSANS -5935ORVEAU FRANCK 1197212199609199509 8656 8146.25 8MTECHN -5312LUCE GUY 11972 81994041993041420611637.47 8MSANS -5416ESSARTS FRANCOIS 11972 819931019930711389 9850.62 8CSANS -5534ISLE MICHEL 1197210199312199212 9597 8728.58 8MSANS -3974DEVIN FRANCOIS 1197212199605199505 8656 8145.57 8CSANS -6877COUPERIN PHILIPPE 11972 5199310199210 9597 8727.95 8CSANS -4740PLAISANCE SERGE 11972 219950119930410024 8998.82 8CSANS -3393MANAU EDITH 21972 219941019930411389 9851.88 8MTECHN -9615BOL JEAN CLAUDE 11972 21991071994011249910471.79 8MSANS -4599GUYAU MAUD SOPHIE 21972 519940719920111389 9852.47 8MANGL -8612HAMELIN JEAN MARC 11972 8199310199401 9597 8728.98 8CSANS -8541RESIDENCE MICHEL 11972 319951219941210668 9426.89 8CTECHN -3801NASTRINGUES SABINE 21973 8199606199506 7803 7679.46 8CTECHN -2827OREE JOSEPH JEAN JACQUES 11973 6199502199402 9126 8456.78 8CANGL -7660ESTIENNE JACQUES 11973 1199406199306 9126 8455.56 8MSANS -5260JACQUES ERIC BERNARD 11973 319931119921111389 9851.61 8CSANS -3671GARCHES GEORGES 11973 31992021991011202810240.68 8CANGL -4348ROQUEFORT JEAN PIERRE 11973 819930319920311389 9850.74 8CINFOR -6630LAGRANGE THIERRY 11973 9199302199505 9597 8729.63 8CTECHN -9712EMPIRE CHRISTIANE 21973 6199606199506 7803 7680.67 8CSANS -3751OASIS JACQUELINE 21973 219930319920711389 9851.25 8MSANS -3830DRECHO JEAN 11973 61993051994011202810240.55 8CSANS -4561DANNEMOIS JEROME 11973 5199612199601 7803 7679.91 8CSANS -3191JAVEL CHRISTIAN 11973 5199311199211 8656 8147.13 8.SANS -1618CHASLES CORINE 219731219940719930710668 9427.08 8MSANS -4268SENE LUC 1197312199306199206 9597 8728.23 8CSANS -8421ROCBARON JOEL 11974 1199510199410 7803 7680.36 8CSANS -0930ESTANOVE ALAIN 1197411199606199506 7803 7679.99 8CMICRO -6807TOURDRES MANUEL 11974121994051993051360611210.28 8CSANS -4488CHAUVEAU CECILE 2197412199601199501 7803 7679.51 8CSANS -8315COUVENT PIERRE 11974121995121994121450311831.06 8CSANS -6605EDMOND SYLVIE 21974 8199504199404 7803 7679.78 8CTECHN -9778ONS MARIE SIMONE 21974 7199405199406 7803 7679.96 8MSANS -3816AURIC PASCAL 11974 6199502199402 9894 8922.63 8CSANS -2018FOUR PATRICIA MICHELE 219741219940719930710668 9427.40 8CALLEM -7643SEGUIER PATRICK 11974 5199406199306 7803 7679.67 8CSANS -5610SAGET HENRY 11974 9199407199307 9126 8456.47 8CALLEM -6425FINLAY PHILIPPE 11974 81993121994011202810241.74 8CANGL -8616PAEA MICHEL 11975 5199407199406 7803 7681.40 8CSANS -9958DULUD GILLES 11975 6199612199512 8656 8146.52 8.TECHN -8573PIBONSON CHRISTOPHE FREDERIC 11975 6199607199507 7803 7680.81 8CSANS -7803INCAPIS PASCALE NANCY 21975 7199604199504 7803 7680.34 8CALLEM -7514VIENOT ANDRE 11975 3199508199408 7803 7679.78 8CSANS -7507FAISANDERIE JEAN PIERRE 1197512199607199507 7803 7679.99 8CSANS -3865MICHEL PATRICK 11976 3199507199407 7803 7680.12 8CSANS -4755OCTAVE MARC 1197612199608199508 7803 7679.99 8CSANS -0542TORREILLES ALAIN 11976 5199510199410 8656 8145.80 8CSANS -9647DELORME DOMINIQUE PIERRETTE 2197612199407199307 7803 7679.69 8CSANS -4725TACONNAZ BEATRICE 21976 4199508199408 7803 7681.17 8CALLEM -9564CESSOLE FRANCIS 11976 4199607199507 7803 7681.20 8CSANS -8087CHUTES GUY 11976 3199407199307 7803 7680.62 8CANGL -5480LOUIS JACQUES 11977 9199607199507 7803 7680.59 8CSANS -1361BANVILLE PATRICK 11977 4199607199507 7803 7680.34 8CSANS -6209BEAURECUEI CATHERINE 21977 4199607199507 7803 7680.57 8CSANS -3656FLIREY JEAN CLAUDE 1197711199606199506 7803 7679.59 8CANGL -9051SUANE ALINE 21929 919680919870111389 9851.91 9VSANS -2724DEL PIERRE 11930 21989021995023455825330.03 9.SANS -7341GRATECA PIERRE 11933 21966071993012273717260.26 9MSANS -6774BARRAU AGNES 21933 8199512199412 8656 8145.06 9MANGL -0536FIRMAMENT SCHEHRAZAD 21934121962101982052470018541.72 9DSANS -7368RESSAC RICHARD JOSEPH 11934 11967011994011557012567.09 9LANGL -7599ANNE JEAN FRANCOIS 11935 11974031994011578112722.84 9VSANS -1083COUCOURDE DOMINIQUE 11935101973061991011433211715.02 9MSANS -2946ROLLAND OLIVIER 11936 51962111984122470018541.29 9MSANS -7241THERMALE MARGUERITE 21936 7199306199206 9511 8688.67 9MESP -1695LOUVEL CHRISTIAN 11937 519820219920311389 9852.69 9MSANS -9744SALENGRO SYLVIAN ERIC 11937101961071991083417325097.15 9MESP -7083OLIVETTE CATHERINE 21937101966071989031932314934.86 9MALLEM -0151DUCHEMIN JEAN JACQUES 11938 41962061991012470018541.29 9MINFOR -8395FRANCO ANNIE 21939101984011991091288210745.34 9MANGL -9978BARBERAZ MARIE CLAUDE 21939 71972071989011621213034.09 9VANGL -2131ARGENT CATHERINE 21939 71963121994042137316332.05 9MALLEM -3235THUI HUGUES 11939 61967071995041557012566.37 9MSANS -7994THIBAULT PATRICK 11939 31962051983032470018542.10 9MTECHN -5783DOMATS MICHELE 21939121963031992021932314934.12 9MANGL -6426PORTAIL JEAN FRANCOIS 11939 11969121995041557012567.53 9MESP -6856JULIE JEAN MARIE 11940 319950219940211131 9657.83 9MANGL -4024LEBRUN ALAIN 11940111965041995041557012567.77 9MESP -9739NOCETA YVES 11940 21972041991011663613343.82 9MSANS -9045MURET RENEE 21940101964091993072137316332.29 9CSANS -4987UNIVERSITE CATHERINE 21940 41967011990011932314935.20 9MESP -1530CYRILLE ANNICK 219401219741019881011131 9659.19 9VSANS -1447HAMEAU OLIVIER 11940 61964081988092947921838.88 9MTECHN -8268ANNEES PATRICK 11941 51961081992042022115555.75 9SANGL -9303SCIOTOT ALICE 21941 61973071991101578112722.75 9MSANS -0509PIECE ROBERT 11941 51963121994073844228045.38 9MSANS -3288ISERE EMMANUEL 11941 51965081990011433211714.24 9MSANS -9898CHANTEGRIVE JEAN MARC 11941 91964091992082470018540.12 9MSANS -0163DAUTHEVILLE MARCELLO 11941111964121992072137316332.45 9MANGL -0652VAUTHIER MARIE ALICE 21941 41971021991101932314933.60 9MINFOR -7932VAUX DANIEL 11942 51969031991011433211713.80 9MSANS -0197MAURENS CLAUDE 11942 91962081984123200223582.94 9MTECHN -3251RUELLE JEAN 11942111976041992011403411520.12 9MALLEM -8289OLYMPE NADINE 21942 51964121993102137316331.37 9MSANS -9503GLORIETTE ALDO 119421019951219941210024 8999.12 9MSANS -4563CERTAIN LOUIS 11942 31965071995011557012567.22 9MANGL -6383DESGRANGES JEAN CLAUDE 11942 71983051993011249910473.49 9MSANS -8658VALLONGUE BERNARD 11942 71963041995102666519899.30 9MESP -4745RUCHERS GILLES 11942 21980051979051249910473.56 9MSANS -8824PEYBERT JOCELYNE 21942 31963031994012137316332.51 9MSANS -7242CORMEIL PATRICK 11942 81970041990011433211714.79 9MANGL -0065ANGES XAVIER 11943101966101990011663613343.16 9VSANS -4531SENART JEAN LOUIS 11943 21967111987012273717261.13 9MSANS -7154MUIDS THIERRY 11943 31962121990013844228044.24 9MINFOR -5345ORATOIRE ALAIN 11943121970081989011932314934.36 9MSANS -3282SOUGERES JEAN LOUIS 11943 11968051990011433211715.33 9MSANS -6215JOFFRE PASCALE 21943 81986021991071249910473.24 9MINFOR -7867BASTIDE HIROKO 21943 51964071993072334017610.06 9MCOMPT -6194STEPHAN KARIM 11943 81966051995041557012567.45 9MANGL -4570MONDENARD JACQUES 11944 61965051994012137316331.93 9MINFOR -3691CAORCHES MICHELE 21944101965081995042137316331.97 9MINFOR -8595PRAD BENOIT PIERRE 11944111965031984123200223582.37 9MALLEM -6617LONDRES PATRICK 11944 41972041991011621213032.39 9MSANS -9701CAPUCINES ALAIN 11944 119820119830511389 9851.24 9MSANS -7661ROSERAIE FRANCOIS 11944 31973071992011403411521.88 9MANGL -0274FROMAGERIE ALAIN 11944121971011991101433211714.28 9CSANS -9427GROULES MARIE FRANCOISE 21944 81963111993082334017609.06 9MANGL -9749HEROLD ISABELLE 21944 31973071991071578112722.97 9DSANS -5120MONTBY PIERRE 11945 81978041994011663613343.91 9MINFOR -7337MAGINOT PHILIPPE 11945 61965031994012137316330.71 9MANGL -2937PAYEN JEAN PAUL 11945 81973051992011403411520.53 9CANGL -3034SCHUMANN GEORGES 11945 81970041991011433211715.11 9MSANS -4582PETENATI MARIE CHRISTINE 21945 11974121993032043315669.65 9MALLEM -2430TOURNELLES ALAIN 11945 91975031993011369311287.38 9MSANS -4782CHENAY MARIE LAURENCE 21945121968091989012273717259.78 9MSANS -1091RENNES MARIE ANGE 21945 61974071990071621213033.56 9MSANS -2494ONA FRANCOISE 21946 51969081993121834514275.25 9MESP -2170VIENNE MARIANNE 21946 81970021991102137316330.67 9VSANS -2830FONTAINE ANNETTE 21946 41968041991091932314935.20 9MSANS -8673ABEL JEAN PIERRE 11946 2198810198510 8656 8145.21 9.SANS -9142ORSAY MICHEL 11946121970121991041663613343.28 9MSANS -6458FOYER JEAN LUC JACKY 11946 71969111986012470018540.12 9MSANS -8418RIVERIN ALAIN 11946 11979091992011249910473.05 9CCOMPT -2785PONT ANDRE 11947 41968041990102739020403.33 9MANGL -3079MOISE YVES 11947121972071991101433211714.69 9MTECHN -6994CHEMINEES SOPHIE 21947 11976061981091834514276.09 9MANGL -0913ROCHER BRIGITTE 21947101971041990102334017609.66 9MSANS -3030LUZIADES ANTONINA 21947 519940619920111389 9851.64 9MSANS -2592CLOUZIT NATHALIE 21947 7199208199108 8656 8145.20 9.SANS -2816BAULE VERONIQUE 21948 51973031972031236910396.01 9MANGL -0561DELAUNE JEAN NOEL 11948 11975041993011369311287.82 9MSANS -4506DIDEROT JEAN PAUL 11948 619790519880411131 9657.51 9MTECHN -5103CORNETIERE FRANCOISE 21948 21983061990041288210744.22 9DSANS -0785RUDLOFF MICHEL 11949121971121993122547019086.15 9CSANS -7465DEVORAH MICHEL 11949 91980041990091608112915.38 9MSANS -6601LAS CLAUDE 11949 61969051990043417325096.67 9MTECHN -5921SAINTPIERRE CAROLE 21950 31974021991071578112722.12 9CSANS -4717BERARD DENIS 11950101983081987011283810705.67 9DTECHN -6138DUCERIS COLETTE 21950 81992051991011202810241.85 9SVENTE -1254ESQUIROL JEAN CHRISTIAN 11950 81975081992101369311286.84 9MANGL -3226BOX CHRISTINE 21950 41970041990101834514275.65 9MSANS -4683MAUNE PASCALE 21950 61974051995072175716601.42 9MSANS -3496FROIDE JEAN JACQUES 11950111972101991012137316331.69 9MANGL -2173BERNARD CHRISTIAN 11950 41972051991042137316331.34 9MANGL -2204VIA STEPHAN 11951121972101991072017815517.05 9MSANS -5528HORIZONA JEAN PAUL 11951 219931019940510407 9270.34 9MANGL -2181CHAPUIS ALLAN 11951 1198810198603 8656 8145.89 9.SANS -8003COMPREIGNAC JEAN RENE 11951 81973101994082201216756.14 9MALLEM -4444HOTELS ANDRE 11951 41981111992011249910471.71 9CTECHN -3137GARIDECH MICHELINE 21951121993051993041249910473.47 9MANGL -5824LONGCHAMPS SYLVIE 21951 51972011990071578112722.42 9MANGL -8477MENEZMEUR NORIKO 21951 51973071991041578112722.69 9MESP -1336RANELAGH PIERRETTE 21952 21972041995011881314585.46 9MALLEM -6782LAVACHET ALAIN 11952 11978091994011369311287.77 9MINFOR -6451MONTPARNASSE AURIC 11952121973031987112470018540.56 9MESP -9132BOUVELARD ALAIN 11952 619930819910110407 9271.74 9CSANS -9726VIGIER GABRIEL 11952 419930819920811389 9852.47 9MSANS -4608DESPAGNE ANNIE 21952 3199503199403 8656 8146.05 9MSANS -2221LYANES YANN 11953121973071995041881314586.14 9MVENTE -1575PELURES MICHEL 11953111975011991012781920674.59 9MSANS -4898BLANCHET ODILE 21953101973071984051834514275.11 9MSANS -2339ODES MICHEL 11953 31976121993041471512025.77 9MSANS -4008BETHANCOURT MARIE ANNE 21953111981121980121202810241.36 9MSANS -1590CIVRAC PHILIPPE 11953 91977051993041369311286.83 9MTECHN -6109PEIRE GERARD ANDRE 11953 31972071991082175716602.51 9MCOMPT -7232CHAMP MICHELINE 21953 7199001198801 8656 8145.87 9.SANS -4789TOURACHE ALAIN 11954 71974081993011369311286.53 9MTECHN -8709QUIETUDE MONIQUE 21954101977011994101471512025.14 9CSANS -1712BIR ALAIN 11954 31975011991091684813421.42 9MSANS -7069TUBY ROBERT 11954 71975061991071578112722.30 9MSANS -4017BLEURY BRIGITTE 21954101977011992011471512025.20 9CSANS -4255BEAUSEJOUR FRANCOISE 21955101981031995071433211714.70 9MSANS -3435VENTS PHILIPPE 11955 71978041991011471512025.16 9MTECHN -3130CIGALONS PHILIPPE PIERRE YVES11955121978111995021608112916.95 9MALLEM -9170ALMA ANTOINE 11955111978101992011578112722.61 9MANGL -9114CASTEL LILIANE 21955 51976071991121578112722.52 9MVENTE -4844CHER JOELLE 21956 31993091995111202810240.94 9MINFOR -1241GOUVERNEUR JEAN PAUL 11956 31976031990101684813422.68 9MSANS -9766FRAYSSE CHRISTIAN 11956 819800719821211389 9850.88 9MSANS -6781CHANTEREINE JEAN LUC 11956 91979011992012175716602.36 9MSANS -6220PUYRAVEAU MICHEL 11956101985041988061326611017.52 9MSANS -5187BOLIVAR DANIELE MARIE 21956 81981081995071433211714.30 9MSANS -8283VICINAL MARCEL 11956 91977111992012175716600.94 9MSANS -0990CORMERY EYT 11956111979121995041249910472.84 9MSANS -9255SERRES MARY ANNE 21956 71981011980011684813421.58 9DANGL -9968TRAILLES JEAN 11956 919870419860910407 9271.59 9MSANS -6046RONDE JACQUES 11957101976121992011608112915.20 9MSANS -4312DUROC KETTY 21957111980041979041684813421.51 9CANGL -1998MADELEINE CATHERINE 21957 21980061994041471512025.70 9MSANS -0810TROMPETTES LAURENCE GISELE 21957 91994021992011202810240.40 9SSANS -1103JOURDANS JEAN MARIE 119571019900419910410791 9502.58 9MANGL -3941SOUGRAIGNE MICHELINE 21957 71980071979071684813423.49 9CSANS -1971BORDINAS GENEVIEVE 21957111980011993111471512024.89 9MSANS -5459VORS ANNE 21957 5199006198906 8656 8146.61 9.SANS -5423FLOQUET FABRICE 11957 3199408199308 8359 7953.59 9MSANS -0905CARREL KARIN 21957101980101979101684813423.47 9MANGL -4069JUZET JEAN FRANCOIS 11957101976071993062043315669.89 9MSANS -4527MANIGUETS PIERRE 11958 819820619810611131 9658.16 9MSANS -2372FONTANGE EMILIENNE 21958111981041980041381911366.00 9MANGL -4357RAYOL PATRICIA 21958 41994031992011202810240.40 9MSANS -5408BLANCHE GERARD 11958 41981021985112256617147.10 9MANGL -3006FOULQUES JOELLE 21958 51979031993041471512026.00 9MINFOR -6430PERIGORD PIERRE 11958 219790519780511389 9852.09 9CSANS -6468PLANTADE BEATRICE 21958101981041980041684813422.18 9MALLEM -0044MONTBRUN PIERRE 11959 51983061993121326611017.97 9MANGL -2272GRANGE JEAN MICHEL 11959 519790319820111389 9851.46 9MSANS -8185TONNER CHANTAL MARIE 21959 3199606199506 7803 7681.35 9MSANS -8317DAMESME JOELLE 21959 919940219930211389 9851.73 9MSANS -3554FRONTONAS MICHELINE 21959 61979101978101202810241.66 9MESP -3926TARNES NELL 11959 11980101993041471512024.20 9MVENTE -9173BLIGNY MARIE MADELEINE 21959 1198810198510 8656 8146.64 9.TECHN -9704DEMMLER ANDREE 21959101979101993071471512024.66 9MANGL -1648RENAULT MARIE ODILE 21959111986121991071249910472.96 9MSANS -1803HONORE ISABELLE 21959111982041981041202810240.26 9MALLEM -5795SUQUETTE SYLVIE 21959121980031995021527112374.40 9MANGL -9158ALDERBURCHS PATRICE 11959 719790619811011389 9852.67 9MSANS -8333PONCHETTES VIRGINIE 21959 7198801198510 8656 8145.83 9.SANS -5238BOURRE CLAUDE 11960 51981031984091684813423.35 9CSANS -7478ERDRE ANNE 21960 81993111992011202810240.71 9MANGL -2036SALENGRO SYLVIANE 21960 31985121984121288210744.62 9CINFOR -7716GOLF BERTRAND 11960121982071989021608112916.95 9MANGL -4057MILTAT HERVE 11960 719810419800411131 9657.84 9MANGL -2635BIGNAN MARTINE 21960 51981041992092090215980.88 9MSANS -7613PIERRE JACQUES 11961121986041990031527112374.84 9MSANS -0365CLICHY BERNARD 11961 419830519830511131 9658.07 9MSANS -2806GOIZ DIDIER 11961 119840419830411131 9658.46 9MSANS -4103BRUSC CATHERINE 21961 319940919930411389 9852.47 9MSANS -1349MAUROIR ERIC 11961 819900119870310407 9270.29 9.SANS -0451RENARD JEAN MICHEL 11961 1198810198604 8656 8145.78 9.SANS -8494CYGNE SYLVIANE 21961111983021982021326611016.71 9CSANS -9150GAY JEAN CLAUDE 119611119880719870810407 9271.52 9MSANS -3221SURCOUF GUY 11961 91984081992121527112374.97 9MSANS -3083CANADA ALAIN 11961 11982051982111326611017.29 9CSANS -0448LAVANDES GILLES 11962 319930819920811389 9850.79 9MALLEM -3439VERSAILLES MARC 11962 319840419830411131 9657.57 9MALLEM -5360VEZELAY THIERRY 11962 119880919870910791 9502.46 9MSANS -8567PRE FRANCOIS 11962 519910119940810407 9271.42 9MINFOR -0702LACOSTE PHILIPPE 11962 61985091984091608112916.14 9MESP -3016CARDELINE ELISE 21962 11993091992011202810241.27 9MSANS -7387BELLERIVE EVELINE 21962 91992111992061330611016.03 9MSANS -3882RETHACKER JEAN LOUIS 11962 719930819921210407 9272.17 9MSANS -5174SEILLANS NICOLE 21962 71983081982081608112915.08 9MTECHN -2800VILLETTE JEAN PIERRE 11962 51985041991091288210744.28 9MANGL -9420ROURES YANNICK 119621019820319810311131 9658.82 9MSANS -4001ASNIERES JEAN PIERRE 11962121987071994091693613499.67 9MSANS -8856CANALS GILLES 11962 219911219901210024 8999.16 9MANGL -9775MOUETTES FRANCOIS 119621219900219890210407 9270.91 9CVENTE -7097BROUENOU JEAN PIERRE 11962 619860319850310791 9502.82 9MSANS -8917CHANCELIER PATRICK 11962 31995021994021202810240.53 9MSANS -8358CREBILLON NICOLE 21962 61983011982011608112916.37 9VSANS -1296BERARD MICHELE 21962 119941019931011389 9850.89 9MSANS -3188CONCY MICHELE 21962 31987091986092090215979.80 9MALLEM -6829SEINE DANIELE 21962111994061993061202810240.23 9MALLEM -7876VIELLA HERVE 11963 619930119920110407 9272.09 9CESP -7396SANAJO BRUNO 11963 91987081991091249910473.60 9LSANS -7380MARINA ANNE JACQUELINE 21963 119910919900910024 8999.61 9CANGL -5941SIFFLETERIE GILLES 11963 519940219910710407 9270.56 9MTECHN -5364BOUSSY GENEVIEVE 21963 519940519920111389 9850.61 9MANGL -9502MONTOLIEU JEAN CLAUDE 11963 41985051994061527112374.72 9MSANS -8964DOUJAT MICHEL 11963 619841119831110791 9503.92 9MSANS -3405AMANDIERS PHILIPPE 11963 81984031992111527112372.90 9MSANS -1868COUPE JEAN 11963 61993031995081381911366.16 9MSANS -2984GOUSTAN JEAN MARC 11963101987111994091693613499.09 9CSANS -7572CHARONNE DANIELLE 21964 41995011994011206910240.19 9MALLEM -9668EDELWEISS JEAN BERNARD 11964 31984071991121288210745.70 9MSANS -3335CANTEPERDRIX MARIE CHRISTINE 21964 41983061982061326611017.52 9MSANS -2509FINO JEAN MICHEL 1196410199311199211 9085 8417.90 9CVENTE -1812LLORCA PIERRE 11964 21986031993091527112374.72 9MTECHN -5943BERGERIE JEAN 11964 31987021995011373711327.16 9MSANS -5136VALERIEN ANDRE PASCAL 11964 71987081986081527112373.86 9MANGL -6432ECUREUILS PATRICK 11964 3199202199102 8656 8147.19 9.SANS -2610DUVERGIER MARC 11964 91984031992031527112374.88 9MTECHN -5455CEZANNE PASCAL LUC 11965 31988091993031450311831.19 9CALLEM -7204PICCINI CAROLINE 21965121992091991091839014314.08 9CSANS -0125HUNTINGTON YVONNE 21965 91994011992011202810240.77 9MSANS -3791BOUISSETTE PHILIPPE 119651119940119950810024 8998.95 9CSANS -2711ROSETTE PHILIPPE 11965 41990101994011288210744.86 9CALLEM -4882LOZERE ERIC 11965 31988021992061450311831.91 9MANGL -4855BELLEVUE PATRICK 11965 11990101989101249910473.69 9MALLEM -3048PIERRE PIERRE 11965 7199110199010 8656 8146.61 9.ANGL -2278LOGT NORBERT 119651019900619890610407 9270.24 9MSANS -5557LAUZADEL GERARD 11965 91992071994072256617145.75 9MSANS -6129ROZ GISELE 2196510198805198510 8656 8145.20 9.ALLEM -3979RIVES YVES 1196511199609199509 9126 8455.98 9MTECHN -8688FASSUN HUGUETTE 21965 4199511199411 7803 7680.23 9MSANS -9402PARMENTIER PATRICK 11966 819880319870310407 9270.16 9MCOMPT -8428BARJAQUETS THIERRY ABEL 119661119920319910310024 8999.07 9CALLEM -8348CLERMONT ANNE MARIE 21966 11989051988051202810241.40 9MVENTE -3723COURCELLE GENEVIEVE 21966 2199506199406 7803 7680.93 9MANGL -3173CHAL ARMAND 11966101986051988061288210745.88 9MSANS -9965VENETES YOLANDE 21966 519930719920711389 9851.21 9MTECHN -6306ANJOU ALINE SIMONE 2196612199004198707 8656 8147.13 9.ANGL -5448FILHOS JEAN CHARLES HERVE 1196612199212199112 7677 7604.70 9MSANS -7571GORRE SYLVIE 21966101988121987121249910472.03 9MSANS -8890LAMORLAYE FREDERIC 11966 41986041992011450311832.68 9MVENTE -2287DORMOY GENEVIEVE 21966 31988111987111450311830.80 9MSANS -0092ALCANAL JEAN LUC 11966 61987041992121249910472.03 9CSANS -2554ROULOTTE OLIVIER 11966 419940219920110024 8999.03 9MANGL -9801GRAPPONS NATHALIE 21966 919940819930411389 9851.57 9MTECHN -1541ALDES JEAN MICHEL 11967121994051992011202810240.26 9MSANS -9290PLOEMEL YVES 11967121991051990051467711986.91 9MSANS -8169CHAUVIN FRANCOIS 11967 21994011994011202810240.53 9MSANS -6269GOLF ROLAND 11967 919940219940710024 8999.47 9MALLEM -2878RICHART ERIC JEAN MARIE 11967 819891219950410407 9271.91 9MSANS -9098OR DANIEL 11967 719880919870910407 9272.01 9CSANS -4331MONIER DIDIER 11967 719881019871010407 9270.12 9CSANS -0261ROUQUET RENE 11967 41989051988051539912452.78 9MSANS -1507FLACHAT PIERRE 11967 41994011993011420611639.09 9CSANS -7887TENDRE CLAUDE ANNE 21967121994051992011202810241.72 9DSANS -0525SERRES LAURENCE MAGALI 21967 11994011992011202810240.50 9MSANS -9421ASNIERES MARIE CHRISTINE 21967 319951119930411389 9852.22 9MSANS -3624LAPEYRE THIERRY 11967 519870119940110407 9270.12 9MSANS -0344GABRIEL JEAN PIERRE 11967 419940119920110024 8999.57 9MINFOR -7208GAZAN ERIC JEAN 11967 219940119950810024 8998.94 9MTECHN -4335GLACIERE KEIKO 21967 21994041992011202810240.89 9MINFOR -9851TOUCANS MICHEL 11968 219910119900110407 9272.01 9MTECHN -9263ROSSINI ALAIN 11968111991011995021330611018.13 9MSANS -9662DEPORT PHILIPPE GEORGES 11968 3199607199507 8656 8145.38 9MANGL -2814ALFRED VERONIQUE 21968 6199202199102 8656 8146.65 9.COMPT -3291LACUEE REMI 11968 91989021988021450311831.34 9MANGL -3557KERHOUET REGIS 119681019930319920310024 8997.86 9MSANS -6204ESCA BRIGITTE 21968 9199404199201 9597 8729.22 9CESP -1678HADRIEN PHILIPPE 11968 819931219921210363 9231.95 9CSANS -0299MONICA DOMINIQUE 21968 51994021992011202810241.70 9MTECHN -6960PRES COLETTE 21968 2199108199008 8656 8147.15 9.SANS -4443BENOIT JOSIANE 21968 81988011992011249910473.05 9MTECHN -5697QUILICHINI ROBERT 11968 31993121992011202810241.92 9MINFOR -9315PAVE LEON 11968 21988111987111539912452.39 9CTECHN -7230BOUCHE FRANCOISE 21969 3199304199204 9126 8457.67 9MSANS -8237DENEB WALTER 11969 419890919910710407 9271.47 9CSANS -3459ALISCAMPS LEONIE 2196912199610199510 8656 8146.02 9MANGL -4247ARISTIDE CHRISTIAN 11969 5199501199401 9894 8921.55 9MSANS -0137VILLEMENT ANNE MARIE 21969 81994051992011202810239.81 9MSANS -9445STREET DANIELLE 21969 7199204199104 8656 8146.74 9MSANS -9019VALLIERES JEAN 11969121990111989111381911366.90 9MALLEM -4031COLVERTS LAURENCE 21969 11993121992011202810240.89 9MSANS -4000CUENANT THEOPHILE 11969 219890619880610024 8998.09 9CSANS -7496GRASS FRANCOIS 11969 81989051992121249910472.43 9CSANS -4671GRASSET ROGER 11969111992061995121330611018.09 9CSANS -0067RESTAURANT MICHEL 11970 7199407199307 9597 8728.26 9MANGL -0824FIGARES JACQUES 11970121993101992101360611210.03 9CESP -0143MACONNERIE MICHEL 1197010199511199411 7803 7679.87 9MSANS -2934FUZELIER SYLVIANE 21970 5198906198806 8656 8146.56 9MSANS -2663TOULOUSE PATRICK 119701219930819920811389 9850.66 9CSANS -0038LANGRUNE FRANCOIS 119711119940619951010024 8998.32 9CANGL -8414VILLE NOEL 11971 41990051989051202810241.49 9CANGL -5333SQUARE JEAN LUC 11971 81995051994071450311832.45 9CSANS -3680LAUTREC CALIXTE 21971 9199602199502 7803 7680.84 9MINFOR -9370CAMELIAS CHRISTIAN 11971 5199307199207 9597 8729.90 9MTECHN -6026NADAILLAC JEAN LOUIS 119711019910219900210024 8998.44 9CANGL -4310VICTORIA ERIC 1197110199607199507 7803 7680.44 9CSANS -2394CLAVIERS MICHELE RENEE 219711019910919900910024 8998.26 9CANGL -4996GUILLAUME FREDERIC HENRI 11971 41993031992031330611016.30 9CSANS -6930ROYAL EVELYNE 219711219940119930110668 9426.26 9MSANS -1006CRAU MARIE CLAIRE 21971 21994051992011202810241.04 9MSANS -0817ATHEE MAITE 21971 81993011992011267210590.11 9MSANS -5245VAL XAVIER 11971 3199306199206 8656 8146.79 9MESP -7249CLARS ALFRED 1197110199306199206 7803 7679.41 9.ALLEM -9895JUVANTE JACQUES 11971 61995051994051450311832.69 9MSANS -4769BORDERIE OLIVIER JEAN 11972 219940719930711389 9852.20 9MTECHN -4620VERDEILLE FRANCIS 11972 619930419940910363 9232.32 9CSANS -3812BLAINS DIDIER 11972 9199302199202 9597 8729.94 9MANGL -9910FORET JEAN CLAUDE 11972 119930719921011389 9851.30 9CSANS -5930CHATEAU SERGE 11972 9199205199105 9597 8728.49 9CMICRO -3132SAGONE EMMANUEL 21972 4199601199501 7803 7679.46 9MSANS -2171BERGERONNETTES STEPHANE 11972121995111994111450311832.22 9MSANS -5929CARRIEREBLANCHE OLIVIER 11973 6199410199310 9597 8728.98 9CINFOR -6111ROCHETTE JACQUES 1197310199307199207 7803 7680.93 9.ANGL -1480CREYSSAC VANESSA 21973 4199511199411 7803 7679.33 9CSANS -9433BIS NICOLE 21973 6199407199307 8359 7951.65 9MALLEM -5673ROLLIN JEAN 11973 6199304199204 9597 8728.28 9CESP -8786MIMOSAS ALAIN 11973 21993031993061420611637.51 9CANGL -3099MAUR ANDRE 11973 41996051995051450311830.65 9CANGL -1278ENTASSI VERONIQUE 21973 7199606199506 7803 7679.67 9CSANS -6956PRIEURE FRANCOISE 21973 819930919920911389 9851.28 9CSANS -7084AVNEUE JACQUELINE 21974 7199606199506 7803 7679.99 9MANGL -9484DOUMER JOEL 11974 519930819940910363 9232.98 9CESP -9483VILLEBON REMY 11974 8199606199506 7803 7679.78 9CSANS -4120SURBAIX FRANCOIS 11974 719940819930810668 9425.81 9CSANS -6136PASSERO JEAN PAUL 11974 4199606199506 7803 7679.78 9CANGL -9119SERVAN VERONIQUE 21975 7199505199405 7803 7680.00 9CANGL -0958RENDEZVOUS BARBARA 21975 6199307199207 7803 7679.87 9.TECHN -0221ANDALUCIA SERGE 11975 1199606199506 4264 5818.98 9CANGL -1770MARIGOT DIDIER 11975 9199407199307 7803 7679.94 9CCOMPT -2889MANE JACQUES 11975 5199606199506 7803 7680.21 9CINFOR -8800CHEZ JEAN 11975 5199408199308 7803 7680.98 9CANGL -6217MURE GREGOIRE ROBERT 11976 5199607199507 7803 7679.28 9CANGL -9488HARMAS JOSE 11976 8199607199507 7803 7680.27 9CANGL -9074MILIERE ELIANE 21976 6199607199507 7803 7681.26 9CSANS -8755BOITRON MICHEL 11976 4199606199506 7803 7679.67 9CSANS -5066LOGES PATRICK 11976 2199401199301 7803 7680.72 9CSANS -7767CAVOK CATHERINE 21976 4199506199406 7803 7679.49 9CANGL -4014DELAMBRE ALAIN 11976 4199507199407 7803 7680.71 9CSANS -7434CHAMPCEVINEL MICHELINE 2197612199606199506 7803 7681.25 9CSANS -3520CATALINA CATHERINE MARIE HELE21976 9199506199406 7803 7681.34 9CVENTE -6859BILLET JEAN LOUIS 11977 7199606199506 7803 7680.36 9CALLEM -3181NADAUDS JEAN MARC 11977 2199506199507 7803 7679.51 9CANGL -0928DELACROIX CATHERINE 21977 6199607199507 7803 7681.13 9CALLEM -5100BREVAINVILLE GERALD 11977 8199607199507 7803 7679.45 9CSANS -2336ROCAMADOUR GILLES RENE 119331219861119901011131 9658.9910MINFOR -3692ALBIZZIAS DOMINIQUE 11935121965031994011557012566.3610MSANS -1060SEDS ANNE MARIE 21935 61970071991071578112722.8210VANGL -1596OPERA JEAN LUC 11935 31971101991041433211714.3910MSANS -2633SOULEYRAS MONIQUE 21935111958071993012470018540.4410MINFOR -0658LOURMEL BERNARD 11936 51967051994011932314934.8010MTECHN -1362LAC YUMIKO 21937 41965061994012137316332.6910MSANS -7201ILE JEAN PASCAL 1193711198810198309 8656 8145.1210.SANS -7674CASTE PIERRE 11937121971061993072547019086.2710MVENTE -9244LIVRY EDITH 21937 1198901198306 8656 8145.3810.INFOR -4790FRANCIS LYSIANE 21937 2199001198903 8656 8146.5210.SANS -7950CHARBONNIERE STEPHAN 11938 61972051991011433211714.5510MSANS -1814IRMA MARIE 21938101967011989091932314935.3810CANGL -0599FAUBOURG BERNARD 11938 71961011986012273717261.9010MSANS -0425PLUVIERS JEAN PIERRE 11939121971071995081557012567.3610MSANS -7312EST THIERRY 11939111971071992011433211715.4510MANGL -2010CAMP LAURENT 11939 319890119931211389 9852.1510CTECHN -3770COSTES ELIANE 21939 91980071992121471512024.9610CSANS -3046CRIMEE JACQUES 11939 719890619880610494 9309.0810MANGL -5231BONNETERIE VERONIQUE 21940 61962021988042273717260.8010VINFOR -1917CENTRE FREDERICK HENRI 11940 31961091990012739020404.0510MALLEM -0890MIEGESOLLES BERNARD 11940 21960041995043200223583.4110MESP -5720SAULX JACQUES 11941 71971071990071663613343.3310MSANS -4881DESFOSSEZ JULIETTE 21941121976051991051684813422.8110MSANS -5085ALBERIC PHILIPPE 11941 919900719950310407 9271.7010MANGL -0632BESSE PASCAL 11941 51966021989071663613343.7310MSANS -5114SHARON MICHEL 11941 21968081984062022115555.3510MSANS -4229TERRASSE BERNARD 11942 11964111993102137316332.4710MSANS -2811BROSSOLETTE GEORGES 11942 11967121990011663613343.0610MSANS -0937TILLEULS BRUNO 11942 81972061992011433211714.9110MANGL -6193ROOSEVELT CHRISTIAN 11942 71972061991011663613344.1510DTECHN -2942PETEL GEORGES 11942 21974051992071369311287.8610MTECHN -9989TASSIGNY JEAN PATRICK 11942 91971071992011403411520.6610MANGL -1548BARBIER RENAUD JEAN 11942 81961081986042273717260.1910VINFOR -9612LAURAGAIS PHILIP 11943111972031995042547019084.9710MCOMPT -0194FOUQUEVILLE BRIGITTE 21943 51963041991072273717261.1310MSANS -2327GAVOTTE JEAN MARC 11943 11974051993011369311287.1010MSANS -9716HENRI JACQUES 11943 31963041993032922321685.2910MANGL -2720LOCMIQUEL BERNARD 11943 6199301199201 8656 8145.4410.SANS -1736OLIVERAIE VERONIQUE MICHELLE 21943111971071991071578112723.5010DANGL -5205PIOCH VERONIQUE 2194412199302199202 8656 8145.2610.SANS -3085TRASTOUR GERARD 11944 61972041990011433211714.0710DSANS -0317MOUETTE THERESE 21944 51972051988101621213032.5110MSANS -5694PIERRELAIS ERIC 11945 81972091976082022115555.4410CANGL -1116BOISSISE ANNE MARIE 21945 1198901198606 8359 7952.1210.ANGL -4722BRIMONT MARTINE 21945 5199007198907 8656 8147.1710.INFOR -3958CRAMCHABAN MICHEL 11945121969011990101433211714.5110MSANS -7673SURESNES JEAN PIERRE 11945 61982011992101249910472.1010DSANS -7687VALET JACQUES 11945 61972071989011621213032.1710MANGL -8152TAILLIS FRANCOIS 21946 91976021991101578112722.6610MCOMPT -0924BONAVENTURE REIKO 21946 91971011993042547019086.4510MVENTE -8336MASSUGAS MICHELLE 21946111968111992091834514274.3910MSANS -8834LEMENC DIDIER 11946 11974031992102334017609.9510MSANS -6052DURAND LAURENT 11946 21972121988061932314934.9910MSANS -8405GAULLE JACQUES FRANCOIS 11946 31969051989012273717261.7510MSANS -7901VIOLAINE JACQUES 11946 419840719900711131 9659.1710MALLEM -9538SUEDE JEAN MICHEL 11946101971021991011433211715.6910MSANS -7317MARMONT ALAIN 11947 91973051991071621213032.1210MSANS -8240ASSOMPTION JACQUES 11947 11973011991072837121100.6710MALLEM -8104FRERE DOMINIQUE 11947 11975041993011369311286.0310MVENTE -6906VILLEFRANQUE FRANCOISE 2194810199107199007 8656 8145.4410.MARKT -4316DOMDES NOELLE 21948 51971011989082022115554.9910MSANS -8058RANGE MARIE CLAUDE 21949111973061991071578112722.2410MSANS -6117WILSON MICHELINE 21949 21970011993111834514274.5310CSANS -2977CERISAIE CAROLE PAULETTE 21949 81972051993111471512025.8210MCOMPT -3294PLOUER MICHEL 11949101969101989042022115555.4110MCOMPT -4908GIRONDE PATRICK 11949 41981091992011249910472.6910MSANS -2440AJAC FRANCOIS 11949121974081990011684813423.2610MSANS -6866MUSTAPHA VALERIE 21949 71970111994071834514275.3810MALLEM -9238CHOISY JACQUES 11950101976081992042022115555.4810MSANS -5421NATIONALE FRANCOISE JEANNE 21950 21971061995121684813422.3610MSANS -7441ROCHE CLAUDE 11950121977051993041369311288.0110MINFOR -2053LOIR MONIQUE 21951121972061990011621213032.0610MANGL -6550BELLEVUE FREDERIC DAVID 11951121970111990122470018540.4210MANGL -0900PAT VICENTE 11952 61977071991011369311287.7710MINFOR -9719BERAL YVON 11952101986101994011433211714.3710MVENTE -8718VIENNO DOMINIQUE 11952121976101991011369311287.8310MSANS -5348CRIKET JEAN 11953121979051995041471512024.2110MSANS -7442DETAILLE JOEL 11953 81973031991012334017608.5310MSANS -7704MARTILLE CATHERINE 21953 21973041991072137316330.5310CANGL -3122MADELEINE CLAUDE 11953 31978061995041471512024.7810MANGL -7454AURAY MARC 11953121972121992122175716601.7510MSANS -2338LAMARTINE DOMINIQUE 11953 81981051992011471512025.4710MSANS -5898ITALIE DENIS 11955 419941119920110791 9502.4110MSANS -2818ENTREPRENEURS BRIGITTE 2195610199506199406 8359 7951.8010MSANS -4736MONTBRIEUX LAURENT 11956 11982051991071471512024.9210MSANS -5607ORBAY GILBERT 11956121976071994011369311288.0110MTECHN -6044BRONZE CHANTAL 21956 31978031990101911114779.0510CESP -2949AIGREFEUILLE HERVE 119561119810119840811389 9851.9210MTECHN -1891POSTALE DIDIER 119561019820319810611131 9658.0110MSANS -6887ESTADOU MARC 1195712199311199211 8656 8146.8810.COMPT -3156FLACQ PHILIPPE 11957 11980081992011608112915.1510MINFOR -0665MIRAGE HERVE 11957 41978031995041249910471.8810MSANS -9619SOLEIL SYLVIE 2195811199406199507 9126 8456.9610MTECHN -7598COTES MARC 11958 41978041995041249910471.9410MINFOR -1289SOUCI ANNE 21958101980071979071194310202.5910MSANS -5278SEYSSUEL ROSELYNE 21958 51979021993071608112917.1010MSANS -5065INDUSTRIE JEAN PIERRE 11958 81978071995041249910473.1510CSANS -6257PLESSIS JEAN YVES 11959 51983041994011433211714.2810MVENTE -5018CHAUX JEAN 11959 91979061993041471512026.1810MTECHN -4009PLEIN ANTHONY 11959 719810119800511389 9850.5610MTECHN -9730PRINCE JEAN JACQUES 11960 31982051991091326611017.5010CSANS -1357TAMNIES FRANCOISE 21960 11980031979031215710279.3810MSANS -8601VALMY PIERRE M 119601019820319810311131 9657.9610MTECHN -5371ARC GILBERT 11960111988101996012773220636.1610.INFOR -0267OLIVIERS DIDIER 11960 7199312199212 9597 8728.6410MSANS -3866FLEURIS JEAN MICHEL 11960 41986021993041288210744.6410MTECHN -4485ALLEMANE PHILIPPE 11960 71983011989041608112915.2410MSANS -1801CAUTEGRIL CORINNE 21961 11981031992061527112372.9010CTECHN -0557BENEFIAT MARTINE 2196111199412199312 7803 7680.7710MSANS -2605MATHURIN PIERRE 119611019830419820411131 9658.4710MINFOR -8035BASSETTE BERTRAND 11961 31987081986081288210743.8610MANGL -4026GAJAC KARIN 21962 81983011982011608112916.3210MSANS -8790TREDREZ LEONIE 21962 71986061985061288210745.2210MSANS -0932BASTIDON MARYLENE MARTHE 21962 7199301199201 8656 8146.4210.SANS -1052MARJOLAINE PHILIPPE 11962 11984111991071868714507.4710MSANS -3917FONSORBES JOEL YVES 11962111982061988051326611016.6210MALLEM -6770ROUBIN FREDERIC MARC 11962 719840419870211131 9658.4110CSANS -9591BAS EDOUARD 11963 319850419841210791 9503.5810MSANS -0126LALA MICHEL 11963 219830619820611131 9658.7410CESP -0547GAUMERIE EDGAR 11963121985011994011433211714.2510MANGL -5064LOISIRS GEORGES 119631019851219860510791 9503.6610MALLEM -6975BOUCHET YANNICK 11964 61985111985112090215981.0610MESP -2365TERNES ERIC 11964 51983081994011433211714.4310VVENTE -1287OIDE MARIE LOUISE 2196412199201198703 8656 8146.9710.SANS -1746MICHELETTE GERARD 11964 619840719830710791 9503.7410MSANS -4496COLONEL MONIQUE 21964 41984091983091288210744.8610CSANS -6420MERCURE MICHEL 11965 61985121993121288210745.0010MSANS -2452FEUDON ANNICK 21965 81989061988061249910471.8910MANGL -3490DION ALEXANDRA YVETTE 21965 6199504199404 7803 7680.5910MVENTE -9441GALLET JEAN CLAUDE 11965 11991021994022256617147.1310MSANS -8588JARRES GERARD 11966 919880319870310407 9271.5610MSANS -1291HERMITAGE XAVIER 11966111991101990101330611016.3310CSANS -6530ETRUN PATRICK 11966 31989111988111539912452.4210MANGL -1352PLAIS JUAN CARLOS 11967 419870719860710407 9270.9110MSANS -7277REY MICHEL 11967 21995081996012559919162.3610CSANS -1793BARBE VALERIE ANNE 21967 5199201199101 7803 7680.5910.INFOR -3158KERIOLET FRANCOIS CHRISTOPHE 11967 41990051992121381911365.8510CSANS -0027DANS JEAN PIERRE 11967 719920119910110024 8999.9910MSANS -6374PUISEAU THUY LAN 11967 61987041991121249910472.2410MESP -9025BEUVRON PATRICK 1196711199606199506 7803 7679.4610CANGL -9820CHARLES CATHERINE 2196710199507199407 8656 8146.4610MALLEM -6484VIGNAUD PATRICK 11969 91990071992031381911365.6710MSANS -1414BRUNE SYLVIE 21969 619890219880211302 9775.1910MSANS -4633MICHELET JOHAN FR 11970 619901219891210024 8999.7210MINFOR -2182PLANTIER PHILIPPE 11971101995091994091450311831.5510CSANS -8157LILAS PIERRE 1197210199207199107 8656 8146.5510.SANS -5454LOIR MARIA 21973 5199406199306 7803 7680.1410CANGL -9209CARREFOUR SERGE 11974 6199505199404 9126 8455.7410MALLEM -3395ADAM JEAN CLAUDE 11974111993091994011202810241.5810CSANS -8662REIGNIER JEAN MICHEL 11975 9199607199507 7803 7681.4710CSANS -8679MOUTONNE MARIANNE 21935 9199408199201 9085 8419.1611DCOMPT -9359RASPAIL ALAIN 11935 91963121994103200223582.5411MTECHN -0977DELBESSOU JEAN CLAUDE 11935 91958051992013844228044.4211MANGL -5628REPUBLIQUE PHILIPPE 11935111967011995041557012567.7211MALLEM -5361CHAUMIERE CHANTAL 21937 91967011992011471512024.5111MANGL -8814KIKOCHI CHRISTINE 21939 819880519870510407 9271.4611MTECHN -3550CONCLUE PAULETTE 21941 21973081991071578112723.7211MTECHN -3525PAU CLAIRE 21942 81965021991122334017609.2411DSANS -6963CEZANNE CAROLE 2194310199411199311 8656 8146.7911MALLEM -1837FRIZAC PETER 11943 81976041995011578112721.6711MINFOR -5658SOLANGIERE JEAN 11944121969121990041433211715.0511MSANS -7261MONTGERMONT SOPHIE JEANNINE 21945111971111995041834514274.5111MANGL -4785LODI PHILIPPE 11945 21980071994011471512024.5611MESP -5841PORT JACQUELINE 21946 41970021969021300910822.2611MANGL -0606BAGEN MARIE JEANNE 21946 11970121993032022115555.6811MSANS -5640GALLIA BENEDICTE 21946101973101993121911114780.1311MINFOR -0298BRETIGNY MICHELINE 21946 5199208199108 8656 8145.8011.TECHN -3925PELLETIER MARTINE 21946111968111993012137316332.0911MSANS -7692BARBIN MARIE NOELLE 21948 21968111990012137316331.0611CINFOR -3739JUIN MARCEL 11948111981091992011249910472.7411MSANS -7300URANIES CHRISTIAN 11948 91973021992011433211714.6011MTECHN -6456TUBLERIE CAROLE 21949 81968111992032470018540.0611MANGL -3324TAMANACO MARTIAL 11949 21974061993011369311288.2211MSANS -8400LOIRE MURIEL 21949 41969031991091834514275.4511MSANS -9140RENAITRIE CLAUDE 11949101980071995041249910473.7211MSANS -5589SITE PATRICIA 21949 7199508199408 7803 7679.4611MVENTE -5386MEDECIN JACKY 11950 21975051992101369311286.8711MSANS -2377VOLTAIRE CHRISTIAN 11951111976101993041471512025.2511MSANS -4340BAUDRIMONT JEAN FRANCOIS 11951 41984071993121326611017.5511MINFOR -0397PAREAGE JEAN YVES 11951 81979071994101249910472.9611MANGL -9259PEYRAS CHANTAL 21951 4199608199508 7803 7679.6411MVENTE -1711ESTAGNOL BRUNO CLAUDE 11951121983051992071578112722.6611MINFOR -4351CHARRON ANNICK DENISE 2195210199408199308 8359 7952.4311MALLEM -2396CHAPELLE JOCELYNE 21952 41976061975061288210745.0911MANGL -3571OBSERVATOIR NICOLE 2195211199610199510 7803 7679.9911MSANS -2219LISA MARIE LOUISE 21952 11973061991041578112722.4211MSANS -7029VIERGE DANIEL 11953 51976091994112547019086.5111MSANS -6315EPSOM LAURENCE SONIA 219531119961019951010668 9425.3111MSANS -8330GUISE VERONIQUE 21954 91975071974071215710279.3211MTECHN -4963GUILLOTIERE ROBERT 11954 21977071992072350617727.3311MSANS -9223MARCHAUX JEAN PATRICK 11955 91975031991071578112722.0711MINFOR -8081JAMBLES BERNARD 11955101980061995041249910472.1211MSANS -2906DOUGLAS ERIC JEAN MARIE 11955 21978051994011369311287.7711MSANS -3749MAGNAN PIERRE 11956 7197910199111 4134 0.8911MESP -8176THENOT DIDIER 11956 71980021982102470018541.8311MSANS -3392SIMON PIERRE 11956 61979021994041249910472.7011MSANS -6393BERGERS LYDIE 2195611198901198604 8656 8146.4111.VENTE -7181CABAUDRAN FREDERIC MICHEL 11957 21978061991102529918969.2211MSANS -6568LANDEDA THIERRY PATRICE 11958 31979071993071471512025.9511MSANS -0333DAPHNE CHRISTOPHE 11958 719820619810611131 9657.6211MSANS -2504TREICH JACQUES 11959 51982051994081638413149.5711MALLEM -3534KHRAIEF CHRISTIAN ANTONIN 11959 61981031995021433211714.7011MSANS -9601PECLET GENEVIEVE 21959 119791019781010024 8999.7411MSANS -2575BELLEVUE FRANCIS 11959101980051991091369311287.1611MSANS -1679GRIGNAN GERALD 11959 71981081993081804514082.7211MANGL -4039GOULAINE EDWIGE MARCELLE 21959 51979081993071471512024.9611MSANS -3106YABBOQ CHRISTINE 21960 119910619900610024 8999.7011MANGL -5771GONDS JACQUES 11960 21983051995011433211713.8911MSANS -3478ATHOS FRANCOIS 11960 21983081989112090215980.7311MSANS -3217MOINES FRANCE 21961 51982111981111326611017.1611MTECHN -3318EPINAY DIDIER 11961 51982111995091450311832.0011MVENTE -0241PROVENCALE CHRISTINE 21961 11984021983021249910472.6111MSANS -7712JANVRY CHRISTIAN 11962 41986081995011373711328.3211MTECHN -8426FILET GLORIA 21962 1199607199507 8656 8146.2911MSANS -2991BOIRARGUES MARC 11962121982061990091326611016.1711CSANS -4250FOREST ANGEL 11962 219830819950911131 9657.3911MINFOR -0642GOGH ANNICK 21962 719960219930410668 9427.0711MSANS -3978FONDETTES YUKIKO 21963 71984081983081527112374.5211MANGL -1989BRANCION MARIE JOSEPHE 21963 51990041993081330611017.2911MSANS -7919CERFS BRIGITTE 2196310199310199210 9597 8729.1711MALLEM -6531DORMELLES PIERRE JACQUES 11963 41983041982041326611016.5111MSANS -0104SALETTES FREDERIC 11963 219860519850511131 9658.8611MMICRO -3391LAURISTON JEAN CLAUDE 11963 41983061991091326611017.6511MINFOR -9918BOULEAUX DANIELLE 21964 8199505199405 8656 8146.1111MSANS -9860MOREAS LOIC 11964 2199303199203 9597 8728.9811MSANS -4629LEMBRAS MARC 11964 31988041989011527112374.8411MSANS -8531SIGNORE CHANTAL 21965 4199607199507 7803 7680.8911MSANS -5775GRANDS LINDA 21965 41988061987061249910473.6311MESP -0548VALERIEN PHILIPPE 11965 71986041995041710713577.0111MSANS -5728MUCHARISTA GILLES 11965 81985071991121288210744.9511MSANS -0495ALIZES JEAN MICHEL 11965 61986071993111288210745.2211CTECHN -3119GAMBETTA JEAN PIERRE 11965 519851119841110791 9502.2311MANGL -7770NOTTET CHANTAL 21966 31985101984101288210744.2611MALLEM -7186ILLIERS FRANCK 119661219921119911210024 8998.3111CANGL -5800COLOMBIERES VERONIQUE 21966 71992081991081202810240.8611MSANS -8549ROMAI PATRICK 11967 81987041993081450311830.5811MANGL -2557CHAI CATHERINE 21967 9199201199101 7803 7680.9811.INFOR -5044ROUSSILLON HIOU SHU 21967 51987111993031381911365.1911CSANS -3101MARECHAL JACQUES 11967 91988071993011839014313.7211MANGL -9282LEOPOLD ALAIN 119671119880519890910407 9271.9711MSANS -1201PEYRERE PASCAL 11968 919881219871210407 9270.4211MALLEM -7061TEICH PAUL 11968111994031993031267210588.7411MSANS -5746HARRIAGUE GERARD 119681119900919890910407 9271.1911MANGL -6486MAR ALAIN 11968 1199404199304 7590 7564.3511MSANS -0773VICTOR JEAN CHRISTOPHE 11968 71994081993082107316096.7111MALLEM -3494VILLARCEAU ISABELLE MARIE 21969 7199609199509 9894 8921.5911MSANS -1068AMOUR DIDIER 11969111991051990051467711987.6711MINFOR -1796ROCQUENCOURT FRANCK 11970121991091990091202810241.7011MANGL -6197WRIGHT ANNE 21971 919930319920311389 9850.7011MSANS -9660CYPRES GERARD 119711019900719890710024 8997.9011MALLEM -8022ARCAY CLAUDE 11971 51992111991111202810240.1311MSANS -3764CHEMIN FABIENNE 21971 219951119941110668 9425.6411MVENTE -2448PINCHINADES JEAN CLAUDE 11972 21995051994051450311831.0111CALLEM -1927VALESCURE PHILIPPE 11972 4199501199304 9597 8728.7711CSANS -2074AZUR DIDIER 11972 51993111992111267210588.5311CTECHN -9842BASTIDE ERIC 11972 5199312199212 9597 8727.9111CSANS -5954SABLES ROCCO 1197212199305199205 9597 8728.1911CSANS -0278PAIXENT JEAN MICHEL 11972121994101993101360611210.6011CSANS -1572DAGNY BRUNO 11972 11993101992101360611210.2811MSANS -4298AIZIER NICOLE 21972 219940719920111389 9852.4211MALLEM -2321DESIRADE EVELYNE 21972 119910719900710024 8998.1311MTECHN -6794CHEUVRY PHILIPPE 11973 9199207199107 9597 8729.9211CSANS -8383ETIOLLES ANNE MARIE 21974 5199607199507 9894 8922.2111CSANS -3562PORSCAVE GEORGES PASCAL 11974 1199508199408 7803 7679.9911CANGL -6773GERANDO NICOLE 21974 51995051994071450311831.9711CANGL -4226APPY BERTRAND GEORGES 11975 2199606199506 9256 8532.5611CTECHN -1343SANS FRANCOIS 1197510199410199310 9126 8456.3911CSANS -6979ANGLAIS NADINE 21975 7199304199302 8656 8145.5711.SANS -5254BERLIOZ DANIELE 2197610199607199507 7803 7680.5011CTECHN -0275FRIARD GERARD 1197610199608199508 7803 7681.4711CSANS -3929CHATEAU VERONIQUE 21935 2199301199201 9085 8417.4612VANGL -2917PASTEUR NICOLE 21935 31967071990011932314933.6012MSANS -4491FALLIERE CATHERINE 21935 7199109199507 7677 7603.7312.ANGL -4190CHRISTOPHE DOMINIQUE AUGUSTE 11935 31977111992101369311287.1912MANGL -3826RAYON BERNARD 11935 319830819820811389 9851.7412DESP -2841SEVERINE PHILIPPE 11936 6199409199309 8656 8146.7412MANGL -6337FREDERIC CATHERINE 2193812199201199101 9085 8417.6312SSANS -7355ANTOVAL JEAN FRANCOIS 11938101961021995043200223582.3212MANGL -8990DETALOUX CLAUDIE 21938 71962071984102273717260.0812CSANS -7576SEBASTIEN BERNARD 11939 51971121991071663613343.3712MCOMPT -3808CABRIES ANNE LOUISE 21939 31973071985041834514275.9512VSANS -3333BOSQUE JEAN YVES 119391219900919920310791 9503.1612CTECHN -0851ORANGERS CHRISTIAN 11939 11973071992011433211715.2212MALLEM -7226ROYA FRANCOISE 21939121962121983122470018541.7912MSANS -4767DOMITIA VINCENT 11939 6198912198504 8656 8145.1112.VENTE -1932LEROY FRANCK 11939101968101991011433211714.2112MTECHN -4220GUERINIERE MICHEL 11940 11971041991011663613343.9712MSANS -5021MONTLANDON RENE 11940 61973041993011369311286.6612MSANS -3088ALTAIR NICOLE 21941101962031994122470018540.1712MSANS -2222MILLET JACQUELINE 21941 21970051992072137316331.7812MALLEM -6726HURONNERIE CHRISTIAN 11941101980031992011403411521.2912MANGL -1951ROSIERE GILBERT 11941 91971031990011433211715.5412MSANS -4436CHAVANNES MARIA LUIZ 21942 51968111991072137316332.6012MSANS -9151CHATONNAY PAUL 11942 21969021990071433211715.6312MTECHN -2643SOUSBOIS DOMINIQUE 21942 31962041988122470018540.2412MSANS -6554SARCELLES JEAN MARIE 11943111963071993083200223584.0712MTECHN -6672RENDEZVOUS FRANCOIS 11943 11969091990101663613343.6012MSANS -3579RUISSEAU DANIEL 11943 31965011994011557012567.1812MANGL -0484PAUL CORINNA 21943 61965121988062470018540.6612MSANS -3880ROUVRES ERIC 11943 819931119950610407 9271.7412MSANS -4665MONTEE JOSETTE 21943111968041991052470018540.5712MSANS -3302VERS JEAN 11944111970061991011433211714.8712MANGL -6749AUCUN JEAN CLAUDE 11945 11974071992041471512025.0212MINFOR -6957RESIDENCE EVELYNE 21945 61971071991101578112723.4212CSANS -1669CHEZY PIERRE 11946111976051993011369311286.0612MSANS -1674AVENIDA SYLVIE 2194611198806198706 9511 8688.4112DINFOR -6741FONDS GEORGES 11948 11977041994011249910472.1012MSANS -4859ZORI CATHERINE 21948 81968111991021834514274.7012MSANS -1314MINES JEAN MARIE 11948 31975061993071369311288.1812MALLEM -5393PROVEN ANNICK 21948 9199309199209 8656 8145.0612.ALLEM -9886FLAUBERT YOLANDE 21948 41968041995111684813422.3612MANGL -8118JUGY JACQUELINE 2194912199504199404 8656 8146.6412MTECHN -3693RETRAITE MARYSE ARMANDE 21949 9199201199101 7803 7681.4712.SANS -7335PETITES MICHELLE 21949 71970101990112043315671.1512MSANS -6896MERIMEE PATRICK 11949 11972031995011834514274.2412MANGL -0173RESIDENCE HARRY 11949 71973061992101369311287.1412MVENTE -7211LAVIGNAC MARIE ANNE 21950 6199307199207 7803 7680.0912.SANS -6258DEAUVILLE SALIM PHILIPPE 11950 61975101993011684813423.4912MSANS -6945BERANGER AGNES 21950 11970011989011621213034.1012MSANS -6072LAZUEL CHANTAL 21951 11971051995041834514274.4412MSANS -3233GRETZ PATRICK 11951 61981041993011608112917.2412MSANS -3090VERTS THERESE 21951 21972101987072334017610.2012CALLEM -4522POISY BRIGITTE 21951 41973051991011578112722.7012MSANS -1211SAINTE PIERRE 11951 219940119940110407 9272.1312MSANS -9697RUE NADINE NICOLE 21951 11977071991051608112915.7412CTECHN -7336GRURY ANTOINE 11951111977051993041369311286.9212MTECHN -4900BENARD JEAN LOUIS 11951 71973081992032470018540.1512MSANS -0543BARETY JACQUES 11951 71977031993011369311286.8012MSANS -4195GRENIER THIERRY HENRI 11951 71979011994111403411522.0912MALLEM -6636BERANGER JEAN PIERRE 11951 619831219821211131 9659.0112MALLEM -1282PALOMBES OLIVIER 11952 81979061995011621213033.3712MESP -7146VENERIE YANN MAR 11952101981031992011249910473.4712MSANS -8503GIRELLES MARTINE 21952 41993111992011202810240.1312MANGL -9767ROUBLOT FREDERIC 11952 71976121991071578112722.3712MSANS -1506BELLES SERGE 11952 1199301199201 8656 8146.7012.SANS -5411MERMOZ BRIGITTE 21953 419910919900910024 8997.8112SSANS -8001PANORAMAS JACQUES 11953111980031992101369311287.3212MALLEM -8972NOGUES JEAN 11953121981091992011249910472.0112MSANS -6536MARX EVELYNE 21953 7199201199101 9511 8688.8912MANGL -3768LAMBRIGOT PHILIPPE 11954 51976071991012022115554.5412MSANS -0662BRACQ GEORGES 11954121975111993121369311286.4712MSANS -5304BETOUILLERE NORIKO 21954 71979061993041433211713.9212MALLEM -4215PARA KARIN 21954 91979071992111608112915.5312DSANS -2037FORGE LUCIEN 11955 21984021992111578112723.2412MSANS -2945ABBEVILLE PASCAL 11955101983101993011471512025.4612MANGL -2849NERTHE MARTINE 21955 21978091993101471512025.9212MSANS -3488REVOL ANNE 21955111977071992011471512024.0612MSANS -4431LAUNAY LOIC 11955101984091993011215710278.6912MSANS -8724CASSIFLORE ROGER 11956 11976071985102397418036.3812MANGL -0629FRANCOIS SANDRINE 21956 91977071995101881314586.0612MSANS -4823RENARDIERE JEAN LOUIS 11956 41977031992111608112915.2912MSANS -8808ENGHIEN MAX 11956 91977061992011471512025.6512MVENTE -2432MICHELE ISABELLE 2195710199611199511 7803 7679.4512CINFOR -7158CAPITAINE DOMINIQUE 21957 91978061993031608112917.0412MSANS -6317COURLIS GUY 11957 21980051992121369311286.7412MSANS -7608DESSUS SABINE NICOLE 21957121979031993041471512025.2812MSANS -3637PEYRIERE FRANCOIS 11957 81979111995101911114778.2412MSANS -9600HAKEIM THIERRY 11957 51981031986092256617146.6812MANGL -1537RESISTANCE SERGE 11958 81986031991101868714506.0112MSANS -3033PIERREDON JEAN LUC 11958 51980041992121471512024.7812MSANS -9058ROYALES ALAIN 11958 31982081994041326611016.6912MSANS -1074PONTILLARD JACQUELINE 21958 51981111980111608112915.8412MALLEM -0339VERNOCE THIERRY 11958 81982041994041471512025.3212MSANS -1325ZOLA CHRISTINE 21958 81978121993041471512024.9312MSANS -6083HAIG MICHELE 21959 419791119781110876 9502.3712MSANS -9351QUIHOU STEPHANE 11959 41988061992091450311831.2512MSANS -9582LAENNEC COLETTE 21959 41983071982071326611016.0812MSANS -5220RECOLLETS YVES 11959 51981011994011471512026.1512MSANS -5140DAILLON DOMINIQUE JEAN 11960 31984071995081527112374.5812MANGL -4446ELPHEGE PIERRE YVES 11960 419840319830811131 9657.2612MANGL -0969BOUNIN PHILIPPE 11960 71983031991111616712995.2012MSANS -2335CAILLOUP CHRISTINE 21960 11980091994071471512025.0212DSANS -8339MER ISABELLE 21960111980101979101684813422.5712MANGL -6061ESCALES JEAN MARIE 11960 51982051995121804514082.6512CSANS -0818GATTIERES PATRICE 11961121983121989031527112373.0812MTECHN -5053LARUE KARINE 21961 8199407199307 8359 7952.0712MSANS -9219OPALINE EVELYNE 21961 61983111982111202810240.8412MALLEM -6160LAURENT ANNICK 21961 51982091981091527112373.7112MANGL -9514GARGAS NICOLE 21961 31981041980041684813421.4912MSANS -2936KIPLING ERIC 11961 419830419830711131 9659.2212MTECHN -3023BOREL PHILIPPE GILLES 11961 51982041981081608112915.8912MSANS -5767BORGHERE PASCAL EMILE 11961 51985061989112090215981.0912MSANS -9519SUISSES PHILIPPE 11961121985031984031608112916.4312MSANS -7271BOUEL JEAN LUC 11962 21982071990101527112374.1612MSANS -1969BIERE SIMONE 21962 3199404199304 8359 7953.2412MESP -1388MOLIERE GERARD 11962 71987081988011527112374.2012MSANS -5714NICOLO DIDIER 11962 11983071984121608112916.8112MCOMPT -1039ATTILL ERIC 11962 91983081984091608112916.6412MALLEM -4474SAUSSAYE MICHEL 11962101989011992121249910471.9712CANGL -0108ORBESSON MIREILLE 21962 81983041989112090215981.4112MSANS -8464DIJON JEAN LUC 119621219860219850210791 9503.7012MINFOR -0217MAGDEBOURG PIERRE 11962 51986071995011373711327.8712MANGL -5259VANOEL SERGE 11963 81984021991011868714507.8512CSANS -6176GOETHE GILLES RAYMOND 11963 41983051993121326611016.5712MSANS -3711SIGNAL KARIN 21963 6199407199307 9126 8456.8212MCOMPT -5792ARCACHON SERGE 11963 519931019910710407 9271.9712MCOMPT -2491OSSOLA ANNIE 21963 51993101992011202810240.2612CSANS -5463PERE JEAN LUC 11963 819860319850310791 9503.8812MSANS -0572ALSACE MICHEL 11963 219830619920111131 9658.0212MANGL -5197LATECOERE BERNADETTE 2196411199201199101 7803 7680.2312.SANS -3820SAUSSES MICHEL LOUIS 11964 31986061985061288210743.8312CINFOR -3831CRESP BRIGITTE 21964 6199109199009 8656 8145.8412.TECHN -7862GUILLEMARD GERARD 11964 619870419880910791 9503.2712MSANS -3863TREMOILLE LAURENT 11965111989011991051249910473.0012MTECHN -2269VERDUN DIDIER 119651019870219910110407 9271.4212MSANS -4817VAUCLUSIENS JEAN PIERRE 11965101986051991091288210743.8612MVENTE -8120BUSSIERE LYNDA 21965101988041994121450311832.2912MSANS -9872ROTTEMBOURG PHILIPPE 11965 71985071991091288210745.6112CALLEM -3157GEORGES MARC 11965 119870219860210791 9502.1412MVENTE -5375GRAFFIANE ROBERT 11965 119870419861210791 9502.8912MSANS -9838SELLE XAVIER 11966101992011991011202810240.9512MSANS -4716BEG PASCAL 11966 61987061992041249910473.4212CANGL -8142FONTENIL MADELEINE 21967 91990051993051723313653.6012VESP -4631ROBINS ISABELLE CAMILLE 21967 61993111992011202810241.8112MSANS -0875RESISTANTE ALAIN 11967 61988041994011249910473.1812MSANS -7618JUANE JOSEPH 11967 919880919910210407 9270.4812MSANS -6297QUINT MARIE CHRISTINE 21967 11989121988121202810240.8412MINFOR -9234SAINTRY FRANCK JEAN 11967 619891019881010791 9502.8912MSANS -0878MERIMEE GUY 11967 81990011989011467711986.9112MSANS -7463VALETTE BERTRAND 11967 91987051994051381911366.9312MSANS -1043RAMBOUILLET JEAN FRANCOIS 11968 81990071989071381911364.8712MANGL -2350PANPYC CLAUDE 11968 91990111989111467711985.8712MSANS -9468GUEPIN EVA 21968 41989051988071949415051.6812MSANS -4690VERLIN YVES 11968101989111994011249910473.4712MINFOR -4832BAYARD CORINNE 21968 21990111989111202810239.8312MSANS -2141CHATAIGNIER CATHERINE 21968 519940919930411389 9852.2212MMANAG -2439AIGUILLE CATHERINE 21968 9199407199307 8359 7952.2512MVENTE -2895PASSAGE PHILIPPE 11968111990031989081381911366.2212CSANS -6720ANTHEOR VINCENT 11968 21988051993041249910472.6412MSANS -4877AUBIN PATRICK 11968 71990011989011202810239.7812CSANS -7975GUITTARD ISABELLE 21968121993121992011202810240.1912MSANS -3884DESMOULINS ANNIE 21969 2199510199410 7803 7680.5012MSANS -4326CASSIOPEE JEAN PIERRE 11969 21989031988031249910473.5612MSANS -9844DAUDET ROBERT 11969121993101992101330611016.3012MALLEM -1235TRANSIT CHRISTINE 21969101992031991031420611639.2212CINFOR -9148CARTIGNY TONY PIERRE 11969 81994091993091450311830.6212CMANAG -1898VEUVE BERNARD 11969 119891019881010407 9270.6912CALLEM -4856BELIER JEROME 11970 11990111992011381911365.6212MSANS -3215BASTILLE GILBERT 11970 219921019911010024 8997.8612CSANS -1681VAUCHAMPS THIERRY 11970 319940419930111389 9852.2412CVENTE -0330GIRAUD DIDIER 11970 319940319920110024 8998.7112MALLEM -2920FONZERI PAUL 11970 81993061992061267210590.0212MTECHN -3390CLANS LOUIS 11970 51989111988111539912451.9712CSANS -7148OISEAUX FRANCE 2197011199004198904 8656 8145.6612.MANAG -2817GAIRANT MONIQUE 21970 319910719900710024 8997.9112CSANS -8162VOLONTAIRES MONIQUE 21970 5199410199310 7590 7564.3812MSANS -9567LEGUMES CHRISTINE 219711119950419940110668 9426.0312MANGL -2435BRESSON SYLVIE 2197112199007199101 8656 8145.9312MSANS -0955BEAUGENCY LAURENCE 21971 1199206199106 9597 8729.9712CSANS -4021VICOMTE ROLAND 11971 119900619890610024 8998.0112MINFOR -7963MONTESQUIEU HENRI 11971 51993081994011249910473.0512MVENTE -9955WAY JEAN MARC 11971 1199305199205 9597 8728.0112CSANS -1833INKERMANN LAURE 21972 919930519920511389 9851.3912MANGL -4630CHEVREUILS CHRISTINE 2197312199306199206 8359 7952.0112.TECHN -3273MIREILLE ALAIN 11973 819931119921111389 9851.5512CMARKT -6842DARONNE ALAIN 1197311199307199503 9597 8729.2212CINFOR -5953BOURGEOIS BRUNO 11973 21993081994011202810241.9212MSANS -3467PONTIER ALAIN 11973 619930919920911389 9850.5612MSANS -6507MAYVILLE CHANTAL 21974 1199208199302 8656 8146.4112MANGL -4060HALLEGUEN MICHEL 11974 11993121994011202810241.7012CSANS -8760RAGUINOT GHISLAINE ROBERTE 21975 1199507199407 7803 7681.4412CSANS -1454NEUF GILLES 11977 9199606199506 7803 7681.3512CSANS -2092BRASSAURIS MICHEL 11931 91956101978013327724477.6013VSANS -8552VIOLET DIDIER 11933 4198810199501 8827 8263.5613.SANS -6589DEVENCON BERNARD 11934111955111993103417325098.4513MSANS -7036PERNETY FREDERIC 11934101961111987102273717260.4013MINFOR -7079CHARDONNERETS LAURIS 11935 31978071992011403411520.5313CINFOR -9868JAURES MICHEL 11935 51970051992011403411521.2013MSANS -8365HELIOTROPES LISE 21935 11963021991072273717259.8613CSANS -7450POISSON CHANTAL 21936 91968111989011621213033.5613MINFOR -9779CONSOLACAO NATHALIE 21937 3199401199201 9085 8417.3613VSANS -8202DIANE JACQUELINE SUZANNE 21937 61972041989101621213032.8713VESP -5521LAZURE RAOUL 11937 31966021995011557012567.6313MTECHN -7843NOM ETIENNE 11938 1199001198510 8656 8145.6213.SANS -7282IRISASCO ERIC STANIS 11938121958081988013844228045.3713MSANS -3124VIVIER GEORGES 11939121967011994011663613342.8513MSANS -1445GAUSSADE FRANCINE 21939 11967121992012137316332.1113MSANS -5399GROSSETI JACQUES 11940111969011990011433211714.7913MSANS -7177MONTSEGUR DOMINIQUE 11940 2199206199106 8656 8146.8313.ALLEM -4475SOLEIL JEAN CHARLES 11940111962041993043417325097.6413MINFOR -6615GRAVELLE CLAUDE 11940 419880319870810407 9270.3013MESP -5880OR LILIANE 21940 8199301199201 8656 8147.0113.ANGL -0756RENARD PATRICK 11941 71960041991013327724477.7213MSANS -9016SIMON JACQUES 11941 81973061992101369311288.1813MANGL -4931AIGNAN SALOMON 11941121972111992011403411520.2913MSANS -7676ROUX DOMINIQUE 11941 81969121990011433211715.5413MSANS -3434NOUVELLE GUILLAUME 11941 31970061991011433211715.4713MSANS -1569MOULINS CATHERINE 21941 31993051993101249910472.9113MSANS -4399SOLDATS ANNE 21941 71963091994011932314934.0013VSANS -4929MANOUCHIAN RICHARD 11943 41979011992011249910473.3213MALLEM -5101CLOT PATRICK 11943101977041995011578112723.1813MSANS -1399PLANTES MEDERIC 11943 61962111991072273717261.5413MTECHN -4835LECHIAGAT MAURICE 11944111963121993082922321683.6013MSANS -2862CASTELROC PHILIPPE 11944 81968091988062947921840.0613MTECHN -5852PUGET JEAN LEO 11944101971011990032022115554.8113MSANS -4369BOUCHER LUCIEN 11944 51976051991012022115555.3913MALLEM -6206VERANE COLETTE 21945 11975101987031684813422.3113MSANS -2842ROND THIERRY PIERRE 11946 11967121993013844228045.1613MANGL -8250JULIEN MARIE PAULE 21947 4199409199309 7803 7680.0013MINFOR -4160ALLUES DANNY 21947101978071993012529918968.6013MSANS -8190BUT CLAUDE 11947 71982041994011471512024.0813MANGL -9979FLORALE STEVEN 11947 21975041992101369311286.7813MANGL -5458BEYNAC PIERRE 11947111972031994011663613343.8813MESP -5735CONDE THIERRY HENRI 11947 51976041995011578112722.5213MSANS -6972BIRAC DANIELLE 21948 41973071991071578112722.1913MSANS -8328MAC LAURENT ROLAND 11948121977031993011369311287.1013MSANS -8020COMMODORE JACKY 11949 21977031993071369311287.0713MSANS -9492BOURGADE FREDERIC NICOLAS 11949 91972081986092470018540.6013MANGL -7494HAM JEAN BAPTISTE 11949111979041993081369311287.1913MSANS -2684LANTERNE JEAN PIERRE 11950121975041991071578112723.1813MSANS -8110LACOUSSIERE MONIQUE 21950 71993101992011202810240.4013MANGL -4050HERBILLON FRANCOIS 11950111971051991012470018540.6113MSANS -0115ACHILLE JACQUES 11951 41976021992091834514274.9313MSANS -6913MADAGASCAR FRANCOISE 21951 81977101993041471512024.8713MANGL -9541FARGE FRANCOIS 11952 91984031994011433211714.8813MANGL -1147VERTES GEORGES 11952111979041991011608112917.2413MANGL -3720FRESNE PASCAL 11952 91973021992082022115554.4213MALLEM -3427LYAUTEY SOPHIE 21952 91973051991011578112723.4213MALLEM -6348TOURELLE BEATRICE 21952 51972061990011621213034.1513MANGL -6291MONTMERY MICHEL 11952111978091995011578112723.5413MSANS -9048VILL YANN 11953 51981021993011369311286.6913MSANS -2556GAGNEUR MARTINE 21954 3199611199511 8359 7952.9113MTECHN -5041GALAND MICHELE 21954121981071995071433211714.0113MSANS -6421OUERRE CHARLEY 11956111982071993011249910473.1113MESP -8090BALISE JOEL 11956 61986011995011373711326.7113MSANS -6312RASPAIL CAROLINE 21956 619940619920111389 9852.5113MSANS -6598RUBENS JEAN MICHEL 11957121976121992011578112721.6513MMARKT -7944MAUBEUGE JEAN ALAIN 11957 11982031981031326611016.2913MMARKT -8793MOREAU BERNARD 11957111985051988031288210745.0413MANGL -8404CHEVERNY OLIVIER 11957 51983081995011578112722.8713MSANS -1860CHAMPIGNY JEAN HUGUES 11957121978031993051608112916.7213MSANS -9938CHARENTON PASCAL 11957 21981061993011471512025.2513MSANS -0001TASSIG ARMELLE 21957 71982031981031288210743.8113MSANS -6966GARE MARIE THERESE 21957 41979101993071471512025.8213MINFOR -5849ELOI FRANCIS 11958 21983051993011215710279.9913MALLEM -0222GERTWILLER ROLF MIC 11958 61983061995061894014661.1213MINFOR -9106MAISON JEAN CLAUDE 11958 11978021992051471512025.5613MSANS -3045BATISSE PHILIPPE 11958 51977121992012175716600.9413MVENTE -6087HUCHA ANNE NATHALIE 21959121981011988112090215981.6313MSANS -7732GENETS JEAN DENIS 11959121986061985061288210745.3913MSANS -8156BRASLES BRUNO ROGER 11959 81984041995071433211714.0613MSANS -4809GENEVOIX ALAIN 11960 219810919810111389 9851.6613MTECHN -2618BOCOUMYAJOUR PHILIPPE 11960 41980061992092090215981.1813MSANS -1786TREVARESSE FRANCIS 11960 21981091994011471512025.5013MSANS -7909CHARITE CATHERINE 21961 11985041984041527112373.8513CESP -7849BUCHES COLETTE 21961121985051984051527112373.8513MSANS -7624JOUVENES CATHERINE 21961 1199504199404 8359 7953.5113MANGL -2428DUCOS FRANCE 21961 1199309199209 8656 8146.1613.ALLEM -4640FINLAY JEAN PAUL 11961 319830419841011131 9658.3413MSANS -0498MONET ANDREE 21961111983081982081608112917.0013MSANS -3902ISTANBUL DENIS 11962 519840619830611131 9657.5313MINFOR -8720LOU ALBERT 119621119880819870810407 9271.3413MALLEM -9086CARNOT HENRI 11962101990111989111450311830.9813MSANS -4105CHAMINY YVES 11962 21982051987041608112917.1013MVENTE -7566SAINS CHRISTIAN 11962 31983091993051527112372.8113MSANS -2552FOCH FRANCK 11962121986061990111288210745.8113MSANS -5248VERONESE PATRICE 11962 219890119880210407 9271.9913MSANS -0127GRENETA BEATRICE GENEVIEVE 21962101984071983071288210743.8613MANGL -6150MAUREL DOMINIQUE 21962 11984071983111608112915.0813MVENTE -7881CHAILLEY ISABELLE 21963101985091984091288210744.4413CSANS -3227POINT COLETTE 21963 31989031988031249910471.5813CANGL -1094FERRAT ANNE LORRAINE 21963 91983061982061326611017.8313MSANS -0209MONTALEAU PASCAL JEAN 11963101983061986111326611017.3413MTECHN -6991COLOMBIER MARCEL 119631119870519880210791 9502.8913MSANS -8764PALMAS MARTINE 21963 81994051993051267210590.2913MTECHN -2275FANGADE ELISABETH 21963 51984021983021288210744.8513MTECHN -0866SECRET MIREILLE 21963 71991111990111249910472.0313MSANS -0133TORREPORTO CHRISTIANE THERESE 21963 6199302199202 7803 7680.4513.SANS -1651VALERE VINCENT 11963101987081991071288210745.9413MANGL -0332FRER CATHERINE 21964 7199407199307 7803 7681.2913MINFOR -1313ARPHY FREDERIC PASCAL 119641019870319860310791 9502.9813MSANS -7694BANNIERE GERARD 11964101987041992111288210745.9913MSANS -2808BOULIE ISABELLE 21964 41985051984051450311832.6913MSANS -9520ERMONT VERONIQUE 21964101993111992011202810241.1313MSANS -7726BUTIN JEAN YVES 11964 6198810198707 8656 8145.0313.COMPT -9487MARECHAUX ERIC JACQUES 11964 21988051987051450311830.9813CSANS -7195ARENE CHRISTINE 21964 71994101993101249910471.7613MINFOR -3536HAIE NATHALIE LUCE 21965 71985121984121249910472.4713MSANS -0845CHARLEMENTINE DOMINIQUE 21965 519940419920111389 9852.7413CTECHN -8486CANADEL SUZANNE 21965 41985121984121288210744.4113MALLEM -5385ROZOY TRISTAN 11965 31987071992031450311830.8313MANGL -7086BEAUME ALAIN 119651019860619850610791 9502.5313MSANS -2621LOTISSEMENT STANISLAW 11965 51986051990111616712995.9313MSANS -9449POSTE MARIE CLAUDE 21965111989031988031202810241.5713MSANS -1109PERRAULT CHRISTIAN 11966 81986041994041450311831.3713MSANS -4280BEGUDE MARTINE 21966 91986041985041288210744.1913MSANS -1973ESPRAT JEAN BAPTISTE 11966 919900119900510024 8997.9113MTECHN -6164UNIVERSITE VERONIQUE 21966 41985121984121288210744.1313MSANS -9407THIERRY GUENAELL 21966 91990091989091638413150.7913CALLEM -6809PERCEY PHILIPPE 11967 519930819920811389 9850.5313MTECHN -9633GILANDIERE ANDRE 11968 61993081994082256617146.7213CSANS -7128PERSPECTIVE PHILIPPE 11968101991101990101467711987.3613MSANS -0709AMYOT ISABELLE 2196810199603199503 7803 7680.2113MSANS -9931CIVADE PIERRE 11969 51991111990111467711986.6213MSANS -1496FERME STEPHANE 11969 519890919880910407 9271.7913CTECHN -4802JAURES MARIE CLAUDE 21969 21994011992011202810240.8213MALLEM -5721VIEUX ERIC 11969 41989061991021249910473.5413MSANS -4763PINTA ALAIN GEORGES 11969 919921019930210407 9270.6513MSANS -9618PASTOUR CHRISTINE 21969 11994081993081206910240.4613CSANS -3207PAQUERETTES MARIE CHRISTINE 21969 619940619930410668 9426.0813CSANS -0667FOURCHES SYLVIE 21969 719920719930411389 9850.6213MSANS -8437ORANGERI DANIEL 11969 31989041992121249910473.1513CSANS -4233LEBLANC CHRISTIAN 11970 419910119900110024 8999.3113MANGL -2043RAVEL FRANCOISE 2197010199301199201 9597 8728.8913MSANS -4748REDONDO CHRISTINE 21970111994081993081206910241.3013CINFOR -6379ROUGE CATHERINE 21970 11994011992011202810241.7213MALLEM -4507ALBAN CATHERINE 21970 91993011991011202810240.9813MSANS -8424FRANCE JEAN PIERRE 11970111992081991081202810240.9913CANGL -3409FLEURUS BRIGITTE 21970 9199009198909 8656 8146.6813.ALLEM -8040ROY PATRICK 11970 41991111990111839014313.7013MSANS -4985CUTTE MICHELE 21970 419940519920111389 9852.6013CANGL -0589MARTIN FABRICE 11971 11990091992021202810241.9013CANGL -2531ROI MICHEL 11971 41994011992011202810240.4413LSANS -0686RENAUDIN JEAN FRANCOIS 11971 51990091993121202810241.1213CSANS -1223ROUDIL CECILE MARIE 219711019921019911011389 9852.5913MVENTE -0603THORETON GUY 11971 7199605199505 7803 7681.0813MSANS -4480WAGNER YVES 11972 31991091994011249910473.6313CSANS -7873VALERY NORBERT 11972 319921019911011389 9852.0613MSANS -0068LAC CATHERINE 21972 419940519920111389 9852.2713MSANS -6496BEL CATHERINE EMILIENNE 219721119920219910211389 9851.3413MESP -4096XAVIER THIERRY 11973 31995121995101288210745.8513CSANS -0302FRANCH WILLIAM 11973 8199502199402 9894 8922.8613CSANS -1195GUILBERT ELISABETH 21973 819930319920311389 9851.4113CSANS -8888LEGER BERNADETTE 21973 7199409199309 9126 8455.9813CSANS -9415FONTANEY MARIE PAULE 21973 4199404199304 9894 8922.4113MSANS -8921ROSA SUZANNE 219741019940819930810668 9426.3413CVENTE -1867BASSE JOCELYNE 21974 6199404199304 9894 8923.1713MSANS -1798RUSSE THIERRY 11974 4199401199301 9894 8923.3113CANGL -8684CHEM BERTRAND 11975 6199407199307 7803 7680.3913CSANS -3841UTRILLO JACQUES 1197611199506199406 7803 7681.1613CSANS -6399ABEILLES RENE 11934 7199207199107 9511 8687.5114MSANS -1983PETUNIAS MICHELLE 21935 1199208199501 7803 7680.2614.SANS -0006DOMONT YVES 1193511198810198509 8656 8145.3914.ALLEM -6326JATELIER CHRISTIAN 1193511199107198509 8656 8146.0914.ANGL -5224MAGNOLIAS MICHELE 21936 31962111991072273717260.2614MSANS -1839ANSELME REMY 11937 21963121994011557012567.7714MSANS -6250ASPREMONT JEAN LUC 11937 91968081990071433211715.6514MALLEM -2328AGE MARIE HELENE 21937 81966071995102017815518.0914MSANS -1178NAPOLEON HELENE 21938 61967071990071578112723.2714CANGL -9417SOUTRANO MICHELE 21938 11963021963051288210744.3714MVENTE -9022GATINES CHRISTIAN 11938 11973071992011403411520.0814MINFOR -6359LANCHY SOPHIE 21938 8198811198511 8656 8146.3414.ALLEM -4141JASMINS PIERRE 11938 81976071992041403411521.0714MANGL -7981NOUVELLES PHILIPPE 11939111968011993011557012566.8214MTECHN -1626VEUR LOIC 11939 11982011993011215710279.2314MANGL -4677ORMEAUX CHRISTIAN 11939 91963121994011557012567.6614MSANS -0263ASPHODELE STEPHANIE 2194010198807198707 8656 8146.5514.ANGL -8254CONNETABLE JOELLE 21940 8199509199409 8656 8147.1714MINFOR -9870RESISTANCE PHILIPPE 11940 61967071993061834514274.5714MSANS -4388ORBAY PATRICK 11941 41965051994011557012568.1314MINFOR -0023ROUVIGNARGUES CATHERINE 21941101963011994042666519900.9114MMARKT -9628BROOKE ROGER 11942 11962021991072273717261.4714MMARKT -4240NUMANCE ANNIE 21942 71963031992012273717261.0014MANGL -3342ROMPU FRANCIS 11942 61962031994113200223583.9014MSANS -4773HA DIDIER 11942101961091994033200223583.1214MANGL -2795ECHO BRIGITTE 21944 419941019930411389 9852.4114MSANS -4188VISONNIERE MARIE CHANTAL 21945121972101971101249910473.7414MINFOR -0739VALLES JEAN FRANCOIS 11945 71966081995042666519900.3614MSANS -4899COURBANIERE DIDIER PIERRE 11945 31972061991011663613343.1614MESP -7972FORET MARC 11947 41971071991011433211714.9114MESP -1272CIGALES JEAN DOMINIQUE 11947101976101991011369311286.2114MTECHN -6191HUGO MARLENE 21948 91973101991071578112722.6114MSANS -1802CAVALIER PHILIPPE 11949111972021992092256617145.2914MALLEM -3695JEANNE CHRISTOPHE 11949121977081992101471512024.1514MESP -9900ANTOUNE FRANCE DOMINIQUE 21949 31972121992012017815516.8314MSANS -0012MAUREILLAS RAPHAELE 21951 51971071988052334017609.1514DSANS -9378VERDIERS CLAUDE 11951 41980031992061369311287.0114MSANS -8265POUSSIEU DOMINIQUE 21951 81980061988052090215979.7614CSANS -3423MORIGNY LUC 11952111979061992011608112916.7214MSANS -7925FOURNIER JEAN PIERRE 11952 21976021995061608112916.2814MSANS -2966ANTIBES JOEL 11952 41975101994041894014661.7814MANGL -7905BOISSONADE FRANCOIS 11952 51990031989031288210744.1914MINFOR -2700LERINS MURIEL 21953 91974011973011288210745.5214MTECHN -6213TOISON JACQUELINE 21954 21974081982041527112373.3514MSANS -1204TRIANON ANNICK 21954 3198801198511 8656 8146.6514.SANS -7183CABRIER MARIE FRANCE 21954111974071979112470018541.1114MSANS -0005BOILEAU FRANCOIS 11954 61974051990052175716601.9514MSANS -7845LARGADES NOELLE FRANCOISE 21955101977021992011471512024.8714MSANS -3059BLEUETS MAURICE 11956 81980071995011471512025.7014MSANS -3868IORANA PATRICIA 21957 2199201199101 7803 7680.0314.SANS -4327MARTILLE CATHERINE 21957101984091983091288210744.6414CSANS -3448FAREL MICHELINE 2195712198805198603 8656 8145.9314.SANS -6045AIGUELONGUE MICHEL 11958 71983081992061527112374.8114MANGL -3104GAIRAUT JACQUES 11959121987021989051288210743.9914MSANS -6864SCHMITT DENISE 21959 3199201199101 7803 7680.3414.ALLEM -3805OUEN GERARD 11959 91980061994011471512024.5714MANGL -7188SOL FRANCOIS 11960101981051991011868714507.4514MTECHN -7952CABRO MARIE CLAUDE 21960 4199504199304 9126 8456.3314MTECHN -3834JEANPIERRE FRANCK 11960 21981091987011684813421.4614MSANS -2909BLERE PHILIPPE 11960 31983041993121326611017.6114MSANS -8259VALOIS NATHALIE THERESE 21961 2198810198603 8656 8147.0114.SANS -9506FORESTIERE ANTOINE REMI 11961 719821119811111131 9658.0714MSANS -5269BIZET JEROME 11961111985041993021433211714.1514MESP -5031CORBIERES PASCAL 11961 21982121993041326611016.6214MSANS -0735MONTAIGUET ANNE MARIE 21962 819960619940111389 9850.5614MANGL -0633BULLY LOUISE 21962 91991121994061202810241.5214MANGL -7250SERMET XAVIER 11962 41985061986011527112373.0414MANGL -9656SARRAMEA ANDRE 11962101983081994091868714507.1614MALLEM -8263MAISONNEUVE MURIEL SOPHIE 2196212199404199301 9597 8727.8714MSANS -8851BERGES MARTINE 21964 2199406199306 8359 7952.5514MSANS -7351NUNGESSER PHILIPPE 11964 71988111987112188616680.9314MSANS -3681LOOZE BRITTA 21964 21993121992011202810240.9114MESP -1581VALLAGON MURIEL 21964 31986041987091527112374.1214MANGL -0821BRANLY YVES MARIE 11965 51986011993041288210743.8714CVENTE -3591MANNA CATHERINE MARGUERITE21965 7199407199307 8359 7952.4314MSANS -7792INSTIT PHILIPPE 11965 619870719870410407 9271.4114MSANS -5791RADEGONDE MARIE LOUISE 21966101986041985041168610048.4714MSANS -0301ESTERELLA ANTOINE PAUL 11967121989021988021450311832.0014CSANS -1872TOUL FRANCIS 11967 919900419900910407 9271.3814MTECHN -5651MURIERS CHRISTOPHE 11967 31989101995071249910472.7414CANGL -0527REMPART DENIS 11967111992071991071330611016.9614MALLEM -8590TOURNEFORT CHRISTIAN 11968 6199410199508 9126 8456.6614MANGL -5968PRESBYTERE DOMINIQUE 21968 21992011991011202810241.8414MSANS -8374AUMALE JACQUES 11968 819890419880410407 9270.6614MSANS -7416BREGUET DANIEL 11968 21987061993051381911365.2614MSANS -0198MARINES MARTINE 219691119920419910411389 9852.0214MANGL -8772GORGE MARC VITTORIO 11969121989091994011249910472.7814MSANS -9157LEON JEAN CLAUDE 11969 81989061995101249910472.6114MSANS -3588LUCIEN DANIEL 1196912199403199303 9597 8727.9914MSANS -5266COUTANT DOMINIQUE 21969 2199502199402 7803 7680.0914MINFOR -6967CONTI GILLES 11969 9199612199512 7803 7680.6614CSANS -4277COLLONGES MARTINE 21969 2199112199012 8656 8146.3814.ALLEM -6780ERIK SABINE 21970 819910619910411389 9850.6214MSANS -9400LONGCHAMPS MARIE CLAUDE 21970 71990041989041202810241.6714MSANS -0861ROUMEGONS GERARD 11973 81996101995101288210744.8514CANGL -1149MOULIN MYRIAM ELISABETH 21974 9199501199401 7803 7681.2514CINFOR -8134AJOUPA PHILIPPE 11974 3199508199408 7803 7680.5314CANGL -5009LEVIS FRANCOISE 21974 6199506199406 7803 7679.6914CCOMPT -5993FROBERT ARN 11975 7199503199403 8359 7951.9414CANGL -7536ORNE BEATRICE 21976 3199602199511 7803 7680.3214CSANS -0584LISON PATRICK 1197611199610199510 7803 7679.2814CSANS -9645TESTE ALAIN YVES 11935 31964091994011557012567.6215MANGL -4415CROIX GUY 11936 61966081981072022115555.5015MANGL -2212BAC JEAN PHILIPPE ANDRE 11937 41972051992011433211715.3215MSANS -9432ULYSSE JEAN MARC 11938 91960121988062947921840.2015MINFOR -8124CHAMIGNY STEPHANE 11938 2199001198604 8656 8145.1215.SANS -7324MOLITOR ROMAIN 11938 41962111992032572519240.6415MTECHN -8862CONDAMINES NICOLE 21938 41960111976012470018540.4715MSANS -2089ALLEN DIDIER 11939 81972041990011403411520.5715MSANS -3194COUTURIER DENIS 11939 11963101994011557012568.2615MVENTE -0835VALMANTE DENIS 11939 21959051991113327724475.7015MINFOR -8646MESNAY ANNE GENEVIEVE 21939 51967011994091834514275.5215MANGL -3426GAMBETTA ISABELLE CECILE 21940 7198912198603 8656 8146.0515.COMPT -0422VAUGAILLERES CHRISTIAN 11940101963111988011663613343.0315MSANS -0838ORVANNE PATRICK 11940 31962061993082922321683.8515MSANS -4067OUTREMONT PATRICK 11940 31962031987012022115555.6215MSANS -0744GRANAGHIU DIDIER 11940 81972021995041834514276.1015MVENTE -9034TREILLE MARIE JOSE 21940 11962051984062470018540.8215CSANS -5214BART MICHEL 11940 21964071991072273717261.7615MALLEM -3460SERENA MARTINE 2194011198810198604 8656 8146.0515.ANGL -3601MONTJEAN DOMINIQUE 21941 6198805198610 8656 8146.2015.SANS -9277ELNE LAURENCE COLETTE 21941 31968071990011621213033.3215MSANS -0325PLATANES CHRISTINE 21942121966081995091834514275.8315DSANS -9878GAUTIER MARYVONNE 21942121972101989011621213033.2915VCOMPT -9699GERVAIS JACQUES 11942 11966101992011663613343.4715CSANS -6148GATINAIS FRANCIS 11943101969101992082470018541.2815MSANS -4347MONTFRAY CLAUDE 21943 71962121991072273717260.0115MANGL -4710VIRY GUY 11943 51970051991011433211714.3715MALLEM -0354BENIGUET MARIE PASCALE 21944 41965021993111471512024.3315MINFOR -6561LEBAS HELENE 21944 21964071994011932314934.2715SSANS -1882BARBES JEAN MARC 11945 9199309199209 8656 8145.8915.SANS -0226FERRIE CLAIRE 21945 4199207199107 8656 8146.7315.SANS -6166BARGUE FRANCOIS 11946 61972071991101433211715.4515MESP -9007CLAYE PHILIPPE GERARD 11946 21970041991011433211715.0915MALLEM -9314GRILLONS MARTINE MONIQUE 21947121969031981122470018542.1015MSANS -2474RODIN ERIC JACQUES 11947121972121991071621213034.1315MSANS -0379ARGENSON BERNARD 11947 61971121991082470018541.2915MSANS -1358SEILLE JEAN PAUL 11947 31971021993061834514274.8915MTECHN -0628GOURGAUD PHILIPPE 11948 11969051993082666519901.0015MTECHN -1939DISQUE ERIC 11948 41977031991011578112723.4215CTECHN -1605FRESNES ALAIN 11948 51975061991011684813422.8115MSANS -9214CHAMPS BRUNO 11948111973081991013417325098.6515MSANS -5666NOVEMBRE JEAN PHILIPPE 11949 41971101994013417325097.9315MSANS -0720MOINES GUY 11950121978011994031471512025.3415MSANS -8674IMPERIAL JEAN CHRISTIAS 11950 21970041989111932314935.4315MINFOR -8739HUGO MICHEL 11950 21974041992011578112721.8015MSANS -9090CYR CATHERINE 21950 7198908198808 8656 8145.3915.SANS -8528EMERAUDES BERTRAND 11951 61979061992011249910472.0615MSANS -0912ALBERES MARTHE 21951 41974051991072137316331.3315MTECHN -1664BENASY DOMINIQUE 2195210197206197106 7252 7486.2815MSANS -5853ROI CHANTAL 2195210199112199012 8656 8147.0615.SANS -6634DUMAS BRIGITTE 2195210199509199409 7590 7562.6315MESP -9376LOUVRE SABINE MARIE 21952 51975051995021433211713.5315MSANS -8735BYRON MARTINE 21952 51973071991071578112722.0715MALLEM -1663PLANESTEL CATHERINE 21953 11974101993042017815517.2015CANGL -5646ALEXANDRE MARIE CLAUDE 21953 11975071991091578112723.4215VSANS -6614GLYCINES PIERRE 11953 71978101994031471512025.7215MSANS -8773CLEMENCEAU ROLAND 11953 81974031991012334017609.3715CTECHN -2191HEBERT PIERRE 11953 21972081992072043315669.2915MSANS -7378THOMAS PATRICK 11954111982051994011433211715.6315MSANS -6161HASTIGNAN ANNICK 21954 31980071994041471512025.0115VVENTE -6895VALETTES ANORE 11955 31979061993121369311288.2415MALLEM -8499ATHIS JEAN PAUL 11955 11977081976081834514274.8015MSANS -8271SPORTS PAQUITA 2195612199112199012 8656 8147.0115.ANGL -3980RAPHAEL MARLENE 21957 61980041979041684813421.6715MINFOR -9964MUGEL PATRICK 119571119821219820311131 9658.4715MSANS -0593GRACE JEAN MARC 11957 41977121992021471512024.5615CSANS -2905EXEMPT PATRICIA 21957 3199201199101 7803 7680.5915.ANGL -5492PERRIERE PASCAL LUC 11957 11983121994041894014662.7215MSANS -7685SURMELIN JACQUES 11957 5198109198812 4864 2.1915MSANS -3608ROOSEVELT FLORENCE 21957121980111994071471512024.5315MTECHN -5451TULEU JEAN LOUIS 11957111977121994011621213033.1015CSANS -4681VERIGNON JACQUES 11957 51984051995071433211714.1615CSANS -1478RESIDENCE CLAUDE GUSTAVE 11958101982091995011433211715.7415MSANS -0355ROSAIS MICHELINE 21958 81978061992051471512024.1515MANGL -4981CHRISTOL BRUNO 11958 11978061995041249910473.5415MSANS -6921MATRA FERNAND 11958 11978051993011471512024.4215MESP -2956LAPEYRERE PHILIPPE 11958 11977071985102397418037.4715MANGL -8126CYPRES JACQUES 11958 41983081982081608112917.1515CALLEM -5587BERENGUIER JEAN PASCAL ROGER 11959 81981061993031894014662.0615MSANS -2962CAYES CAROLINE 21959 61981051995041433211713.9215MESP -5994GRASSE PHILIPPE 11959 819820419811211389 9851.6915MALLEM -0767SOUCHET MARTINE 21959 91983011982011249910471.9215MTECHN -1353AGEN JEAN MARC 11960 319810319800311131 9657.6515MANGL -9232GROULLES ANTOINE JEAN 11961 31993101992011249910472.5715MALLEM -3855BAUMES JEAN LUC 11961 41982111994031527112373.1015MANGL -9369HELBRONNER VERONIQUE 21961111994031993031202810241.5715MINFOR -4341OLIVIER CHANTAL 21961 31981101980101684813422.3515MSANS -5305DAME ANNIE 21961 51981071995071433211715.5915MSANS -6569GAULLE JEAN CLAUDE 11962 91989041992121249910472.3015MSANS -6715SEINE KARL 11962 719840219830211131 9657.1215MSANS -3136GOBELINS JEAN PIERRE 11962 21993091992011249910472.3015MSANS -5291LAMBERTIANAS MARIE CLAUDE 21962 7199506199406 9126 8457.5615DSANS -6342MISSECLE DIDIER 11963 41989111988111539912453.6015MSANS -3447VIAL GEORGES 11963 51985041984111527112374.3415MALLEM -5045GRAZAILLES LAURE 21963 8199108199008 8656 8146.9715.INFOR -7974CHAUSSEE PAUL 11963 61985071991121288210743.9215MSANS -2189PEYBERT DIDIER 11963 81983081988112090215980.4615MSANS -7262JOZE PATRICK JEAN 11963 91983111982111326611017.4115MSANS -8222ETANG LIONEL 11963 71985011993031693613497.9015MSANS -6881OUEST OLIVIER 119631219840419840210791 9502.0815MSANS -8121MADELEINE JEAN 11964101984071983121288210745.1815CESP -6828CONCY JEAN MICHEL 11964 91988041994091693613499.2215MALLEM -3939CHURCHILL BRIGITTE 21964101992021991021330611016.6015MSANS -5116PEREIRE DIDIER PAUL 11964 21986071992121288210745.9915MSANS -2174TEISSEIRE ELFRIEDE 21964 4199212199112 8656 8145.5615.ANGL -0585CRETS LAURENCE 21965 3199306199209 9597 8728.8415MSANS -7988DOMAINE PASCAL 11965 61984051993071527112372.8715MSANS -1646PERDRIX MARCELINE 21965 51985101984101288210745.7015MSANS -7090KERAVEL GILBERT 11965 11988041994091693613498.2215MSANS -3100BARILLERIE BRUNO 11965121988111987112188616679.7215MALLEM -8075ESCALE YOKO 21965 61991061990061381911365.3215MSANS -1009CHARRIERE SYLVAIN 11965101993021993121249910473.1115MSANS -8542MOLIERE PIERRE 11965 51987111995021450311830.6215MSANS -8729ROSTAND PIERRE 119661219860419850410791 9503.7015MANGL -8802DOUMER JEAN LOUIS 11966 619860319930110791 9502.8415MINFOR -8596ABEBERRY PATRICK 11966 619891119910910407 9270.2415MALLEM -6485CHALEUTRE GILBERT 119661219870719860710407 9271.9715MTECHN -9054FAURE FRANCIS 11966 519860719890710791 9503.7915MALLEM -6168CHENEAUX COLETTE 21966 61994021992011202810240.1915MSANS -9809PESSOT JEAN JACQUES 11966 11992011991011202810241.3015CALLEM -8041BIGUE THIERRY ALAIN 11966 619860419850410791 9503.8515CCOMPT -7730CALIANES STEPHANE JEAN 11967 3199404199304 9894 8921.6315CSANS -2161TOUCH MICHELE 21967 11989111988111949415052.4015MSANS -1999LISLE GILLES 11967111990021989021539912451.6115MMICRO -2038GRANDES ROGER 11968 2199312199212 9597 8728.0115CSANS -4888BELMONTET ANN 21968 619960419950410668 9426.5315MSANS -5809ROUSSIER DENIS 11968111990011989011467711987.1615CSANS -0146ROSESCERNY MIREILLE 21968 5199602199502 8656 8145.5715MANGL -3432GARCIA PHILIPPE 11968 51990121992041249910471.8915CSANS -3058SANGRIA CAROLINE 219691119910519900510024 8998.6815MANGL -7679BLEU CHRISTIANE 2196911199207199107 8656 8146.3815.SANS -0602VAUGINES GILBERT CHRISTIAN 11969 91991061994011249910471.7615CCOMPT -5226BOULEE PHILIPPE 11969 819900419890410407 9271.7215CSANS -5904ORANGERIE MARIE CHRISTINE 21969 1199001198712 8656 8146.0115.ALLEM -8131NICE CHANTAL 21969 41989031990011450311831.6615CTECHN -8570SOULAGE MICHEL 11969 41989091994031330611016.4415MVENTE -5857ALLEE JACQUES 11969 7199304199206 9597 8728.9515MANGL -6920LOTI YVES 11969 919911219901210024 8999.3115CVENTE -3599PLANA JEAN PIERRE 11970 61991051990051467711987.6115MALLEM -7579BERGUEROLLES MARIE CLAIRE 219701219910919900911389 9852.4115MSANS -0494DESBORDES BERNARD 1197012199101199001 8656 8145.1215.SANS -9496MONTBAURON ERIC 11970 61991051990051467711986.2215MSANS -8603DESCENTE FRANCOISE 21971 5199607199507 7803 7680.9915MSANS -2449TAHITIAA MIE 21971 619940919930810668 9425.5515MSANS -7786LOUP ISABELLE 21971 61991121993041202810240.8915MANGL -6100MARNE JOEL 119711219940719940111389 9851.4615MSANS -8569ASPIRAN ANDRE 11971 61991121994011249910472.8415MSANS -0626ODET PAULE 21971 2199611199511 7803 7681.0415MSANS -7006ARGENCE PHILIPPE 1197212199308199208 9597 8728.2215CANGL -2516MAILHEAUX LAURENT 11972 41991121991061202810241.5215CSANS -4928COLLEDEBOEUF ANNE MARIE THERESE 21973 51994071993071206910240.6415MANGL -1718HACHETTE ERIC 11974 7199606199506 7803 7679.4615CALLEM -5240MUSES JEAN BERNARD 11974 9199507199407 9894 8922.4415CANGL -3654MAIRIE MARIE 2197412199507199407 7803 7680.6315CSANS -3017BAUCHAT MICHELE 21975 8199505199405 8359 7952.4615MSANS -1395BROSSOLETTE MARIANNE 21975 4199609199509 7803 7679.7615CESP -9154REYNARDE FREDERIC JEAN 11975 8199406199306 7803 7680.3415CANGL -3041BOYER ERIC 11975 3199406199306 7803 7679.3315CSANS -8817FILOURIE FRANCOISE RENEE 21976 8199506199406 7803 7679.3615CANGL -3408BRIE BRUNO 1197611199508199408 7803 7679.4515CSANS -6446WYLLIE PATRICK 11976 1199507199407 7803 7679.4915CSANS -7476SOMME BEATRICE 21976 4199606199506 7803 7680.8615CSANS -8951BARNIER MARTINE 2197612199506199406 7803 7679.4915CTECHN -5707FOCH DENIS 11977 7199607199507 7803 7679.3615CCOMPT -9331PEYPIN MICHEL 11977 3199506199406 7803 7681.2015CALLEM -2044RENAN BERNARD 11977 7199607199507 7803 7679.9915CSANS -0991GUTENBERG BERNADETTE MARCELLE 21930 6199207199107 9894 8922.1616MANGL -4650NORD PASCALE 21930 6199001199506 8827 8262.8016.SANS -7670BOURG ERIC 11935 11967071994011433211713.8816MCOMPT -1067ITALIE SVETLANA 11935 81973071991011433211713.6116MSANS -7446BELMONT MARIE JEANNE 21936 4199010198910 8656 8145.0316.ANGL -4567VICTORET DOMINIQUE 11936 2198812198511 8656 8146.6116.ALLEM -1382ARIES DOMINIQUE 11936 11970081991041433211713.8816MANGL -7727TERRASSES BERNARD JACQUES 11936 91957051994123417325096.9816MALLEM -2304MERCUES JACQUES ANDRE 11936101955061992113327724476.7316MSANS -1717FEUILLETS EDITH 21936 51971091992021932314935.3116MSANS -5274VALLEES PASCALE 21937 8198901198511 8656 8145.6216.INFOR -1751BESSE WILLIAM 11937101959021994065760041273.7516MSANS -7544TRAIL PATRICK 11938 41971081991101433211714.7916MINFOR -0247VIARD CHRISTIAN 11938 11962121984073200223583.9016MTECHN -9383CHALONNIERE MARIA 21938 4199009198909 8656 8147.1916.SANS -1762EMERAUDE BRIGITTE 21938 11975051995011369311288.0616VESP -8379MAGNIOUX NADINE CHRISTINE 21938 81966071990071578112723.4716CTECHN -4635CYTHERE CORINNE CHARLINE 21939 4199201199101 9085 8418.3916MANGL -2414PILATTE MARIE JEANNE 21939 11962051983032470018540.4716CSANS -9003MOULIN DIDIER PAUL 11939 51980021995121471512025.3716MINFOR -6102MARINVILLE ERIC ANDRE 11939 21971031991101433211714.6416VANGL -9945ELANCOURT AGNES 219401119841019810111131 9658.0916CVENTE -5615THORELLE FRANCOIS BERNARD 11940 219840119840311131 9658.6416MALLEM -9231HERBILLON MADELEINE 21941 11968071990071578112722.1216MSANS -9547REMY CATHERINE 21941 31965121990012273717261.0916MTECHN -8538DAMPMART THIERRY 11941 41964071994013200223582.7616MSANS -4432ECOLE CLAUDE 11941121966071995041557012566.5416MALLEM -7122SORRIERES JACKY 11941111975031992011403411520.6216MSANS -5855CESARI PHILIPPE 11941 41972081992011433211715.6916MSANS -4569BELTCAGUY JEAN PIERRE 11941 31974041991011369311288.0016MSANS -0119BAUMETTES VONICK 21942 7199309199209 8656 8146.7316.SANS -5799ICARD JACQUELINE 21942 31968071994031834514275.4316VTECHN -3230NIBELLE PHILIPPE 11942101963011990042273717261.8816MTECHN -1160PLAY JEAN DANIEL 11942 81975091993041369311287.9716MSANS -8701ORRIANES DIDIER 11942 81964101989122470018540.0616MTECHN -9211ANJOU JEAN CLAUDE 11943 81969101991011433211715.4716MSANS -2069CHURCHILL ANDREA 11943 61970061995042201216756.8916MINFOR -4457ARBAUD JEAN CLAUDE 11944 61971011992102137316332.3116MSANS -9480SABLONNIERES CAROLINE 21944 11962121991072273717261.7616MALLEM -1573HOCHET HELENE 2194410199208199108 8656 8145.3416.ESP -8504ANDRE FRANCOISE 2194510199301199201 8656 8145.4216.SANS -2608THIRD ALFRED 11945 91971041990012137316331.6616CSANS -0698CEDRES BRUNEL 11945 91968061990071433211714.3916MSANS -8224CLOSERIE MARTINE 21945 61971061991101932314935.2616VTECHN -6798MONTESPAN JEAN NOEL 11946 21983121993011215710278.5716MTECHN -4449TRAW ALAIN 11946 21976091993041369311287.8216MSANS -1458BOIZEAU PHILIPPE 11947 11973071993041518612334.9216MANGL -8853OUF HENRIETTE 21948 91970011994062201216756.8016MALLEM -0743GEORGE BERNARD ALAIN 11948111973021991011433211714.9316DALLEM -2218GEMEAUX GUILLAUME 11949 51970101992072739020404.5916MSANS -3154MONTAGNE SERGE 11949 31973061992011403411522.1316MSANS -2871VILLERMONT EVELYNE 21949111970061993102175716601.0116MINFOR -8174SARDAN PATRICK 11950 61978051990091966515206.0716MANGL -5180LONE ALAIN 11950 31978021994011369311287.4616MANGL -7155COSSON DOMINIQUE 11950 41970101991012990722150.5216MANGL -7616QUAI FRANCOISE 21951 51973101991071578112723.5116MSANS -1943VAUGIRARD DANIELLE 21951 7198810198709 8656 8145.3916.SANS -8270LOUPS CHRISTIAN 11951111979031993011471512024.3816MALLEM -2654PRESSENS ANNE MARIE 21951 31973011976011288210745.5416MINFOR -8175COUDOURON LUC 11952 21978061995011249910472.6616MSANS -9368DOLMENS CLAUDE 11953 81977081991071578112723.3816MSANS -3828ESTIENNE PATRICK XUAN VINH 11953 71984071992041326611016.1116MINFOR -8961APPART JEAN LUC 11953101973021992102017815516.1216MSANS -9113PERIGUEUX JOELLE 21953 21973101991071578112723.0616MINFOR -7735FLEZ PIERRE 11953 11978071994011403411521.0216MINFOR -4018FONTMERLE MICHELINE 21953 8199311199211 8656 8146.9516.SANS -5157GREZ FRANCIS 11953111974051992082350617725.9216MTECHN -5311SUFFREN MARIA 21953 41973021990101578112722.9116MANGL -7764BRON CLAUDE 11953 91979081994011249910472.9216MINFOR -0120POSTAL CHRISTIAN 11954 31976071994011369311288.1516MSANS -5265HUGO JEAN 11954 51975021993092256617146.9116MSANS -5590SOPHIE SUZEL 219541119960119940110668 9425.3116VSANS -5401LARREY MONIQUE 21954 31975041995101881314585.7316MSANS -6562LANTERNE CLAUDE 11955121980061995041471512024.3516MANGL -1519GOURDON SYLVAIN 11955 51980051995011249910472.9716MVENTE -3963RUISSATEL MICHEL 11955 51979051994011249910473.2216MSANS -3870COMMANDERIE BERNARD 119561219850419870910791 9503.3616MANGL -6506SUPERIEUR JEAN CLAUDE 11956 31979011994011249910472.3016MINFOR -0863FIGUIERES JEAN PIERRE 119561219890919881210407 9270.6216MSANS -1566GROS ANDRE 11956 419950119950110363 9232.9816MSANS -2124CHASSEURS AUDE 21957 219920619930110024 8997.9516MINFOR -5594VAAGGASSE CLAUDE 11958 71978051992011471512024.3916MALLEM -7033TITAN ERIC 11958 41978011992021471512025.2516MSANS -5186CEYRESTE JEAN 11958 91980091993041471512024.7116MSANS -7174SEPTEMBRE PIERRE 11958121978081995071369311286.1516MSANS -4207REGARD GINA 21958 1199107199007 8656 8146.5216.SANS -0723GARDONNE SIMONE 21958 21989081991101249910473.2416MALLEM -3190MONTAUROUX FRANCINE 21959 61989011991071249910473.4116MINFOR -7379SUD PHILIPPE 11959 81982051992011527112374.2216MALLEM -0598FERBER GUILLAUME 11959101981051995082256617146.9116MINFOR -6321CEZANNE ALAIN 11960 41984041993041326611016.0616MSANS -6273FONVERT MARC 11961 619901019891010407 9271.5916MSANS -6867GENEVE ANNE MARIE 21961 31983011982011608112916.2516MSANS -7828PUISEAUX BERNARD 11961 5199403199303 9597 8728.1416MSANS -7252CHEM MARC 11962 41986091992041949415052.0616MSANS -0052TEMPLIERS CATHERINE 21962 61982021989041608112916.9716MSANS -4660HAROUSTA PHILIPPE 119621119900119890110024 8998.9516MVENTE -3619MURAT PIERRE 1196212199406199306 9126 8455.9716MINFOR -1366REINE GEORGES 11962 5199606199506 9126 8456.6416LSANS -6020YVART ELISABETH 21962121994051992011202810241.1616MANGL -9740SEJOUR DANIEL 11962 81982121992041326611017.0516MSANS -3790BEAURONNE PAUL 11963 419840619830610791 9502.6816DSANS -0831VICTOR MICHELE 21963 11985121984121288210744.4116MSANS -5171NEIGE DANY 21963 21985051984051527112372.9916CSANS -4834CROIX CLAUDINE 2196310199101198807 8656 8145.0616.SANS -9575HILL DOMINIQUE 21963 319951219941211389 9852.5416MSANS -1494FECAMP DANIEL 11963 31991041990041381911366.6116MSANS -2944MONCET THIERRY 11963 91991081992051249910471.9416MCOMPT -8018DRAGON XAVIER 119631019830519820510791 9503.5216CCOMPT -7258CASTELLAS LAURENT MARC 11964 31984091992121288210745.9316MSANS -3956CORDIERS PHILIP 11964 219861019851010791 9503.0416MSANS -1434TRESPOEY HENRI NICOLA 11964101987041991091450311831.5216MTECHN -7725MASSANE LAURENT ALEXANDRE 11964 819850919840910791 9503.9916MALLEM -5509FLAMANTS OLIVIER 11964 219890519880510407 9271.8216CSANS -9732VENT THIERRY 11964 91987071988121288210744.9116MALLEM -8053CAUSSINIERO ANNY 21965 8199610199510 7803 7680.3216MANGL -8933CHOPIN VERONIQUE 21965101986061994091288210744.0816MANGL -4294GRAVIER PHILIPPE ARTHUR 11965 61994041992011202810240.0416MTECHN -7996LOUPIATS CATHERINE 21965 3199312199212 9597 8728.5816CSANS -5751DIMANCHES JEAN FRANCOIS ROLAND1196511199404199201 9597 8727.9916CSANS -3314COPERNIC NATHALIE 11965 91993111992011202810239.8316MALLEM -8095MALIKA ESMERALDA 21966111994051992011202810241.6116MINFOR -2514CANGINA MARIE CLAUDE 21966 519951219941210668 9426.3416MANGL -8137BARBE SOPHIE 21966 61985061984061202810241.6116MSANS -2086FELIBIEN GILBERT PIERRE 11966 619860919850910407 9270.8916MINFOR -5743FOUESNAN PHILIPPE 11966101987021991071288210745.4316MANGL -7755ALGLAIS BERNARD 11966 81989031988031249910473.3616MVENTE -4183NEUVICQ MARIE CLAUDE 219661119950119930411389 9851.0116MSANS -5854BINEAU BRUNO DANIEL 11967 51991081990082107316097.0316MSANS -1015HUSSON MICHEL 11967 31990041989041467711985.8116MINFOR -8894VEGA YANNICK 11967 1199311199211 9597 8729.4016CSANS -2165POMONE EVELYNE 21967111989031993071381911366.4716CSANS -3736LYS DIDIER 11968 919950119950110363 9232.6616CSANS -9047PUITS VINCENT 11968 21990081989081539912453.7216CSANS -6745COMMANDANT DOMINIQUE 21968 6199403199303 8656 8146.3216MANGL -2664JAMES CHANTAL 21968 719940419920111389 9851.5216CSANS -2387LECLERC BERNARD 11968 819950119950110363 9233.9016MSANS -8096PAROISSE DOMINIQUE 21969 61991091991021330611016.5116MTECHN -8708BOISSY BERNADETTE 21969 7199006198708 8656 8145.2116.SANS -7358CUQUERON MARTINE 21969121994031992011202810240.4616CSANS -5192BESSOU ROSINE 21969101991111990111839014314.0816MSANS -1422LAVAUX DOMINIQUE 21969 11992061991061202810240.9816CSANS -4798IDOLE MARIE CHRISTINE 21969 219930419920411389 9852.1516MSANS -7101NOGENTAIS CHRISTINE 21969 91989111988111202810240.5916MSANS -3573MIRBEL ANTONIO 119691019900519890510024 8999.4916CSANS -8187NORD ROBERT 11969101991101990101467711987.9716MVENTE -2888CASTELS YVONNE 21970 419960619940110668 9426.8916MSANS -5902GARRIGUE MICHELE 21970 21994021992011202810241.7616MSANS -7139BRUANT ISABELLE 21970 919940619920111389 9852.0916MSANS -8561FREGATE DOMINIQUE 11970 81993041995091267210590.1516LSANS -8391ESCOURADIERES CHRISTOPHE 11970111991111990111467711986.0816CSANS -7113FLAVIEN MICHEL 11970 91992121991121467711987.9416MSANS -1139CHAMPIGNY LIONEL 11970 11995031993041202810241.7416MANGL -3774FAHNESTOCK MAX 11970 11992101991101467711987.9016MSANS -3115MAGATIS PIERRE 11971 119960219950211389 9851.0316CSANS -7606ITALIE JACQUES 11971 4199407199307 7803 7679.4516CVENTE -2804JOYEUX FRANCIS 11971 21990061992121202810241.0416CSANS -5659HOULE PATRICK 11971 21993121992121420611637.3316MESP -9687LANCIERS DANIEL PHILIPPE 11971 8199311199211 9597 8727.9016CANGL -5871LACOURTADE PHILIPPE 11972 11991121994011249910472.6116CVENTE -4676LUPINO ATSUKO 21972 6199501199401 8656 8146.1416MTECHN -2981VIREBELLE FRANCOISE 21972 219940819930810668 9426.5716CSANS -1979LOMBARDS JEAN DIDIE 11973 6199309199209 9597 8729.0716CSANS -7372BOIS MONIQUE 21973 1199407199307 7803 7681.1116CSANS -3844PERIGORD NICOLE 21973 319930919920911389 9850.5616CSANS -0819THOBIE DANIELLE 21974 1199409199309 8359 7952.6116CALLEM -8257SEVIN CLAUDINE 21974 4199409199309 8359 7951.8816CSANS -5832DELAGRANGE MICHELE 21974 3199309199209 9597 8728.8216MSANS -6357MORTARIEU MARIE JEANNE 21974 8199607199507 9894 8921.8516CSANS -7800TOURNELLES FLORENCE JACQUELINE 21974 519950119940110668 9426.0016MSANS -1978CENIS ALAIN 11974 71994091994011202810240.8616CSANS -4208BEAU OLIVIER 11975 8199510199502 8359 7951.6616CTECHN -2472TOWERS CORINNE 2197511199410199310 8359 7953.1116CTECHN -8054QUINTA PASCAL 11975 4199606199506 7803 7680.5016CSANS -5910JARRY CLAIRE 21976 1199608199508 7803 7680.6616CVENTE -9513GENISSIEUX HERVE 1197612199607199507 7803 7680.0016CSANS -6334MUSSET MARIE PIERRE 21977 3199607199507 7803 7681.4716CSANS -3177VILLEFRANCHE NICOLE 21977 7199607199507 7803 7680.4416CESP -3707PREVOST CLAUDIA 11934 81963071994011663613343.7817MANGL -7266OUCHE JEAN LOUIS 119351019930919910110407 9272.2217CSANS -5677VIRGINIE JEAN PHILIPPE 11938 51963111989071663613342.9817MESP -0564PEYREBELLE JOELLE 21939 11967011989091932314934.5317MSANS -6752SILLERY PIERRE 11941 41962061985072273717260.5917MSANS -7389BILLOUX NATHALIE 21941 3199012198912 8656 8145.3317.SANS -0440MALASSIS EVELYNE 21942 11993101992011202810240.7217DSANS -6527CURSON JEAN LOUIS 11946 71974121991011369311287.1017MANGL -4166EVIAN FRANCOIS 11946 31969101986012470018540.6117MSANS -6635ROSAY FABRICE EUGENE 11946 71970031989122334017609.4317MANGL -3999MUSARDIERE CLAIRE 21946 81968111983042470018540.9317VALLEM -9845YVETTE MARTINE 21947 71972101990071621213032.1717MANGL -1439FIEF EVELYNE 21947 91974071991071578112723.1817MSANS -2404ROME BRUNO 11947 91988031995011433211715.0917CSANS -8776ROME THIERRY 11948 61974011995031911114779.7717MSANS -5946TERRA MARIE CHRISTINE 21950 91970011991071578112723.6817MSANS -5232DEBUSSY CATHERINE 21951 81973051991021684813421.7217MTECHN -0869CARAMEL ELIANE 2195211199207199107 8656 8146.0917.SANS -1911PLASSAN THIERRY 11954 41980031992031608112916.5917MTECHN -1670LORETOHOHE MARIE EDITH 21954 11974071993101911114780.0617MANGL -9187BINGER DOMINIQUE 21955121986091991041249910471.9217DESP -2614COLLONGUE MARCEL 119561019810319820611389 9852.2917MANGL -9658BEAUREPAIRE MICHELE 21957 81977071992011471512025.4717MSANS -1305HOPITAL DOMINIQUE 21957121979071980041684813421.6717CSANS -2762PELUT PIERRE YVES 11958 119881219871210407 9271.4117MALLEM -4217ALEXANDRA JEAN MICHEL 11958 71983031993081326611017.7417CTECHN -8469CRETES PAULETTE 21959 619910719900710024 8999.3117MANGL -1495RIBAUTE PIERRE LAURENT 11959 119801019820611389 9850.8817MINFOR -1650BRIAND SYLVIE 21959 91980041992121608112915.9217MSANS -8360JOUY CLAUDIE MARIE 21959 319940419920111389 9852.7417MSANS -5653ROLL ROBERT 11959111988061991091450311830.5617MINFOR -4042TANE PHILIPPE 119591019870719890410791 9503.7017MANGL -0940YVETTE MICHEL 11959 31978071991032022115555.5017CTECHN -9875DANREMONT THIERRY 11961 41982091995041433211714.5117MTECHN -9667CASITA JEAN LUC 11961 81982081995121638413150.9717MSANS -1371ROME MAURICE 11962 21984051995081710713577.9317MSANS -6755AUBAIS BRIGITTE 21962121983011993051527112374.0017MTECHN -2907BRETEUIL FREDERIC VALERY 11962 41993021993081202810241.7217MSANS -4530MICHAUDES CHRISTINE 21963 11982071981071326611017.7417CSANS -9935TAZARKA BERNARD 11963 91992111991111330611016.2617MSANS -1813PLOUGUIE DANIEL 11964 21985081989051288210745.8117MTECHN -2666DAUX JACQUES ANTOINE 119641219840119830110791 9503.3917CANGL -4498LOUVEAUCOURT MICHEL 11965 81985061988061288210744.9117MSANS -6274BRIE PIERRE 11965 21984071983071288210745.4317MANGL -8475PATHE LOUIS 11966 91987111993091839014314.3417MSANS -2923LACLOTTE NADINE 2196610199501199304 9597 8728.7217CTECHN -5049CROZES CAROLE 21966 71987021992011450311832.6817CMANAG -9666RABINES MICHEL 11966 81986071995121450311832.3617MTECHN -1503LESTRADE GILLES 11967 119870119860110407 9272.1917MINFOR -2577JONCQUIERES MARCUS 11967 61987041990091249910471.6517MANGL -6372VILLARS LYDIE 21967 3199411199311 7803 7680.5917MANGL -8399HAMEAUX BERNARD 11968 61990071991081249910473.2417MSANS -0624BLOY MICHELINE 219681219940619930610668 9427.0217MANGL -0069ARTHUR CLAUDE 11968 71989021993041249910472.5717MTECHN -9429MATIN FRANCOIS 11969 919890419890410407 9271.0217MANGL -6364LEONIE SERGE 11969 919900319890310024 8998.4117MSANS -3990SALANGANE CATHERINE 21970 619950919940110668 9426.0017CALLEM -9447AYGULF CHANTAL 21970 419950219930411389 9851.1617MSANS -5807CIMES ODILE 21970 1199404199304 9126 8457.6317MINFOR -6551FOUCHER CHRISTIAN 11970 81990081989081202810240.2617MSANS -9323SAUVAGERIE MARCEL 11970 7199512199412 9126 8457.5917MSANS -0265PEYRIERE YVES 11970 91990111989111381911366.7217CTECHN -8683BRUSE VERONIQUE MARIE PAUL21971 119960119950111389 9851.9717CCOMPT -4051CHANTILLY PATRICK 11971 8199602199502 7803 7681.2017CINFOR -5145ETHORRI BERNARD 11971 9199309199209 9597 8729.2517MSANS -2756CADDESI THIERRY SERGE 11971 919910719900710024 8998.0117MSANS -5810HAUT CAROLE 2197212199610199510 8656 8146.9517MESP -1266GAUTIER VIRGINIE SOPHIE 21972 1199603199503 9894 8923.0217MSANS -8948CLOUD RICHARD 11972 81991071992041202810239.8317CSANS -4395DELIBES ERIC 11972 619940219930211389 9852.6917MESP -9450DAMMARTIN YVES 11972 6199404199304 9597 8729.4517MSANS -4403MORTIERS BERNARD 11972 219910919900910024 8999.0917MANGL -1227ROSSAT MICHEL RENE 1197212199407199201 9597 8728.3517CINFOR -8746VERGER JACQUES 11972 519940219930211389 9851.0117MCOMPT -9344ECHEZ CLAUDE 11973 9199505199405 9126 8456.2417CSANS -4420CASA ALAIN JEAN CLAUDE 11973 319930719941111389 9851.8417CSANS -2752BEAUTE PATRICK 119731219930419920411389 9851.7417MSANS -0850MULON GERARD 11974 619940919940110668 9425.6717MCOMPT -2641ESCURIAL JEAN FRANCOIS 11974 3199606199506 7803 7679.5117CTECHN -2955MALETACHE GENEVIEVE 21974 9199508199408 7803 7680.9817MSANS -5801COSTES NOEL 11975 8199609199509 9894 8921.3117CSANS -2146DAUMIER IGINIO 11975 4199310199210 8359 7951.7917.ALLEM -3984OR GISELE 21975 9199607199507 7803 7679.6717CANGL -9050GIRAULT LILIANE 21975 5199406199306 8359 7952.9617MSANS -3948SEIN FREDERIC 1197511199410199310 8359 7953.3217CSANS -4265MIGNET BERNARD 11976 5199507199407 7803 7679.7817CANGL -0351RIMBAUD JEAN PAUL 11976 619961219951211389 9852.3617CSANS -1931BERGERAC DIDIER 11933 3198810199501 8656 8146.3218.SANS -9698SCHUMAN DOMINIQUE JEAN 11935 71968101995041557012568.3518MANGL -2020JOLY PIERRE 11935 119870719900710791 9503.6618CSANS -7058BARGE REMI 11935121955021980013327724475.6718MTECHN -3747MARIES RENE 11935 51955021988013844228044.8418MSANS -3141VALLONGUE GUY 11936101976071991011433211715.2418MINFOR -1098CACTU CATHERINE 21936 41962111991072273717261.7218MINFOR -9199PLOUHARNEL BERNADETTE 21936 21967011989102273717261.0418DINFOR -9270ABBE SOPHIE 21937 71968061991041932314934.4118MSANS -2969BEDOYERE GUY 11937 7199001198412 8656 8146.6418.TECHN -1219HOCHE JEAN MAURICE 11938 51969051990011433211714.1218MANGL -1887TOURNON GILLES 11938 51967051990011433211714.1918MANGL -5417AMBREVILLE FRANCE 21938 51973071990071578112721.7618VSANS -1954SOPROCOM PATRICK 11938 71973101992011403411522.1318MSANS -0028ROLE PHILIPPE 11939 81963111994011557012567.1418MSANS -6857KERPADIRAC EMMANUEL CLAUDE 11939 71965051990011433211714.6418MANGL -3697PEYRUIS BRIGITTE 21939 81962061991021834514276.0918MSANS -5636SAVE RENE 11940 21969061991101433211714.1918MSANS -5290VIALE PHILIPPE 11940 11974071991011369311286.8418CINFOR -2591COLLE FLORENCE 21940 3199207199107 8656 8146.5218.SANS -7651GOZLAN XAVIER JEAN 11940 41960031993033200223582.7318MSANS -8388MONTROUGE LOIK 11940121974071992011403411520.2018MTECHN -3384LIVRON FRANCOISE 21940 71964071992072273717261.1818VSANS -7291MARLY MARTINE 2194010199206199106 8656 8145.8318.INFOR -2644EAU FRANCIS 11941 11968121990011433211713.5818MSANS -0515WRIGHT PHILIPPE 11941 21973061992041403411520.2118MSANS -1243SEMAPHORE ANDRE 11941 71969111986072470018540.5618MTECHN -1791PASTEUR BRIGITTE 21941 61974101992011578112722.8818MTECHN -1226SAUD JEAN PIERRE 11941 91973081995011621213034.1018MANGL -3874PASSERINES DOMINIQUE 21941 61966021992042273717260.5318MANGL -5394QUAY YVES 11941 91973041990101684813421.4518MANGL -0308BELLIVIER MICHEL 11941 21963091988043417325098.6318MSANS -8445HEROS SYLVIE 21942121963091991082470018540.5318MSANS -7703CERF NICOLE 21942 51978071992121471512025.6118MSANS -3807REBAIS FRANCOISE MICHELE 21942 31972041989011621213032.7018CSANS -5173TARCO MARC 11943 51973051993011369311286.4718MSANS -3544RESTANQUES SERGE 11943111971121990011433211713.8018MVENTE -7289FRAMBOISIERE DANIELE 21943 51969071991011578112721.6718CALLEM -2761WYLLIE ANNIE 21944 41963121985051932314935.2918MSANS -7593AMPHORE BERNARD 11944 71964101989062922321684.7218MANGL -7373PAMPERIGOUSTE MICHEL 11944 21972101992011403411521.3418MSANS -1159PATIOS ELISABETH 21944 91970101991101932314935.2618MSANS -6999BEL ALAIN 11945121969101990011433211714.7918MSANS -7962VIGIE MICHEL 11945 91971071994122295317300.3718MTECHN -3123GAULLE ERIC NOEL 11945 51973121991082470018540.6918MMARKT -9943DOUMER PATRICK 11945 51968041990071433211715.1118MSANS -3765IMPERATORS GHALIA 21945 61965021993102137316332.1118MSANS -6688COULOUNIEIX HERVE JEAN MARIE 11945 61971031991062273717260.7718MSANS -0965JUDITH BERNARD 11945 51966051987122470018542.2418MINFOR -3763MERMOLLOD DANIEL 11945 21972071992011433211713.5318MSANS -0042POUTGE PHILIPPE 11945 81968081990101433211715.7218MSANS -2250JACQUIN JOEL 11946 41971071991102022115556.3818MSANS -7112REDOURTIERE VERONIQUE 21947 3199303199203 7677 7603.7718.ANGL -5217SARRAZINIERE MICHELE 21947 51968111991102137316330.6718MINFOR -1448MAUPASSANT PHILIPPE 11947111968121988102273717260.8118MSANS -7506CLAP JEAN JACQUES 11947101968061986042470018540.8918MSANS -5237JAS MICHEL 11948 21975101993121369311287.1918MSANS -0341MAKILA NICOLE 21948 2198901198510 8656 8145.1118.ESP -3475REMISE MARIE CLAUDE 21948 41968041989042273717260.3218CSANS -3575DONAT JEAN MARC 11948 51972121991011621213033.6418MINFOR -0433CAROUBIER PHILIPPE GABRIEL 11948 5198801198306 8656 8146.1618.ANGL -9184PINEUILH CATHERINE JEANNE 21948 11968091967091493112142.5618MSANS -1377KERCOLIN ALAIN 11948 91972061992112137316331.4718MSANS -7248MERCIER FRANCOIS 21948 71970071993121834514275.1418MSANS -9014FELOUQUE JEAN LOUP 11948101972121994011621213032.9718MCOMPT -1756FREMICOURT DOMINIQUE 11949 81969121989111932314933.9918MANGL -7383BLAISON FRANCOISE MARIE 21949111970071994031834514275.1618MALLEM -6290TILLEULS BERNARD 11949 61971041990123417325098.1518MINFOR -2226VIVO DOMINIQUE 21949 41971101995041834514275.6118MTECHN -8441SARGIS CLAUDE 21949 11973061993082175716601.4318MINFOR -1520PIC JEAN JACQUES 11949 11975041992041403411521.8618MSANS -5696DRUGEON PATRICE 11949 81980071995041249910473.1818MANGL -1048MORIZET ANNE 21950 11970121994051834514274.8318MSANS -4058FRANCE ALAIN 11950101974091991071578112722.6118MMANAG -0512MARBO JOSIANE 21950 71972011992102017815517.3818MANGL -2797GUY LIONEL GILLES 11951 51976051993071894014662.5918MSANS -9267SAUSSIERE MARC 11951111972041992102017815516.2418MSANS -6865EMMANUELLA ALAIN 11951 51982041993011369311287.7418MSANS -0116GALICIE FRANCOISE GEORGETTE 21951 41971101992011471512024.0618MANGL -6144ROSERAIE DOMINIQUE THIERRY 11951 91972081992112739020404.7018MANGL -9941JULIETTE CHRISTIANE 21952 71976091992011578112721.6518MANGL -1879CLAIRVAUX JEAN SYLVAIN 11952 31976041993011369311287.4318MALLEM -9577PECHEURS DOMINIQUE 11953 31978031995011578112723.3318MSANS -4352BAR REGIS 11953 71979061994011249910473.4518CSANS -2194EVIAN DANIEL 11953 81977061992011608112915.1218MANGL -0566PARADISIER DIDIER 11953 11983111993011215710278.3018MANGL -8627CHARRIERES PHILIPPE 11954 61974111982102470018540.8018MSANS -5729BRECHET PHILIPPE EMMANUEL 11954 41974081991012137316331.2818MINFOR -3643RONSARD PATRICIA 21954121976011982052256617146.4518MSANS -1486AGEN CAROLE 21954 91977071984112256617147.1818MANGL -4779CALIFORNIE PATRICE 11955 31975051991101578112723.3318MSANS -0975BIEVRES ALAIN 11955 61978101993011471512024.4718MSANS -8614DUSENBACH ALAIN 11956 61979031992011471512024.3918MSANS -4428SAUZON ISABELLE 21956111977051992011471512024.2618MSANS -1720EOLE PATRICK 11956 41987111986112090215980.5518MALLEM -8905JANVIER MARLENE 21957 11979071993041471512024.3018MSANS -7774GAL PHILIPPE 11957 81977061982041834514275.7218MESP -3204SAGINAW EDITH 21957 319790719780711302 9774.2018MANGL -5409LEUN CLAUDE 119581019800719821011389 9852.4518MANGL -4971CHANTEGRELET FRANCOIS NICOLAS 11958101978061987112256617146.9518CSANS -5691ALTIPORT ANNE 21958121979101993111471512024.9618DTECHN -1005FLEURS PIERRE 11958 81981041985041684813421.4218MSANS -6295WINTER JACQUES 11959 81982081988052090215980.7318MINFOR -3634CELY JOELLE 21959 31979101995021433211713.6518MSANS -8425SOPITENIA BERNARD 11959 919790619831111389 9851.2118MANGL -2714AGNEAUX VINCENT 11959 21980091979091684813422.7218MSANS -3908SAN CATHERINE 21959111980031989112090215980.7318MSANS -9522ALLERAY EUSEBE 11959 81982041989052090215979.8918MANGL -4818CARNOT GENEVIEVE 21960 61981031995021433211714.8218MSANS -2809VAUCRISES FLORENCE 21960 1199205199105 8656 8146.4618.SANS -6703LAFONT CAROLE 21960 31993081992011249910472.3918MSANS -4781RUSSIE FRANCK 11960 1199006198906 8656 8146.2818.ESP -0025OYANA AYALA 21960 31981011980011202810241.2518MANGL -4606GARNET CHRISTOPHE HUBERT 11960 41983011993041326611017.3218MSANS -3285CASTAGNIERS BRIGITTE 21960 61980061986101684813422.5318SSANS -9855HEBERT GABRIEL 11960 11988091992041249910472.9618MALLEM -7538RUSTICANA JACQUELINE 21960111981011980011326611017.7018MANGL -7245HAVRE ALESSANDRA 11961121985031984031608112917.1018MSANS -2845ROSNE ANNE NOELLE 21961 6199507199407 7803 7681.3818MESP -4993NOIR GUY 11961 81982031995101638413149.8318MINFOR -0352NOTAIRES PHILIPPE SERGE 11961121986111993072397418036.8018MSANS -6114LAMPAUL ROSELYNE 21961 61994021992011202810240.8618CSANS -8947GUE JEAN PIERRE 11961 41981071995071433211713.7018MSANS -6115NICOLAS DOMINIQUE 21961121983011982011608112916.0218MSANS -0276ESQUIERE YVES 11961 81988081992061450311832.1518MSANS -5271BARGEMON SERGE MAURICE 11962 51992111991011249910471.6518MSANS -3485SOURCES MARTINE 21962 1199201199101 7803 7680.9818.SANS -1542BOCAGE MARYVONNE 21962 5199203199103 9597 8728.5818CSANS -8004CARDINAL MARIE JOSEE 21962 21983051982051527112373.2318MSANS -7577VIE KAVERIO 11962121982061987111608112917.1318MSANS -1474RABIAC CLAUDINE 21962 81984061983061249910472.0718MSANS -7742CAZILHAC DOMINIQUE 21962 51983011982011608112915.6518MALLEM -1316BRIAND FRANCOISE 21963 21983041982041608112915.7518MCOMPT -5967MASCREE YVES 11963 91983071988011608112915.3918MSANS -8262PENSEES FRANCOIS 11963 71985081991091288210745.3018CALLEM -9624JOFFRE FRANCOISE 21964 71988041987041202810240.7718DALLEM -1583MONTGOLFIER BERNARD 11964 11984071993041288210745.2718MSANS -8539GILBERTIN MOISE 11964 11985041986081288210745.4318MSANS -9414YVELINES JEAN PIERRE 11964111985071984071288210745.6618CANGL -2500PROVOST DANUTA HALINA 21964 51985051984051381911365.9518MESP -4860AUBEPINES THIERRY 11964 31993081993082401918075.8118MANGL -1591CALADE ALAIN 11964 21984071990091288210745.7518MSANS -8611DUGUESCLIN MARIE NOELLE 219651219880619870610876 9503.9018MANGL -1890DUC PATRICK 11965 21985091989111527112373.2218MANGL -8780ANTANANARIVO JEAN PIERRE 11965 219860619931210791 9502.9918MINFOR -9489CALMETTE JOEL 11965 31991121992122401918075.5718MANGL -0389VICTORET YOLANDE 21965 1198810198707 8656 8146.2818.SANS -8865VERDIE CHRISTINE 21965 51990111989111949415051.6818MSANS -3552LOGEM ISABELLE 21965 3199408199308 8359 7951.8018MSANS -2210MANCHOULAS PHILIPPE 11965 31994021993021420611638.9518MTECHN -6427LAUTIN JEAN DANIEL 11966 719890619880610791 9502.0518MINFOR -9413KERAVILOU HUBERT 11966 51989061993111249910472.6918MANGL -0446CHENEUSE JACQUES 11967 419931119950910363 9232.5318MVENTE -8752ALPILLES PATRICE 11967 6199105199005 8656 8146.2318.ALLEM -8347AICARD BERNARD 11968 219880619880110407 9271.1118MANGL -2090ALICE JEAN MICHEL 11968 61993041992041202810240.9118MSANS -8583EPINETTES DENIS 11968 31988041994101249910472.6618CINFOR -2122SEE PHILIPPE 11968 9199205199105 9597 8728.6418CANGL -2399ROQUEPAVA PAUL 11968 81988071993111249910472.9118MSANS -8130FRATERNITE JEAN FRANCOIS 11969 91992061994011288210745.7218MSANS -7498CARROUGES JEAN MARC 11969 31989041993121249910473.0618MANGL -3505CHEVREUL JEAN JACQUES 11969 61990091989091467711987.2218MSANS -2473MAJOR THIERRY 11969 3199406199306 7677 7604.8418CSANS -7707AYGOSI CORINNE 2197010199502199402 8359 7953.4218MSANS -6442BERGER NATHALIE 21970 5199607199507 7803 7679.4518MANGL -5162CHANDELIERS JOEL 11970 7199501199301 9085 8419.1118CSANS -1417BILLETS WADY 11971 119931019921011389 9851.2118MANGL -1522PARAME COLETTE 21971 3199606199506 8359 7952.5518MSANS -2322BARRE JACQUELINE 21971 91991011990011202810239.7818MANGL -8136TASSIGNY JEAN PAUL 11972 31992061991061249910472.4618MSANS -2240LOUP VERONIQUE 21973 21994031993031267210589.1018MSANS -2489VELLEDER MARC 11974 7199506199406 7803 7679.7818CTECHN -8166GUERRIAS CLAUDE 1197710199610199510 7803 7680.5718CSANS -6073ALLENDE DOMINIQUE 11977 1199606199506 7803 7680.9018CSANS -6606FROIDEVAUX FRANCOIS JEAN 11934111958051993013844228045.6538MESP -5822DITTE NAGUIBA 11937 61966091991072273717260.5038MSANS -1148KERVENNEC JEAN JACQUES 11938 31971051991011663613342.7438MANGL -8491ROCHEBRUN MAURICE 11939 51967011992021932314935.2938MCOMPT -5749GILBERT JACQUES 11939 61968031992102334017610.6938MTECHN -3667PERGOLETTE JACQUES 11939 31963051988011663613344.6938CSANS -6409PLACE JOSYANE 21940 71984011991091288210745.1338MSANS -2498GASNIER CLAUDE 11940 119810719890511131 9657.9738MSANS -2100BRASSIOUX BRUNO 11942 41973061991011621213032.2438MSANS -1118HOUMEAU ANDRE 11943 51962111991072273717260.3538MSANS -4519CAGOU JEAN CLAUDE 11943 41972071991011663613343.2038MSANS -6013REMO JEAN MARC 11943 91966121990011663613343.0138MANGL -8050YAN BERNARD 11944111963121992042273717261.8138MSANS -3614EGUILLON SERGE 11944 31978041992011471512025.5638MSANS -5430CHARPENTIER JEAN PIERRE 11944 91966061994072137316332.5038MSANS -8523PARIS PHILIPPE LOUIS 11945101969071992062334017610.6538MANGL -2111TOUL ROLAND 11947 51972021992012017815518.0638MINFOR -0683GEORGES RICHARD EMILE 11948 91976091994012000715439.1738MANGL -7517GRAND PHILIPPE 11950111971041995072470018540.9738MSANS -4909AIX JACQUES 11950 11970041993121834514276.0138DCOMPT -3400NOUAN PIERRE 11951 41971041992122739020403.8938MSANS -7319BERGERONNERIE MICHEL 11951 21979031993011578112723.3338CSANS -2615PATURES DANIEL 11952 91972081993122547019085.9538MALLEM -1673MIRAMAR PHILIPPE 11952121973071983112470018541.3438MSANS -4747LOLIVE FREDERIC 11953 81978111993011608112915.9738MSANS -9613BORD JEAN MARC 11953 41978051995041249910473.2038MSANS -9161CHANTE PATRICK 1195311199603199505 8656 8147.0938MTECHN -1511COLBERT PIERRE MARIE HENRI 11953121973031993042017815517.9138MSANS -0700BRAGELOGNE ALAIN 11954 91974021989052256617146.1638CSANS -4590BERRY CHRISTINE 21954 5199302199201 9085 8419.4938DMANAG -7017LASPLANES DOMINIQUE 11955 41984061993041326611016.6238MCOMPT -4869ROUMANILLE CLAUDE 1195512199306199206 9126 8457.4938CTECHN -2931PYRAMIDE ANDRE 11956 61979031992011471512026.0638MSANS -0636COTEAUX MICHEL 11956 31976011992011608112915.2138MANGL -9829EUROPE JACK 11957 11980061985011684813422.6838DSANS -7001FORET MARC 11957 41977011994011249910471.5638MTECHN -7136OCEAN HENRI 11957121977061992011471512024.5338CSANS -3955VIGNES PATRICK 11959 51981011993031608112916.1438MANGL -9568ARNOCHE GERARD 11959 71981061993121471512025.8338CTECHN -4979AIMEE PASCAL 11959 519860219880110791 9503.5238MSANS -2891SCHLOSSER BRUNO 11960 51982111995071433211713.6738MSANS -8194CABIRAUX JEAN LUC 11960 219930119910110407 9272.1338SANGL -2865LEIGNE ANNE MARIE 21960 71980091993051527112374.8538MSANS -4343GERMIGNY YVES 11961121983041982041326611017.7438MSANS -2039ROUTE JEAN CHARLES 11961 21982031981031326611017.8838MANGL -8887CUTTE HUBERT 119611019820619810611131 9657.5738CANGL -5692LAC FREDERIC 11961121981051994011433211715.2438MTECHN -9404COMBES HUBERT 11961 9199308199208 9597 8729.7438MCOMPT -7675CHEVRIER JEAN HERVE 11962 41984021991071527112374.2538MINFOR -8147PROMENADE CHRISTIAN 11962 3199405199201 9597 8729.7238MANGL -8550RASCAS JEAN 11963 119850219900610791 9503.9738MSANS -8387JEROME PIERRE 11963111985041992011949415051.6838MALLEM -7757FAVIERE PATRICK ANDRE 11963 51984081991021527112373.3138MSANS -2903GLADIATEURS MICHEL 11963 31984121983121326611016.0338MSANS -5686BEDFORDALE THIERRY 11963 819831219821210791 9502.0438CINFOR -5983TANNERON JEAN FRANCOIS 11964 61987111995042256617147.2238MTECHN -5469CIGALIERE JEAN FRANCOIS LOUIS 11964 31988081988021450311832.6838MSANS -2425BOUVREUILS MICHEL 11964 11988011995121381911366.9938MMANAG -7826EAU ARNAUD 11964 81987021986021249910473.4938LSANS -4783TESSIER MICHEL 11964 61990011991011249910472.1238MALLEM -4053ARPENTS PHILIPPE 11965 219901019891010407 9271.1138CESP -5354COMBELONGE PHILIPPE 11965 41985041984041288210745.9338CESP -0915TUILLIERE JEAN LOUIS 11965 51989031991011249910471.5838MCOMPT -3732MALABRY FREDERIC 11965 219940119910110407 9271.7938CSANS -8032VIRO PASCAL 11966 319921119911110024 8998.3738MSANS -0237TORRICELLI ERIC 11966 61988101986051288210744.7638.SANS -9815LAPLACE PHILIPPE 11966 5198912198812 8656 8146.1438.SANS -0253TALLOIRES ERIC 11966 61989121993071381911366.0338CSANS -7893BOURBOTTES JOEL 11966 8199404199201 9597 8729.0338MANGL -2674SET OLIVIER 11966 619891119881110407 9270.5638MSANS -8321LONGS FREDERIC 11966 219950319940110668 9427.0238CSANS -6369DOURBIES PATRICE 11966 319920319910310024 8999.3438CSANS -1563TURBINE JACQUES 11966 91987031994091693613498.1438MTECHN -6038COLLINE RICHARD 11966 5198912198812 8656 8147.2238.ANGL -8370BONSON THIERRY 11967 5199011198911 8656 8145.3838.MANAG -1538FAUVETTES HUGUES 11967 6199609199509 7803 7681.3138MANGL -5092DJINNS MICHEL 11967 1199111199011 9597 8728.9938CSANS -3468GARDES FARID 11967 119880319870310407 9270.4238MSANS -7303DENY JEAN CLAUDE 11967 51993021992021202810240.7738CESP -1319PLOUGONVELIN JEAN FRANCOIS 11967 919880919870910407 9270.1638MTECHN -7182BEAUMARCHAIS ALAIN 11967 11990111993071381911365.9838MSANS -5432ROMAIN JEAN PIERRE 11968 519940519920110024 8998.1738CANGL -8756PEGUIERE PHILIPPE 11968 919940319930310668 9426.6338MTECHN -0590MONTROSIER DIDIER 11968 419940419920111389 9851.6438MSANS -3773FIORI MICHEL 11968 61990051990051381911364.9938MSANS -9060CHAMBORD AGOSTINI 11968 9199406199306 7803 7679.9138CSANS -7693DIZIER THIERRY 11968 319920519911111389 9851.7338CSANS -7838CECILE PATRICK 11968101988071991011249910473.6738CSANS -6964GOYRANS GABRIELLE 21969 91990031992011202810239.9638MSANS -0784COSQUER COLIN 11969 719940619930611389 9851.9638MINFOR -8622COURTAIS JOSE 11970 619960719950710668 9426.6238MSANS -2794BERGERET CHRISTOPHE 11970 61992051993041202810240.5938MINFOR -4688RABELAIS FREDERIC 119701219940619930411389 9850.7138MANGL -9681POUSSEAUX RICHARD 11970 61991041990041202810241.4538MINFOR -0530BRANCOLAR PIERRE 11970 619900619890610024 8998.3538CANGL -9957LENTILLY LAHOUARI 11971 7199607199507 7803 7680.6638CSANS -7210CHAMPERRET ANDRE JEAN 1197111199406199201 9597 8728.6838CTECHN -7549BRAMO JEAN 11971 2199612199401 9597 8727.9638CSANS -1719TELEMLY JEAN 1197110199612199512 9894 8922.8038CINFOR -7574MOUQUET PIERRE 11971 3199304199204 9597 8728.7738CANGL -1471ETOILE PHILIPPE 11971 3199501199304 9597 8729.9038MANGL -1536MAISTRE LOUIS 11971 51990121989121202810241.5238MINFOR -7328BLAMONT BRUNO 11971 31991021990021202810240.4038CSANS -4093TOLOSANE JEAN 11971 51991071990071202810240.7638CANGL -8648RAPHAEL GERARD 1197210199408199201 9597 8728.4938CMICRO -2769GOULET ERIC 11972 119950419940111389 9852.5938MSANS -9108CRETEIL MICHEL 11972 4199606199506 8656 8145.6638CSANS -5284POMPONNE ALEXIS 119721219920519911211389 9851.7938CTECHN -8876LAIGNEAU ALAIN 11972 3199202199102 8656 8146.4138.ANGL -6070REVOULUN CONOR 11972 2199608199508 7803 7681.4038CMARKT -8083CLEYRAC JACQUES 11972 5199403199201 9597 8727.9138CANGL -8314PARIS GERARD 119731119940819930810668 9426.0338MANGL -4108SEGURET GUY 11973 9199207199107 9597 8728.4638CSANS -4139PRESSENSE PATRICK 11973 9199608199508 8656 8145.6938CALLEM -2465CHATEAUDOUBLE DIDIER 119731019950219940210668 9426.4838CSANS -5213MARTINIERE GERARD 11973 8199608199508 7803 7679.2838CSANS -0769POUR PHILIPPE 11973 719940919930910668 9425.8538CSANS -2580BESON MARC 11973 7199307199207 9126 8457.0238CALLEM -4770LIEUTENANT JEAN OLIVIER 11973 8199607199507 8656 8145.6638CINFOR -1963SENGA CLAUDE 11973 6199412199201 9126 8457.2238MCOMPT -2932SOULT CAMILLE 11974 5199604199504 8656 8145.8338CESP -5177CLOS GILLES 11974 4199506199406 9126 8456.6138CALLEM -0619MEUR BRUNO 11974 2199607199507 9894 8921.6938CANGL -3202RUBEU DOMINIQUE 1197411199610199511 9894 8922.0838CINFOR -1263PONTILLOU DIDIER ERNEST 11974 1199309199209 9597 8728.1738CSANS -3833NEUVE JACQUES 11974 2199508199408 9894 8921.6438CANGL -6528NIMES ROBERT 11974 1199410199310 9597 8729.3638MSANS -9312CHAT ANDRE 11974 7199307199207 9597 8729.6338CANGL -0437SAUVAGEONNE RICHARD 11974 4199301199201 9597 8728.8238MSANS -5387PLEHEDEL JEAN RENAUD 11974 8199309199209 9597 8728.9938CVENTE -5835MAROLLES DENIS 11974 7199609199509 7803 7679.9438CSANS -5277BURON STEPHANE 11975 4199410199310 9126 8457.5938CALLEM -0147URSULES PATRICK 1197510199512199412 8656 8147.1738CSANS -6637DEVANT PATRICK 11975 7199610199510 8656 8146.2938CSANS -7462BARBICAJA STEPHANE 11975 9199609199509 7803 7679.3138CSANS -9096HELENA PHILIPPE 11975 81994111994011202810241.8538CINFOR -7777ENGOULEVANT JEAN CLAUDE 1197511199612199512 9894 8922.0838CSANS -7823BRENNUS JEAN PIERRE 11975 2199606199506 7803 7681.2038CINFOR -7353LOOVAS FREDERIC 11976 6199612199512 9894 8922.8938CANGL -5381BRIAND JACQUES 11976 1199507199506 7803 7681.4038CSANS -8880LECLERC FRANCOIS 11977 2199506199406 7803 7679.8738CMICRO -1576MONTMELIAN CLAUDE 11977 9199607199507 7803 7679.3138CANGL -6203GUECH RENE 11977 1199507199407 7803 7680.2638CCOMPT -2768MERIBEL RICHARD 11977 7199607199507 7803 7681.2938CSANS -7366FERNANDEZ OLIVIER 1197712199607199507 7803 7681.0238CANGL -7525LONJUEUIL SYLVIE 2193011198901199511 8656 8145.9141.INFOR -8410CAIXA JEAN PIERRE 11935 31956051979013327724476.3741MSANS -4687FURSTENBERG NADIA 21936 31972041994101881314585.6641MSANS -9030AMIRAL JEAN RENE 11936 61961081993011663613343.8441MSANS -0747SURREY TOMOE 2193611199201199101 7803 7680.6241.INFOR -6230LIGURES JEAN PAUL 11937 81962021994042666519900.8141MALLEM -5598FONTENELLES CLAUDIE 21937 31962031995102666519899.2941MANGL -7964AUMONT JOSE 11938 31968121991011433211715.7241CSANS -1865HUBERT CHRISTIAN 11938121962111982112470018542.1041MSANS -0974ROMAINE JEAN MARIE 11939 91962111989071663613342.9741MALLEM -8959BILLEHOU DENIS 11940 41962011993011663613343.2041MSANS -3134RESISTANCE CHRISTIAN 11941 61970051987012022115555.5741MANGL -2829MARCIGNY ANNETTE 21941 8198901198711 8656 8146.6141.SANS -9621AIR MONIQUE 21941111968071990071578112723.4141MTECHN -2532MIMOSE JEAN 11941 31979031994011369311287.2541CANGL -6822BERLIOZ MICHELE 21942 81965021992051932314934.6841MSANS -8381REGRATTIER FRANCOISE 21942 41963101991072273717261.0341MSANS -1877GASTON APOLLINA 11943 41972061995011663613343.5241MANGL -9764NORTH CATHERINE 21943101992051995121330611017.8841MVENTE -0051FABRON GILLES 11943111972121992041403411522.2441MSANS -2826DESTEY RICHARD 11943101965121990011433211713.6541MSANS -4901GANDHI FRANCOISE 21943 31969031991011932314935.1641MSANS -2788ENSOLEILLADE CHRISTIAN 11943 81966011991043844228044.1541MINFOR -2725SAROIS CORINNE 21943 71972081994051804514081.9541MANGL -4033GRIVES PHILIPPE 11944 31966101990011433211714.0341MSANS -0306LUTECE CATHERINE 21944 91977061992011471512026.2241VSANS -6413TURALURE LOUIS 11945 11967121990041433211715.1541MALLEM -6065BUARD JEAN JACQUES 11945111969061991011433211714.6441MTECHN -0713CLAUVEL MARIE CHRISTINE 21945121993101992011202810241.7441MSANS -2016BENGALIS HENRIETTE 2194510199103199003 7677 7603.0141.SANS -5741SAUVAGERE ALAIN 11945 91972021989011621213034.1541MSANS -5896GAILLARD ERIC 11946 31973021995011663613344.4541MANGL -4390PAROUQUINE MARTINE 21946 81973041995101911114778.4441MESP -4358MAYE CHRISTOPHE 11946 81970111994051834514276.1841MSANS -3228PERRET JEAN PIERRE 11946 419800719790711389 9852.6741MESP -2070COMMERCE MARTINE 21946 11965101995042739020405.2241MMARKT -2112COT CHANTAL 21947 5199104199004 8656 8147.0141.ANGL -5488MONTAIGNE ERNEST 11947 81972061989041621213032.6541MTECHN -4615JAURES PASCAL 11947 319850219840211389 9852.1441MSANS -3975BENAT MARTINE 21947 9197204197104 8103 7796.4541MTECHN -5422LAUGIER FREDERIQUE 21948 719850419880110791 9502.2841CANGL -7269TORTE DENIS 11948 71969081994083916628548.6641MSANS -9916MARNES JEAN CLAUDE 11948 719931019910710407 9270.0341MCOMPT -7840GRIGNON CHRISTIAN 11949 51969121989122470018541.4341CVENTE -5255VERNY ARLETTE 21949 81971061990071621213033.7041MALLEM -4729SALONINA PATRICK 11949 91974041992011608112916.6141MCOMPT -5121KISS THIERRY 11949101976041994011369311288.2241MTECHN -3042FERIC MARIE CLAIRE 21949 51984071994031288210744.1741VTECHN -3660PLAINES FLORENCE 2194912199303199306 9597 8728.0841MANGL -6514EPINIERE JANY 21950101972011990102175716601.3041MSANS -4692HUNTZIGER BERNADETTE 21951 71992101991101202810241.0741MSANS -6747CHAMPERRET LAURENT 11951 819870719870810407 9270.9741MSANS -5984JAMET DANIELLE 21952 9199203199103 7677 7603.0441.SANS -8680SERRALONGUE ANDRE 11952 31977071981102470018541.9541MSANS -1345LENTILLAC ALAIN 11952 919940119920110407 9272.0141CALLEM -9942AUSSEL MURIELLE 21953 4199406199306 9597 8729.5841MINFOR -6512SCIPION CLAIRE 21953121974081992032175716602.2441MSANS -2634FOCH JOCELYNE 21953 31996011995011249910473.0941MINFOR -5957CYPRIERE CHARLES 11953 81977091993071369311288.1041MANGL -7817EMILE SYLVIE 21953121973041994011527112373.0441MSANS -8678HUNG HUGUES 11954 819810519850611389 9852.6041MSANS -7968LUBONIS MICHEL 11955 71980041992021471512025.5241MSANS -3688EBAT ANNE MARIE 21955 31977071995071433211714.0341LSANS -0140GIRARD CLAUDE 11955 71978111991041578112722.8741MTECHN -6583EUGENE CHRISTINE 21955 71978051992111608112916.2541MINFOR -3771CUQUES ELISABETH 21955 11993101992011202810241.6641MSANS -9329CARRIERO JOSE 11955 719830419820411131 9658.8341MSANS -6210MACHIEL ROGER 11956 71977031993041471512024.0841MSANS -7407QUENU PATRICK 11956 71980051995041249910473.3241MALLEM -7722CARNOT GENEVIEVE 21956 51977051993031608112915.4241MALLEM -7051PALMIERS EVELYNE 21957 41980041994011471512025.1141MSANS -6978JACARANDAS ALAIN 11957 11985081993041288210744.7741MANGL -5352VANTAGE GERALD 11957 91978071992091471512024.5341MTECHN -9337CHALONS MICHELE 21958 3199609199509 4342 5820.2441MSANS -6534HERRET VIVIEN 11958 919861119860710791 9502.8041MSANS -3402RUVEI LINDA 21958 71981051995041433211713.6241MSANS -5959SERLIANE HERVE 119581119851219841210791 9503.3141CANGL -2613ROSIERS RICHARD 11958 3199601199507 9894 8921.8141MSANS -3289ALLEGRES GERARD 11959121981071994011471512025.9141MSANS -6523ROCCA GUY 119591219850119860411131 9659.1541MMARKT -8881CHATEAUBRIAND GILLES 11959 51981011993071471512025.3241MSANS -5781HELSINKI DANIELLE 21959 81981011995011433211715.7441MANGL -4147SIAGNE CORINNE 21960 61981041980041450311832.2441MSANS -1606POIL MARIE THERESE 21960 919941119920110024 8999.5241CANGL -1752ROUGUIERE GUY 11960 319940819951011389 9851.1041CSANS -5961CHALAIS MICHEL 11960 919930819910110407 9271.4641MSANS -1601DURUY ANNE MARIE 21960 21989071988071249910473.2741MALLEM -3631ESPARIAT MIREILLE 21960 4199511199411 9126 8457.4941MESP -2747TENSE MARCEL 11960 11982021995042256617145.7841MSANS -6989JACQU YANNICK JEAN LOUIS 119601219831119850111131 9657.0641CSANS -4612BOURNET LAURENT LOUIS 11960 119900519891110407 9271.2441MSANS -3236PIOL DOMINIQUE 11960 51984051991011326611017.7741MSANS -6475VILLETTE PHILIPPE 11961 21984081983081608112915.6641CANGL -8207MESNIL REGIS 11961 21982101990112090215979.7941MSANS -0526AGUESSEAU DARA STEFANE 21961 91986041985041288210745.7541MSANS -3092MONTFLEURY JACQUES 11961 11983041994011433211713.9441MSANS -7762BUCHERIE ANNIE 21961 91986101985101288210744.6741MSANS -9535MADONA CHRISTIAN 11961 719931019910110407 9270.8041CSANS -4953GARE HIROMI 21961121984031994011527112374.4941DSANS -6431CORNEBARRIEU JEAN PIERRE 11962121985101991021527112373.6241MANGL -3878ANLHIAC MICHEL 11962 7199602199502 8656 8145.9641MSANS -6464ESTEREL GASTON 11962 619860319880310791 9503.7641MANGL -2255MAUVALLAT ANNE 21962 71982081981081326611016.1541VANGL -8438CHANTACO MARIE NOELLE 2196211199307199207 8656 8147.1541.SANS -4202FENOUA MARC 11962 3199212199112 9597 8728.5041MTECHN -3836PAUL PHILIPPE 11962 31982011993041326611016.2141MSANS -0418CHANET NICOLE 21962121982041981041608112917.1541MSANS -2005ROCHES MARIE HELENE 21963 31984071983071608112915.2141MINFOR -7305RASPAIL YANN 11963 719850919840910791 9501.7841MSANS -4264SCHOENFELD PHILIPPE 11963 619830419841111131 9658.4241MANGL -4951LAUVE JEAN PIERRE 119631119840319860610791 9502.5941MSANS -7632VALLOIS FREDERIC 11963101986011990111288210744.6741MSANS -6021ANTOINE JACQUES 11963 4199406199306 9597 8729.3441LANGL -1193SAUT YANNICK 11963 51987061992121450311830.7941MSANS -5840VIRARD JEAN PAUL XAVIER 11963121995011994011206910241.4941MTECHN -0346CASATORRA BERNARD 11963 419910619900610024 8998.1741MSANS -0082BAURECH HENRI 11963 41991101990101381911365.5041CSANS -3466TULIPES ANNEE 21963121984111983111450311830.8541MTECHN -3635FUSTEL BRIGITTE 21963101983041991091527112373.6441MALLEM -3776THUITSIGNOL ANDRE 11963 91983071986081326611016.7441MSANS -7941PINS MICHEL HENRI 11963 81983081993041288210745.4341CSANS -8903CHARTRES MARIE ODILE 2196412199412199312 8656 8147.2441MANGL -6455GIANOTTI FRANCOIS 11964 219870119860110791 9501.8341MSANS -3178PABU PATRICE 1196412199606199506 8656 8145.9641MANGL -1683TOKI GILBERT 11964101994051993051267210589.2541CTECHN -1069COUTURES ERWIN 11964 6199504199404 8359 7952.6641CSANS -7668PALISSY ALAIN 11964 2199310199210 9597 8729.2741MSANS -4934AIGUES JEAN MARIE 119651019860719860310791 9503.9741MTECHN -5099LARRALDIA REMY 11965 11987021993091949415052.3541CANGL -8301BOUCHAREL FABIENNE 21965 81993091992091839014312.4041CSANS -7214VOUTE CHRISTIAN 11965 419870719870610407 9270.9741CTECHN -7913MOULINS YVES 119651219890519880510407 9271.8641DCOMPT -1180REPENTANCE MICHEL 11965101993111992011249910472.8741MALLEM -1457SAUVETTE GERARD 1196512199301199201 9597 8729.3041MSANS -4206LONGERE ISABELLE MARIE ALICE21965 8199610199510 8656 8146.1141CANGL -2030TONELIER MARC 11965 719860419880510791 9502.5541CSANS -2828DERRIEN JEAN JACQUES 11966 71991011990041202810241.6141MSANS -5283COULLET OLIVIER 11966 519880619870610407 9272.1341MANGL -8198COUPANCES CHRISTINE 2196610199403199303 9126 8456.3041CSANS -4478NOSTRADAMUS GREGOIRE 11966 719860419900210791 9503.9741MSANS -7215HILAIRE FRANCOIS 119661019860319850310791 9503.9741CSANS -8745MONTREUIL GUY ROBERT 119661019910419900410024 8999.0741CTECHN -3647DELESTRAINT JEAN CLAUDE 11966 11989061994011381911366.2741MSANS -7458LISERB JEAN LUC 11966121991061992031381911366.0941MALLEM -6758BIGOCHETS FREDERIC 11966 119911119901210407 9270.8341MSANS -0098JARDINIERS MYRIAM 21966 51986061993071450311830.9441MVENTE -0882BRUXELLES CAROLINE 219661019940319920111389 9851.8241MALLEM -5390VEYRE NATHALIE 21966 419941119930411389 9851.9741MALLEM -4046CHAMBERTE BERNARD 11966 31987091988071949415052.4441CSANS -4837BONNAMOUR MICHELE 21966 21994031993011723313654.5941MSANS -0532MORE LOUIS 11967 919870819930410407 9270.2441MTECHN -4906LELIWA DANIEL 11967 219870619860610407 9271.2041MSANS -5362MAGNOLIAS JACQUES 11967 6199609199511 7464 7525.6141CSANS -8779SORQUES GUY 11967 61988041990011249910472.9741MANGL -1022ETANG GERARD 11967 3199506199304 9597 8729.5841LANGL -8535DELACROIX JEAN PAUL 11967 619940519930511389 9851.5141MSANS -4910ARANDELYS HERVE 11967 71990101989101202810241.0941MANGL -4304EURE ALAIN GEORGES 11967 51991101990101330611017.7941CESP -0132DJILLALI ALAIN 119671119931119920110407 9271.1941MSANS -9907BON THIERRY 11967 91987091992111450311830.6141MSANS -5376REGNAULT DANIEL 11968 51990111991021381911366.7941MALLEM -0903SUR BRUNO 11968121992051994121330611017.0541CSANS -7066RENAN FRANCOIS 119681219890619910510024 8999.7441CVENTE -9334ALL ADELE 21968 9199310199210 9597 8728.9841MSANS -1100MONTFORT ANNE MARIE 21968 519950219930411389 9851.7441MSANS -7153PINSON GENEVIEVE 21968 31989111993071381911366.3041MSANS -4338MABO MICHELE 21968 7199602199502 8656 8147.1541MSANS -2568GODEAUX GEORGES 11968 61994051993051267210590.4141MSANS -9355MEUNIER MARIE HELENE 219681219940919930411389 9851.1041MINFOR -4462CACTUS MICHEL 11968 51993091992091839014312.7641CTECHN -2155REINOTS DENIS 11968 1199406199201 9597 8729.6641CMARKT -1708QUEUILLES ALAIN 11968 91991111991111723313654.7041MANGL -9411MANDRAGORE ALAIN JEAN 11968 81995041994041206910241.6641CSANS -4930ELVIRE PATRICE 11968 41995121993041202810241.7441CALLEM -8112PAVOIS LUC 11969121992021991021381911366.7941CSANS -8181UNIVERSITE OLIVIER 1196912199408199308 9126 8456.6941LVENTE -6245CAIRE ANNICK 2196911199405199301 9085 8419.1641CSANS -2166PRETY CORINNE 21969 7199612199512 9894 8922.5341.SANS -4325COTTAGES YVAN 1196911199407199307 9126 8456.9741MCOMPT -0898SYLCO ALAIN JACQUES 11969 91989091988091249910472.9641MSANS -4572DARTHE DIDIER GEORGES 11969 4199503199304 9126 8456.5541CSANS -9418AUREVILLE PHILIPPE 11969 519900719890710024 8998.2841CSANS -7504MAROT ALAIN 11969 119910319951110024 8997.8341CANGL -4672TRUCQUES JACQUES 11969 2199606199506 8656 8145.6041MANGL -5588POUTILS ALAIN 1197012199405199305 9597 8728.2241MALLEM -8965SAUCES JEAN PAUL 11970 71992021991021381911366.2541CSANS -1934PRESSES LUCIEN 11970 11991091990091467711987.9041CSANS -5600LAROIN LAURENT 11970 91991061990061202810240.6841CTECHN -8935REINE JEAN PAUL 11970 119920819910810024 8998.7141CSANS -9304MARCQ MARCEL 11970 719940119930111389 9851.4341CANGL -5444CHEM LOUISIANE ALAIN 11970 11991021990021202810240.2241MSANS -7850HUBERT BERTRAND 119701219920619920410024 8998.1441CSANS -0638FLEUZY PHILIPPE 119701119900419890410024 8998.7141MVENTE -0729MUETTE CLAUDINE 21970 5199204199104 9597 8729.8541MALLEM -5723MARCHE LAURENCE YVONNE 21970 919940619930411389 9852.3641CANGL -1904CHENE JEAN GABRIEL 1197010199501199304 9597 8729.2141MSANS -1861CREOUNE MARIE THERESE 21970111991101990101330611018.1541MSANS -5885LONGUET MICHELINE 21970 619950319940110668 9426.5941MSANS -9271SEINE LIONEL 11971 81993121992121267210589.8241MSANS -6056CHE FREDERIC 11971 219901019891010024 8999.8541MSANS -8822BOUSSOLE ERIC 11971 819910419900410024 8998.7641CSANS -1433COMBE ALAIN 11971 5199308199208 9597 8729.3941CSANS -5251GRELLOU DOMINIQUE 11971 91992091991091330611018.2441MESP -6795EMMANUEL MARYSE 219711119920719920811389 9851.3041MANGL -6104AUDE CATHERINE JOELLE 21971 7199309199209 9126 8456.4741MSANS -3946PLEUMER CATHERINE 21971 6199301199201 9597 8728.1941MANGL -9614BOUE FRANCOISE 21971 519921219951011389 9850.7641CSANS -5568TASSY DANIELLE 2197111199605199505 8656 8146.4141SSANS -5159CHATEAU GUY 11971 619910419900410024 8998.9541CSANS -3722VERE ALAIN 119711219930919920911389 9852.6941CVENTE -8496ORANGINI PATRICK 11971 31994051993051267210590.4241CSANS -4662CANTE WINNI 21971 9199206199106 9597 8728.7141MSANS -5032CHATAIGNIER MARIE LOUISE 21971 81991121991091330611017.6441MSANS -1771PICHOLINES JOELLE 21971101991121990121202810240.9441MALLEM -8900BOULAINVILLIERS MARTINE 21971 719940619920111389 9852.0041MSANS -8306GUERRE FRANCOIS 1197112199103199003 8656 8146.2941.ALLEM -9088LAROQUE MARIE FRANCE 21971121993091992091723313654.6141CALLEM -6520LIEU JEAN PIERRE 1197112199201199101 9597 8728.2341CESP -2579HERANDIERE PIERRE 11971 6199606199506 8656 8146.4641CTECHN -8999JARDINS PIERRE 11971 819910119900110024 8999.3041MSANS -8513PERRIERES PHILIPPE 1197211199205199412 9597 8728.0941CTECHN -5836GIRARDON SYLVIANE 21972 119911019901010024 8998.5041MTECHN -9465DAN FRANCOIS 11972 31994031993031267210590.0541CALLEM -3970BREGUI GERARD 11972 5199311199210 9597 8729.5241CALLEM -8911RIVIERE MARTINE 21972 5199310199210 9597 8728.8441CANGL -8506RIBOT JEAN PIERRE 11972 3199403199303 9597 8728.1341CANGL -4988CHATILLON DIMITRY 1197210199303199203 9597 8729.2541MANGL -3678GRES CLAUDE 21972 8199608199508 7803 7680.6241CSANS -9757CADENELLE PAUL 11972 219951219940110668 9425.8141MINFOR -8910RENAISSANCE RENAUD 119721019931119921111389 9851.5541CSANS -4973SAL EMMANUELLE 21972 719920119910111389 9851.3941MANGL -8099TURENNE MARTINE 21972 8199407199407 9126 8457.5641DANGL -6683HIRONDELLES MARGUETITE 219721219930919920910668 9425.4541MANGL -3610BERTRAND DIDIER 11972 8199403199201 9597 8727.9941CSANS -7709MORINERIE YVES 11972 7199206199409 9597 8729.5241CSANS -6549BOISSERAIE HERVE 11972 41995041994041206910240.7641CTECHN -8170MALHEUREUX PATRICK 11972 21991111990111202810241.4041CSANS -0105CRONSTADT CHRISTOPHE 11972 6199209199109 9597 8729.1741CALLEM -3953CHARBERYS NICOLE 219721019930819920811389 9850.9841CALLEM -7071BARBINIERE PHILIPPE 11972 71993031992031267210590.4741CSANS -4851LETRIMAN CLAUDE 11973 5199602199502 9894 8921.9641CANGL -0165VAUGRENIER JACQUES 11973 119930919920911389 9852.3841CINFOR -7080BANCHE ANTOINE 11973 3199306199206 9597 8729.6741CSANS -1252VINCENNES ANDRE 11973 6199410199310 9126 8457.3641CSANS -1299SERIGNE LOUIS 11973 4199310199210 9597 8728.2641MSANS -7759WILDERTON LUC 1197311199410199310 9126 8457.3241CSANS -8844LORGUE SYLVIE 21973 119930319920311389 9852.3841MSANS -8332BRANLY BRIGITTE 21973 7199509199409 7803 7680.7241CSANS -8767DEMOISELLES LUC JACQUES 1197310199301199201 9597 8729.7441CANGL -6481MANCEY RENE PAU 1197311199411199506 9597 8727.8341CSANS -9685HERRIOT MARIE CHRISTINE 21973 6199408199308 9126 8456.8241CESP -5412JANVIER KATY 21973 6199210199110 8359 7953.4241.VENTE -3049VICOMTAL ANNE FRANCE 21973 2199305199205 9597 8728.1741MANGL -8606DIDIER MARC 11973 3199308199508 9597 8728.5041MSANS -5438MOREL JEAN JACQUES 11973 91994031993031267210589.0641MSANS -1333CERET ISABELLE 21973 3199608199508 9894 8922.4141CALLEM -8656COUBARD FREDERIC 11973 9199305199205 9597 8729.6641CTECHN -7939MONOD SYLVAIN 11973 5199301199201 9597 8729.2541CSANS -2807BOTTERO PATRICK 11973 4199403199303 9597 8728.5341CSANS -1950VAROISES ELISABETH 21973 619930919920911389 9850.8341MSANS -0981MARCILLY JEAN RENE 11973111992101994011249910472.1941CTECHN -7067ROSES PASCALE ISABELLE 21974 3199406199306 8359 7952.7941CSANS -5670DEVLOO RICHARD 11974 5199512199304 9126 8456.9141MALLEM -0896CHEVAL CHANTAL 2197411199603199503 7803 7681.1141CVENTE -7374BAUX MARTINE 21974 6199607199507 7803 7679.6441CALLEM -2343PANSEROT BRIGITTE 21974 7199406199306 9126 8456.5741CSANS -8458ARMANDY CLARA 21974 419940719930810668 9427.4041CTECHN -5573TAKAOA MARTINE 2197412199306199206 8359 7953.1141.ANGL -1351ROYAN MICHEL 11974 8199606199506 8656 8145.8741CSANS -2308COAT MARIELLE 21974 21994091993091206910240.3741CANGL -1077BARBY HERVE 11974 3199609199509 8656 8146.8341MSANS -8863JUNOT JEAN GILLES 11974 7199610199510 8656 8145.4441CSANS -3894CIEL JACQUES 11974 119940919930910668 9425.6741CINFOR -5086FABRE GEORGES 11974 7199407199307 7803 7680.7141CSANS -3050CROISON RICHARD 11974 9199409199309 9126 8457.3341CSANS -9319CHAT DIDIER 119751119941219931210668 9426.9341CINFOR -2636MONTJUSTIN BERNADETTE 21975 8199609199509 7803 7680.8141CSANS -1156MER JEAN MARIE 1197512199603199503 8656 8145.2141CSANS -2790RAGEUL SERGE REYNALD 11975 5199603199503 8656 8146.7941CSANS -4387BRETEUIL ERIC 11975 1199606199506 8656 8146.2941CALLEM -7191COCHET HUGUES 1197511199609199509 7803 7680.7541CSANS -7798LARGE DOMINIQUE 21975 8199609199509 7803 7680.8641CSANS -1442CANDEOU ARMAND 11975 3199603199503 8656 8147.1041CSANS -6969CHAIGNEAU CHRISTOPHE 1197512199610199510 8656 8146.0241MALLEM -5660HOULET MARIE ELISE 21975 5199603199503 8656 8147.0441MANGL -9225TOURNON MARIE ELISABETH 2197612199607199507 7803 7680.8641CSANS -3312GURGY FRANCK KLEBER 11976 6199606199506 7803 7679.6741CESP -2078CEDRES JACQUES 1197612199509199409 7803 7681.4941CSANS -1381ALPHONSE MARIA ISABELLE 21976 3199607199507 7803 7679.6341CSANS -2376POMPADOUR HELENE 21976 7199606199506 7803 7681.2941CINFOR -2713RUILLE PATRICK 1197612199507199509 7803 7680.1241CALLEM -2134FRANCOEUR ELISABETH 21977 6199610199510 7803 7680.3241CINFOR -7879EGLISE LAURA 21977 8199608199508 7803 7680.6241CCOMPT -6841GEAUNE GILLES 11978 2199507199407 7803 7680.3041CANGL -8261LOC PHILIPPE 11935 11955021990084330331421.1942MSANS -0031DEFEND JEAN YVES 11935 51961081987042273717261.5642MINFOR -7162PIOT YUMIKO 21935 41969041991051932314933.5575CSANS -6005DESIDERATO ASSUNTA 21935111962101994012137316332.6342MSANS -1346NIZON JEAN LOUIS 11936 51971021994011663613343.9542MSANS -6423CHARTIF ANNIE 21937111962081987082572519241.9042MANGL -3151EUBAS DIDIER 11938 81963021981053327724476.0342MSANS -0345KOCK CLAUDINE 21939 91968051995041834514275.4142MSANS -4204POSTILLON NICOLE 21939 31963121992102137316332.0042MSANS -1286BERTIN BERNADETTE 21939101967011990011932314935.1342CTECHN -0588ONZE BERNADETTE 21939 41962101990072273717260.7142MTECHN -0552ARENE PASCAL JACQUES 11939 21963071988101663613342.9742MSANS -8335DRAGON BERNARD 11939111963031987012022115555.3642MSANS -5819CORNEYRETTE MICHEL 11939 41963041983123200223583.0542MSANS -6812MONADE ANNIE 21940 11961121994072137316330.5642MSANS -5797PLATEAU ROGER 11941 71964041993113844228045.2942MSANS -0254FONTAINE DOMINIQUE 11941 41963071992041557012567.5042MANGL -8521PRELLAVICA JEAN 11941101966061989071663613344.4542MSANS -1509MOINE JEAN PIERRE 11941 21960031984102273717260.4542MTECHN -9780LETELLIER JEAN CLAUDE 11941111975071991011369311286.0842SALLEM -0995HECTOR MICHELINE 21941 91971011991071578112722.3742MALLEM -0917PUISAGE JANNIE 21941 81962041992042273717260.7242MSANS -0311LIEVRES ELISABETH 21941111968031990011932314934.1442CTECHN -2094NOTRE JEROME MARIE AUGUSTE11942101970061993071557012567.0042MSANS -3489EGALITE SYLVIE 21942 81962041981112470018541.3642DSANS -2303BUSSY PASCALE 21942101968121991011932314933.8242MMICRO -2502MEAUX JOSEPHINE 21943 41966061994102137316332.2942MSANS -9316DANTON ANNE HELENE 21943 91969091991051932314933.6942MSANS -0398ABREUVOIR JEAN LUC 11943 41962111986012470018540.7542MSANS -6448FORCET VALERIE SYLVIANE 21944 81964091994072137316331.2842MANGL -9339TOULON DENIS 11944 91970121994011663613343.1042MSANS -1107OUZOUER ANNE 21945 11966061992021932314935.2242DTECHN -1368ALIVOU MICHELE 21945101971101989102273717260.0542CSANS -9954LANFRIERE JOSIANE 21945 41996011994011202810240.4142DANGL -1709LUXEMBOURG FABIENNE 21945111972071991101578112721.5342MSANS -5979DESNOUETTES PASCAL ROBERT 11945 31975061990011684813422.8442MSANS -3473AULX OLIVIER 11945 61971081991012334017610.4742MSANS -3451MANEBIT MARIE MADELEINE 21947101972041993121471512025.3442MSANS -7163GIGNAC MYRIAM 21947 11969081989042334017610.2042MSANS -8839CORINA DOUGLAS 11947101967041995042137316332.5642MSANS -7647COCTEAU YVAN 11947 21973051995072547019086.4742CSANS -9097APARTADO BRIGITTE 21948111974101994011621213033.6142CANGL -9822VERONIQUES PATRICIA 21949 419791119920111389 9851.0342MSANS -5016SYLVAFLOR BRIGITTE 21949 51970021994032334017609.4642MSANS -5933BROUILLARD SYLVIE 21949 31969011991072137316331.1542MSANS -1734PLAGE LUDWIKA 21950 61971081991012137316331.0742DSANS -8533LIBERTE PATRICIA 21950121970011995041834514276.1042DANGL -7399FONTVERT ISABELLE 21950 41970121994051834514275.5542MTECHN -7055MONTGIVRAY PIERRE 11951 41972081994062547019085.7942MVENTE -4158CHARTON DANIEL 11951 91980041993041608112915.2642MANGL -7325NIEL RICHARD 11951 71973081989053417325098.0042MANGL -7367BRIAND MICHELE 21951 41973061991011578112722.0142MSANS -0279HEURES PHILIPPE 11951111980041993011527112373.3542MSANS -5487TOURAINE CLAUDE 21951 41972081991012137316332.7242MALLEM -1239JALMOUTIERS CLAUDE 11952 31983031991031693613499.3442CINFOR -4152CHEMST ELISABETH 21952 91972031971031258210512.6242MANGL -7961ABBE KATIA 21952 51986071991041249910472.5942MANGL -9227LEPELLETIER MARIE FRANCE 21952 81973051992102017815518.1942CSANS -2603ESCALE DANIELE 21952101972071990011621213034.0142MANGL -9280SISLEY BRIGITTE 21953 319740719730711515 9931.0742MESP -6356ROZIER MONIQUE 21953 51972081990041621213032.3542MSANS -6175CHENNEVIERES MARIE THERESE 21953111980101991011249910473.1542DSANS -0679FONT EMMANUEL 11953 81984081993081326611018.0942MESP -2032VIALA DANIEL 11954 71973061991011578112723.0642MSANS -7857MASSEL GILLES MARCEL 11954 81976011995072256617145.4842MTECHN -4251CLINCHAMPS ANITA 21954111977101976101279810668.5342MALLEM -4945COURS ERIC 11955 71988101992044121428006.7742.SANS -1834FUBLAINES BRUNO 11956 91976041995042000715438.5042MSANS -3825KRIMAHER JEAN CLAUDE 11956 91984081992061326611017.8242MSANS -9642MORILLOT CATHERINE 21956 319950419940411389 9851.7942MINFOR -7414DUVEEM FRANCOIS 11956 51988041992011168610047.2742MSANS -8488BOUGAINVILLIERS PATRICIA 21957 31978071977071224010317.3642MSANS -3611COURSEGOUL DOMINIQUE 11957 21984081993011215710278.5342MSANS -5494LABROUSTE AINA 21958 81980011993111471512025.4142MTECHN -9526FLEURY MARIE CLAUDE 21958 319880719890710407 9270.6042MSANS -2858LABBE FRANCK 11958121980111994051450311831.3442MMANAG -3479NOISETIERS MONIQUE 21959 31989011991101249910473.6742MCOMPT -0868ODET CORINNE 21959111989031988031249910471.6542MSANS -3022TORSE PATRICK 11959 31978121993012022115555.8642MSANS -3375ORLAMONDE MICHELE 21959121986091993051450311832.4142MTECHN -5711PASTEUR CHARLOTTE 21959 71980051994011471512024.9242MSANS -1466PERRIERE MAUD 21959101979081993071471512025.7442CSANS -9464ROS ANDRE 119601019900419940110024 8998.4042MSANS -9586TRAVERSIERE ALAIN 11960 11984121993041527112373.3742MINFOR -4466GATTIERE BRUNO 11960 41982081992081215710280.1042MSANS -4368GALIGNES GENEVIEVE 21960 61982091988031326611016.2442MSANS -2690CHERBOURG HENRI 11960 91983111992091326611017.5542MSANS -2470LEPLESSIS JEAN FRANCOIS 11961 31984041994011578112722.3742MSANS -7595GLOIRE MARIE LAURE 21961 519940219920111389 9850.6542MTECHN -1338SCAMARONI PATRICIA 21961111981111980111608112916.9742MANGL -2208PLAINES MICHELLE 21961 21982021981021326611017.4742MSANS -2517REMENIER MARTINE 21961 7199409199309 9126 8457.3642CTECHN -9410BARRELET GENEVIEVE 21961 41983021982021326611016.3542CSANS -2551POLIENAS MARCEL 11962 419870319860310791 9502.4942CCOMPT -7760DANG YVES 11962121982011993091949415051.2742MSANS -2116CEZEROU PHILIPPE 11962 71983051992022529918968.4642CMICRO -8052PECH CHRISTIAN 11962 31986021993091839014314.4942MSANS -0931SALSIBURY ANNE MARIE 21962 31982071981071326611018.0142MSANS -8826SAUCERRE ELODIE 21962 81986041985041288210743.9942CSANS -0716BEAU IRMGARD 21962 5198607198507 9085 8417.9142MANGL -1742VERSEAU MICHELINE 21962 71982111981111527112373.3542MALLEM -8835EXPERT FRANCOISE 21962 11983041982041608112917.0042MALLEM -4580TIGNES GHISLAINE 21962 619921019920711389 9851.6442MINFOR -7561SCIEZ MICHEL 11963 71991111990111467711986.1942MANGL -4437OEILLETS JEAN FRANCOIS 11963 619930219920210024 8999.8142CTECHN -9877LIEUDIT RICHARD 11963 51984101993071527112374.6742MSANS -9511KERNEVEL VINCENT 11963 91985051995101450311831.2142MALLEM -7509TARN ERIC 11963 619890219930110407 9271.8242MANGL -1089BERE CHRISTOPHE ALEXANDRE11963 51985071992011288210745.8442CSANS -7426MONTIGNY CHANTAL 21964 11985021984021527112373.3742MSANS -6738BLOC FRANCOIS 11964 61989071993071381911365.6242MANGL -4323RIAS CHRISTIAN PAUL 11964 91985091990111949415051.8942MALLEM -1244CAMBEIRON JEAN RICHARD 11964 41985051993011693613498.3742MSANS -5905CHISSEAUX HUGUES 11964 119910719920710024 8998.6442MSANS -5258LAMBROSCHINI OLIVIER MAURICE 11964121989051995082256617145.0642MSANS -1452IMAM CHRISTIAN 11964 51993111993011723313653.5142CSANS -6093DEVAUX FARID 11964 91988061994011249910473.0242CSANS -3662MIDI JEAN MICHEL 11964 71985021992091616712994.0842MANGL -6965PENNE ERIC 11964 619850419840410791 9503.7242MSANS -0024FLEURS VALERIE 21965 81986101992121450311832.2042CSANS -3927PARC CORINNE 21965 81993111992011202810240.9542MALLEM -9121NAUSSANNES JEAN FRANCIS 11965 81988051992071616712994.4542MANGL -6670GENIE PIERRE 11965101994051993051420611638.9242MESP -9153DESMOULINS PATRICE 11965 11989111994092401918074.6042MSANS -2680CHOUETTES JEAN LOUIS 11965 519891219921211302 9776.1742CANGL -5006ESPERANCE CORINNE 21966 619940919930411389 9852.3842MCOMPT -9852ADOUE DIDIER 1196611199401199301 7590 7564.3542CSANS -4760MURAT CHRISTOPHE BERNARD 11966 81991041992061381911365.1342MALLEM -4744LESCAR ERIC CLAUDE 11966 31989021988021450311830.8542MSANS -9188HULOT MAURICE 11966 11990021991101249910472.7942MANGL -3718SOU ANDRE 11966111991111994011249910472.9642MANGL -1189GROSSO XAVIER 11966111995081994081868714506.1342CSANS -7659METRA MARYSE 21966 91989051988051450311832.4142MALLEM -1281CRIPE GISELE 21966 91987021986021527112374.7042MSANS -7796AMIRAL ELIANE 21966 21994011992011202810239.9642CSANS -6977NOHANT MONIQUE 21966 91986061990111949415051.2242MSANS -7731VERGERS MARIE GENEVIEVE 21966 219941219930411389 9851.6442CSANS -4652LAFAYETTE MICHELINE 21967 31987061988031450311831.8742MSANS -7993CHILPERIC BRIGITTE 21967 619940519920111389 9851.0742CTECHN -2195VELASQUEZ DENISE 219671219940519920111389 9852.2042MSANS -5536TIFFANY CATHERINE 21967 81988051987051450311832.2042MSANS -9529CLAIREFONTAINE CLAUDINE 21967 81991081992061267210588.8542MSANS -1639VILLENEUVE GUY 11967 41994101993041202810241.8542CANGL -1238BOURBESNEUR DIDIER 11967 41991091990092611219510.6742CSANS -9384CORALLINES PATRICK 11967 31990011993031249910471.9242CSANS -4464PICHI PIERRE 11967 2199507199407 7464 7525.8642CANGL -6931VOL MICHEL 11967 61994051993041360611211.0642CANGL -0488DOREE DOMINIQUE 21967 21991111990111723313653.8442MSANS -0529RELUYEN JOELLE 21967101987101988051467711986.0142MSANS -9178PART CHRISTIAN 11967101993061993091267210588.8942CANGL -8565KENNEDY JOCELYNE 21968 11991011990011381911366.3442CSANS -2088ROUSSEL LILIANE 21968 719930819920811389 9850.8342CSANS -6684BRUN CHRISTIAN 11968 11987051992091839014313.2142CANGL -7111VENIZY JACQUES 11968 519940319930310363 9232.9842MANGL -9217POUTIS ALAIN 11968 21989041995071249910473.5942DMICRO -4714MARINA FREDERIQUE 21968 21988121992011249910471.8942MSANS -8715AULDE BRIGITTE 21968 71994051992011202810240.9142CSANS -9713ESCUDIER PIERRE 11968 61988121993041467711986.5342MTECHN -6341SELLEBIED MICHEL 11968 81988011994011249910473.4242MSANS -8663JASSERON ANDRE 11968 21995081994081450311832.7242CESP -5734ODENAS SYLVIE 21969 81991041990041381911366.0742CESP -2288CENSIER MARTINE DANIELLE 21969 4199408199308 8359 7952.9642CINFOR -4540PERS RENE 11969 71991111990111949415051.9742MANGL -5166VERAN BRUNO 11969 319930719920711389 9852.3642CINFOR -3740CLOSEAUX PHILIPPE 11969 6199312199212 9597 8729.9742CESP -5076BELLONTE JOSIANE 2196910199312199212 7590 7562.4942.SANS -6280MAGENTA LAURENCE ANNE 219691019930519920511389 9852.2442MSANS -4916MONTMERLE NELLY 21969121991101992061330611017.1642MESP -1013SEILLAN MIREILLE 21970101994021993021360611211.0942CALLEM -3949GRUN PATRICK 11970 41993111992111330611017.1942MANGL -0280RICHELIEU ROLAND 11970121991111992061202810241.0942MSANS -7899FRERES CHRISTIANE 21970 71994031992011202810239.8342MESP -5404VIARMES ROBERT 11970 41993051994011202810240.0842MINFOR -6508CALEU FREDERIC 11970101992111991111420611637.7842CSANS -6706VILLEMER GERARD YVES 11970 91992051991051202810240.0142CSANS -9352WAUTHIER CHRISTIANE 21970 919921019911010668 9426.2742MSANS -7483ARAGO REGINE 21970 11993061992101420611637.1242CTECHN -8430BRUEYS ROSELYNE 21970 5199302199202 8359 7952.7942MSANS -2207CAMBEFERRIS MARIE ODILE 21970 919940719930411389 9852.0642MANGL -7014CATHERINE ANNE MARIE 21970 519930519920511389 9851.3442CSANS -2499MONTALEMBERT FRANCOISE 219701119921219911211389 9852.4742MANGL -0607CORBERES ISABELLE REGINE 2197011199511199411 9894 8922.7742MSANS -8631MOUSTERIAN MICHEL 11970 519940619930511389 9852.7242CVENTE -4299PAIX MICHEL 11970 31994011993011420611637.1142MSANS -1722ALBERT GEORGES 11970 71990061992091202810240.8242MSANS -7839LORRAINE DANIEL 11970 81993121992121420611639.2242MTECHN -2390VENISE JEROME 11970 6199406199306 9597 8728.5342CSANS -4622BOUTON SERGE 11970 71992111991111420611638.5042MALLEM -8468MONTALEIGNE FRANCK 11970 61993031992031420611637.8042CSANS -4926LEZARDIERE JEAN CHRISTIAN 11970 819930119920111389 9852.3842MSANS -0318MISSIONNAI FRANCOIS 11970101994021993021420611639.2442MSANS -2478CENAC ANNE MARIE 21971 11992071991071420611637.4442MESP -9531FLEURIES PATRICIA ODILE 21971 6199612199512 9894 8921.9442CSANS -2370ARTOIS MARIE MADELEINE 21971 919930219920211389 9851.2442CSANS -9824CLAOU JANINE 219711019941019931010668 9425.7342CANGL -0436BUISSON JOELLE 21971 519950119940110668 9426.4142CSANS -6968RABELAIS CHANTAL 21971 619951219940110668 9426.3242CSANS -6232CASE CHRISTIANE 21971 61994051993051267210588.8542MANGL -5473GERANIUMS JEAN 11971 11990051994011249910472.9242CSANS -1033ISLE JEAN PIERRE 11971 51992081994011249910473.6342CTECHN -6691MONTAGN PIERRE 11971 91991091994011249910472.5942CSANS -3613TRONGET FREDERIC 11971 219940419940110363 9232.4642MSANS -5033GENELLES PASCAL 11971 81991121993061330611018.0142CSANS -5241KENNEDY PHILIPPE ANDRE 11971 219930619920611389 9850.5642CSANS -2276MESANGES JEAN PIERRE 11971 11991081991091202810241.0342MCOMPT -4273HOLLYWOOD THOMAS 11971 41993021992021420611639.1042MANGL -9172PITCHOUM JEAN CLAUDE 11971 119921019930410876 9502.9942CSANS -2512GACHE JEAN CLAUDE 11971 81994091994011202810240.6442CSANS -4896CHILHAC GUY 11971 219930119920111389 9850.7642CANGL -3539MAS JEAN FRANCOIS 11971101992071991071420611637.6042CSANS -4359GAULLE LOIC 11971 419930219920211389 9852.0542CSANS -0794SOCLATE ALAIN 11972101994051993041360611211.0542CSANS -6685CONSOLAT JEAN PAUL 1197211199503199304 9597 8729.5842CSANS -3658BACON STEPHEN 119721119930219920210363 9231.8642MSANS -5829RAINIER YVES HENRI 119721219930119920110363 9231.9642MTECHN -5038ROSE JOCELYN 11972 41994011993011420611638.5042CTECHN -1479NOEL JEAN PIERRE 11972 219931119921111389 9850.8342CSANS -3997RICARD SYLVAIN 11972 61992051991051420611637.5642CANGL -6600LOUP KAZUKO 21972 519931019920811389 9852.2042CSANS -9876VOUZON CHRISTINE 21972 11993101992101723313654.7242CINFOR -2373RAPAILLOU THIERRY 11972101992121994011202810240.0542CSANS -1153RIBERA FRANCOIS 11972 3199406199306 7590 7563.9942CANGL -0976AIR FREDERIC 119721119940219930211389 9850.6242MSANS -1075COLOMBIER JACK 11972 6199401199301 7590 7562.5442CINFOR -3036SOISSONS THIERRY 11972 71992021991091420611637.7442CSANS -7541HIER MONIQUE 21972 11993101994111288210743.9942CSANS -8819RHIN JOSIANNE 2197212199407199307 7803 7679.9442CANGL -4699LENTISQUES FLORENCE 21972 6199501199401 9894 8923.2942CSANS -5011CIGOGNES MARIE FRANCOISE 21972 3199605199505 7803 7681.0242CSANS -7216FARRERE CHRISTIANE 2197212199408199308 8359 7953.2942CSANS -9971SALVADOR REMY 119731219951219941210668 9425.9942CSANS -6878BIGUET YVES 119731219940219930210668 9425.5842CANGL -9980LACHAMP CHANTAL 2197312199306199206 8359 7953.7242MSANS -3279ROITELET CHRISTINE 21973 819941219930411389 9851.8742CESP -9903PROVENCE VINCIANNE 21973 2199411199311 8359 7953.6342CVENTE -6941MAT SYLVIE 21973 919930719920711389 9850.7042CMARKT -2424PLAINE ELIZABETH 21973 419950419940110668 9427.4942MANGL -4221SOLOGNE ERIC 11973 619940619930610668 9427.2442CTECHN -8519ERABLES DANIELLE 21973 419931019921011389 9852.6742MANGL -7323SAUME ISABELLE ANNE 21973 919950319940310668 9426.6242CANGL -2143CUQUES HELENE 21973 6199612199512 9894 8922.0042MESP -5163SOULELHAT CORINNE THERESE 21973 9199407199307 8359 7953.0642CANGL -9032PETILLAT PIERRE 11973 41992091994011249910471.7442CSANS -9059DARONNE JACQUES 11973 419940619930610668 9426.4142CANGL -6626DEVESSOUS JEAN CHARLES 11973 91994071993071206910241.5842CSANS -7108BUISSONNETS HENRI 11973 419930419920711389 9851.6142CSANS -0443FONTAINE YAN 11973 9199406199306 7464 7524.2142CESP -3078CHARBONNIERE JEAN PIERRE 119741019931019920711389 9852.2942CSANS -5301REYNAL JEAN LUC 11974 6199401199212 9597 8729.6742MINFOR -7425RAFFAELLI PHILIPPE 11974 319940719940111389 9851.8842MINFOR -9638SYLPHES PAUL 1197410199407199307 9894 8922.5742CMICRO -9287ROSSAYS MARIE CHRISTINE 219741019960419950411389 9851.3443MANGL -9554PILGRIMS JEAN PIERRE 11974 219931219921111389 9852.0242MSANS -0960BOCAGE JACQUES 11974121993091994011202810240.9442CSANS -7246PEYRIERE MARIE CARMEN 21974 419940719930710668 9426.2242CANGL -3039COMBRAY MARC 11975 4199607199507 7803 7680.7542CSANS -5779SAENS ANNIE 2197510199608199508 7803 7680.8942CANGL -8044FERRY ROSINE 21975 9199507199407 7803 7679.8742CCOMPT -0191KER MARIE HELENE 21975 3199611199511 9256 8533.0242MSANS -6974MANCINI JEANNINE 2197511199408199308 7803 7679.7642CANGL -0518VICTOIRE PATRICIA 21975 3199608199508 7803 7680.8042CSANS -1262TRAUD JACQUES 11975 819940519930510668 9425.9642CMARKT -7772MOZART SOLANGE THERESE 2197610199608199508 7803 7679.4142CALLEM -9670GRESSETS LAUREEN 21977 8199607199507 7803 7681.0442CSANS -8996ADRET CELINE 21977 3199608199508 7803 7680.6242CANGL -3676MENEZ MARC MAXIMILIEN 11933 91966071994011932314935.3843MALLEM -9549BOURGOGNE ANNICK 21936 41968051991102137316331.4643MSANS -9677BROQUERIE CLAUDY 219381219780719910611131 9658.3743VSANS -4456LAC PATRICIA 21938 81962041985062470018542.2243MANGL -6693FENELON VALERIE 21939 61959121986012273717261.0743MTECHN -0887NASTRINGUES BERNARD 11939 81962091992032137316331.2443MESP -7338AMBROISE RENE 11940 91968041995011557012566.9943MSANS -0858TURNEGOUET DIDIER 11942 71982011993011249910473.0043MSANS -8537VERT PATRICK 11942 61976121993011578112722.9343MSANS -3521HOUEL PATRICK 11942111970091995011557012568.2243MSANS -2105ROCAL JEANINE 21944 51970071991071578112723.3343MANGL -6696PLAIDEURS JEAN PIERRE 11945 91972121990011403411520.4243MANGL -1309BELLE MARIE MARTINE 21945 31965011988042470018541.9743MSANS -9127PENFOULIC EMMANUEL 11946 5198901198801 9894 8921.9943MESP -2831CHAMAS MIREILLE 21947 21969031993031834514274.8443MINFOR -1888BONJOUR GUY 11947 91980101993101471512024.6243MANGL -1642POURTEL FRANCOISE 21948121974111994041471512026.1543MANGL -5118QUINTANA NADINE 21948 6199406199304 9126 8457.3343MSANS -7220LANDON JACQUELINE 21948 91970071994092529918967.9843CSANS -5846ROI PATRICIA 21948 11971051991102043315669.5743MINFOR -6443JUIN DAVID 11948 11975061991012137316331.7043MSANS -1072BELLY THIERRY 11949 91979041992011249910472.6143MANGL -3513GAMA VALERIA 21949121969021990071578112722.3343MANGL -8936MARGUERITE MICHELE 21951 41973021993012017815516.0843MSANS -9731GILLES NICOLE 21951 319961119951110668 9426.2743MSANS -3374ROBESPIERRE CORINE 21952121973021991012781920675.1943MSANS -9500EDELWEISS GERARD 11952 21978011992111684813422.4443MANGL -9602PARADOU MICHELE 21952 51975051981091684813422.6843MSANS -4313BERNEDE AGNES 21954111975041991071578112723.7243MANGL -9347LAUZES MICHELE FRANCOISE 21956 91978061992051471512025.7043MANGL -9922BELLA MARIE THERESE 21956 61982041981041326611018.1043MINFOR -9508ROBERT PATRICIA 21957121979071994121911114778.0643MSANS -9342GALLERANDS PAULETTE 21957 419950219930411389 9850.7043MTECHN -8765ELANCOURT BERNARD 11957 71980081993061369311286.1743MSANS -8497RIBOT JOELLE JACQUELINE 21957 21977071992121527112373.0443MSANS -6373RENE CLAUDINE 21958121978041992021471512024.3543MANGL -1513FRANLAINE BLANDINE 21958 91984101985041527112373.9543MSANS -1684CHALEIL MICHELINE 21958 31978061993101471512025.3243MANGL -2983LAVIE JACQUES 11959111988031994011249910471.9743LALLEM -3412CORTIJO AGNES 21959 31983011982011608112915.7843MSANS -4467VADEL JEAN MARIE 11959 51991041994011202810241.3943MSANS -9453CAVILLON MAURICE 11960 61985111992071288210744.4643MALLEM -7623MALESHERBES BRUNO 11961 81984081991061326611016.7443MTECHN -1600BLANCHES MARIE CHARLOTTE 21961121990031993061249910472.0143MALLEM -7714POMMIERS VALERIE 21962 41993081992011249910471.6143MESP -7193CAMBARRAS PHILIPPE 119621119930119920110876 9503.2743MALLEM -0639TANQUEUX FREDERIQUE 21962 61982081989112090215980.8243CSANS -8276LACROIX DIDIER 11962 61991101993041467711986.8943MSANS -5057CINO GERARD 11963 61983111995091693613498.3143MINFOR -0238SARRAZINE MARC 11963 619941119931010363 9233.5743MSANS -7129NIVERT THIERRY MICHEL 11963 519910419940111302 9775.7943MSANS -8602PYRENEES DANIELLE 21964121993091992011202810240.5943DESP -6662PUERTO SYLVIE 21964121985101984101249910473.5643MSANS -7625SCHWEITZER LAURENCE 21964111991091990091202810240.4643DANGL -7052CARREAUX SYLVIE 21964 61985021984021288210744.6743MALLEM -9218SALIS ARMELLE 21965 3198801198601 8656 8146.6143.SANS -3260JABLINES JEAN JACQUES 11965 41990091995092256617145.3043MSANS -9721LAVOIR YVES 11965 619930119921011389 9852.1443DALLEM -3429CAM BERNARD 11965 61987021993051839014313.5743MSANS -1856FLAUBERT PASCAL 11965101985061994111693613498.5543MSANS -0790JARDIN SERGE 11966101987091992101539912453.0643MSANS -2445VIESCAMPS YANNICK 11966 11991111991101381911365.5343MSANS -5684SARRASIN PATRICK 11966 51994101993101267210589.3943CSANS -4794DIAZ PHILIPPE PIERRE 11966 21987111993111693613499.4543MSANS -5479THIREUIL GILLES 11966 31992041992011202810241.0343CSANS -6199HELEN MARTIAL 11967 91987081995011373711326.7043MSANS -9298FOUQUET RAYMOND 11967 419960619950611389 9852.2943DINFOR -7535COURTELINE PHILIPPE 11967 11991021994011249910471.6143MTECHN -4595PANSEROT JEAN JACQUES 11967121989091989061539912452.5143MINFOR -4584SANGUI PHILIPPE 11968 219950119950110363 9231.9543MSANS -1356BERTIN MARYVONNE 21968 41993061992061267210589.6943MMICRO -3761GARD HENRI 11968101989071993091723313654.6543MSANS -6649GUILLAUMET LAURENCE 21968 71994021992011202810240.3543CSANS -2548LYCEE ALAIN 11968 51993121994011202810240.1743CSANS -0307ABBAYE ANNICK 21968 919920919910911389 9850.7443MSANS -0524PEYRILLES YOLANDE 21969 119940719930411389 9852.5943MSANS -3086FABRE JEAN YVES 11969 71989121994041249910473.2443MSANS -2273BREUIL SERGE 11970 719891119920811302 9774.3843MALLEM -5532NIRVANA FRANCIS 11970 419920219920810876 9502.1443MTECHN -0282TOURISSE BERNARD 11970 41994081993081360611211.4743CANGL -8554BOUVIER OLIVIER 11970 81993061992061267210590.5443CANGL -3126PONTAROUX JOCELYNE 21970 619930619930411389 9851.1943MSANS -0208ENCLOS DIDIER 11970 219941019950110363 9233.5443CSANS -5629VENEUX JEAN 11970 319930919920911389 9851.7443CINFOR -9569CASCADES MARYVONNE 21970 91991101990101202810239.7843CSANS -4663DAUBERIE DOMINIQUE 21970 919941019930411389 9851.1543MSANS -3912FOURNAS MARIE 21970 119930819920711389 9850.8343CTECHN -2317CALDANA ODILE 219711019940519920111389 9850.7943MANGL -4841MARIDOR CLAUDIA 21971 4198907199101 8656 8146.1643.SANS -3038FERRARI FRANCOISE 21971 2199206199106 7803 7681.2543.ANGL -3547KERA MICHEL 11971101994101993101360611209.9243CSANS -8801ORRES JEAN JACQUES 11972 91994061993061420611638.1043CINFOR -8995CRUCITA PHILIPPE 11972 11993041994011249910472.5743CINFOR -1636NORVIL BERNARD 119721119930919920911389 9850.9243CSANS -7758AURES JACK 11972 5199309199209 9597 8728.6443CSANS -9063SATIE OLIVIER 11972111994061993061420611639.0643CSANS -9116BREVIAIRES LAURENCE 21972 119930419920411389 9852.3343CINFOR -3743SORALY ALAIN 11972 4199407199307 9126 8455.8443CANGL -9641ASTARAC CATHERINE MONIQUE 219721019940619920111389 9851.6943CALLEM -1350RAMBUTEAU RENEE 21972 61993091992091360611209.6543CSANS -0615ROBERT REMI 11973 51994011993071267210589.9343CTECHN -2872KERPETIT ALAIN 11973121994041993041420611637.8043CSANS -9594BENEDICTINES JACQUES 119731219931119921111389 9851.1543LSANS -5147TERRESROUGES DIDIER 119731119930319930311389 9852.2443CSANS -3464CASTERAN EVELYNE 21973 519950219940210668 9426.1843MSANS -1330INFERIEUR CHRISTIAN 1197411199607199507 7803 7680.0543CSANS -0129DEGANNE WILLIAM 11974 91994071993071206910241.9743CMARKT -9626STENDHAL CLAUDE 11974 51994081994121202810240.0543CSANS -8520COUPERIN JEAN 119741119940519930510668 9425.5843CSANS -7404PERGOLESE RICHARD 11974 31994051993041360611211.5143CANGL -2352ECLUSE BEATRICE 2197411199608199508 7803 7680.6243CCOMPT -6779PERRONET PASCAL 11974 91994061993061360611210.9143CANGL -9456REVOIRS MARC 1197512199507199407 7803 7680.9943CINFOR -9467CONCORDE CLAUDE 11975 919941019931010668 9427.4443CSANS -7348GENOUILLY FREDERIQUE 21975 7199407199307 7803 7680.4443CANGL -8390CEILA DOMINIQUE 11975 9199409199309 9894 8922.7243CSANS -3308BOULANGER RENE 11975 6199410199310 9894 8922.0043CALLEM -8061DENFERT VALERIE FRANCOISE 21975 11995041994041206910241.1243MSANS -9867ROCHOPT MARIE PIERRE 21976 8199609199509 7803 7680.2343CCOMPT -0466MIMOSAS CHRISTIAN 11976 1199408199308 7803 7679.3143CSANS -6069BATIGNOLLES MARTINE 2197710199608199508 7803 7679.2843CSANS -7049CRENON DANIEL 11947 81973041994011621213032.3044MSANS -1304PERI VERONIQUE 2194912199310199210 9597 8729.0944MSANS -3258DARMONT VERONIQUE 21961 21986061992021168610047.0344MSANS -1840COQUART LUCILE 21964 41984101993051381911365.0544MANGL -2897PERCHE ALAIN 11967101990061995011318010939.1344LSANS -6181BIZET MIYUKI 21968 2199302199202 9597 8727.9944MSANS -6750EDGAR HERVE 11971 21992011991011202810240.5844LSANS -0175MARQUIS COLETTE 21974 5199606199506 7803 7680.2744CSANS -1275FRIGOULET YVES 1197410199506199406 9894 8921.6944CSANS -8305BEZENAC FRANCOISE 21953 2199404199304 9126 8455.7045MSANS -4858DUPLEIX MARC RENE 11954111978121982102470018541.8845MANGL -6314ABERDEN EVELYNE 21958 61979111978111684813423.0845MSANS -0464PETIGNONS DOMINIQUE 11961 91984061993031527112374.9745MSANS -3847GUICHARD PHILIPPE 11961 11983081988112090215980.9745MTECHN -8173HOPITAL ANSENIA 21964 319950419940110668 9425.3645MSANS -4339VILLE DOMINIQUE 11971 91994111993111267210589.1245CSANS -1142SPITALIERI FREDERIC 11933111953121993014121428007.2246MALLEM -6086SOEUR JEAN JACQUES 11935 91955061991053417325097.9646MSANS -0246OREE PATRICK 11937 71965101986012470018541.1946MANGL -7398MOUNET CLAUDE 11937 919960119950510024 8999.3946MSANS -2438VISITATION CLAUDE 11938 31964111986012470018542.2446MSANS -3413ETIENNE JEAN MARIE 11940121969051986072470018541.1146MSANS -9044GUEN PAUL 11941 11973051993011518612335.2846MINFOR -4544MONEGLIA ABDELKAD 11941121965101989072947921838.8046MINFOR -5661BELLON PHILIPPE 11943 91965111994013200223584.4346MSANS -4296VENDARGUES YVES 11943 31964111991012273717260.1446MSANS -2281TRIMARAN OLIVIER 11944 81973051990011403411521.4646MINFOR -9015IRIS YVES 11945121973011990011403411522.1346MESP -7856BELLEVILLE GERARD 11946 31965101986012470018540.2946MSANS -9041SADI PIERRE 11946 61977121995062000715437.9146CINFOR -2976BLANQUI GIANCARLO 11946 51968091986072273717261.9446DSANS -4370GROUPE PHILIPPE 11947 21974071990011403411522.0946MTECHN -7697SEYSSINS BERNARD 11948 51968071991012470018541.8646MALLEM -9305SEINE GUY 11949 91970041987012273717259.9046MANGL -5926BOILEAU BERNARD 11951 61972051989012273717261.9046MALLEM -3592PETIT GILLES 11951101974011995032547019085.7046MANGL -7590PLAYA JEAN YVES 11954101977091982102470018541.4746MSANS -8144DARIE JEAN PIERRE 11954 21995011994011420611638.9246MSANS -8637GUILDFORD PHILIPPE 11955 21974061995082547019085.8646MINFOR -7809CEYRESTE FRANCIS 11955 31975021993081608112916.2546MSANS -9226MONDONVILLE MICHEL 11956 51979011992011471512025.1146MTECHN -8675BLANCHISSEURS ANNIE 21958 11979071993041471512024.3346MSANS -0338BARBUSSE ROSELYNE 21958 1198902199209 9597 8729.2546MSANS -4849SANZILLON MARIE NOELLE 21958 81979101978101288210743.8346MSANS -7791PRA BRIGITTE 21958 81981041980041684813422.0846MSANS -3255LENOTRE BERTRAND MARIE 11959 81980111991012022115555.6246MESP -3148EOLIENNE GUILLAUME 11959 11983031991011868714507.9446MSANS -1942CAUSSES MICHEL 11960121987081991061288210745.4746MSANS -8983RAYMOND JEAN LOUIS 11961 11985031991011868714506.7246MSANS -5296BRETAGNE PHILIPPE 11961 41983081991011868714507.7246MSANS -0323QUONIAM GILLES 11961121983051993091450311831.5746MSANS -3231MOULIN HUGUES MARIE 11961111985091995011373711328.2246CSANS -9926PIN PATRICIA 21962 41984051983051288210745.7546MSANS -0400HARAS PHILIPPE 1196312199407199411 9597 8728.1746MANGL -8313ROUILLAC BERNARD 11964 31991021991022529918968.4746MSANS -1947CORNEILLE DOMINIQUE 11965111987021994091693613499.4346MANGL -1364KERSAUX JACQUES 11965 41987091986092090215981.4746CANGL -4571CAILLOU ERIC 11965 91985041992071616712995.9946CSANS -5043BAC MONIQUE 21965 61988081987081539912452.4646CSANS -5037CALLE PHILIPPE ROGER 11966 81994091993091839014312.4546LSANS -3072PONTHION ALAIN 11966 21990091989091467711987.1346MANGL -3441ARMAINVILLIERS YANNICK 11966 11987021994091693613498.8546MANGL -2298PLESSIER ANNE MARIE 21967 2199004199111 8656 8146.6146.ANGL -3281ALBAN ELIANE 21967 21986111992011288210744.0846MSANS -1984ROCH GERARD 11968111992031992041467711986.7246MSANS -6981TROQUEREAU JEAN JACQUES 11968 91992081991081467711986.2646MALLEM -4384LAMORLAYE MICHELE 21968 31993121992011202810240.1746MSANS -4391JUGE BERTRAND 11969101992091993072397418036.9346MSANS -4122CAULAINCOURT YVES 11969101988081987081539912452.1646MINFOR -5356LACAPELLE ALAIN 119691119930419920411389 9852.0246MTECHN -8278CHANTEMERLE GERARD 11969 919920619940710876 9503.4546MSANS -2596DESSUS GUILLAUME 11969 11991091990091467711986.4946MSANS -7596MEYERBEER EDOUARD 11970 11992111992111330611018.1046CMARKT -5724HOCQUETTES AUDE 21971 31991071990071467711986.3146MSANS -1372AUBEPINS CHRISTIAN 11971 21994101993101360611209.8846MALLEM -8783BAUDOIN JEAN FRANCOIS 11971121993081994011202810240.4146CSANS -3416MIREFLEURS NORIKO 21972121994021993021360611211.5646MCOMPT -0948TIERRAINE MARC CAMILLE 11972 319930719920711389 9851.5946MTECHN -0904FOUGERES JEAN MARIE 11972 919920119920311389 9850.8946CTECHN -4010QUARTRAVEL CATHERINE 2197211199501199401 9894 8921.7246MSANS -1528FARMINGTON RENEE 21973 119940419940111389 9851.0346MSANS -8402TREZEE GILLES 11973 919930719920711389 9850.8846CSANS -7279CORNE GUY 11973 71994011993011360611210.3746CSANS -0232PIN JEAN CLAUDE 11973 519960619940110668 9425.4546CTECHN -9635MAGALI CHRISTIAN 11974 4199607199507 8656 8147.2246CALLEM -7035ANGLAS LUCIENNE 21932 21963011988102273717260.1448VSANS -7818HERZOG DOMINIQUE 21937121972101993041557012567.0848DSANS -6478MAREYE JEAN PHILIPPE 11940 21959101983102273717260.8048MSANS -1661VAN EDITH 21940 81974091990012137316330.9748MSANS -1597MATRAT CATHERINE 21940 61967071992121834514275.5948MTECHN -1046MAUNY JEAN CHRISTOPHE 11941 81979021994011471512025.4748MSANS -8249FILLES MICHEL 11942 51962081993093417325097.1948MSANS -0711PICCINI JEAN JACQUES 11943 81963041995072470018542.0048MSANS -0378HALLIERS JEAN PHILIPPE 11943 3199501199401 9597 8729.3648CALLEM -9597VOLTE MARIE THERESE 21946 71968041990012273717260.9448MCOMPT -4768PICAUD BRIGITTE 21947101973101995102043315670.9248DSANS -0554ROLAND ANNE 219471019920719910710024 8998.7748DSANS -3349SERRE PIERRE MARC 11948 61969021991012470018542.1048MALLEM -3355KURFURSTEN PAULE MARIE ODILE 21948 7199501199301 8656 8145.6648MSANS -6449IRUENA DOMINIQUE 11949 71969031990051932314934.2748MESP -3922LAVERSINE YVES 11949 81975101986103634926571.4148CSANS -7286JOUVENET HENRI 11951121981021994011621213032.6548MANGL -2199CABOTS CHRISTIAN 11953121988121995011373711326.7148MINFOR -8300CHARPENTIER CHANTAL 21955 61992011993041249910472.4148MSANS -2397FAMILIAL JANY 11955 61982101994041471512024.3348MANGL -9021BIED CLAUDE 11957 51980061992111911114779.6848MSANS -4703COZ JEAN 11957 41979081993121911114779.7748MSANS -3297STALINGRAD BERTRAND 11959 31981081992102090215980.9748MANGL -2319FRANCOEUR HENRI FELIX 11959 11980081993121804514081.0148MSANS -8833MONTLHERY ELIANE 21960111983041989041527112373.6848MANGL -1084MAGNARD JEAN PIERRE 11960 91984021992012022115556.0248MSANS -4562HAUTE ANNIE 21961 61984061983061249910472.8748MTECHN -4907FRANC BERTRAND 11964 21984081986072090215980.5648CSANS -2492ETANG PASCAL VINCENT 11968121990111989111467711986.6248MANGL -3754RAOUL FRANCOISE 21968 91994031993091450311831.8448MTECHN -7902CELARD BERNARD 11969 31990041989041467711987.9048MANGL -0316FLORENTIN TYRONE 11969111989081989021450311832.4148MANGL -1981DEPARTEMENTALE PIERRE 11970111993041992041420611639.0148CSANS -4735BEL SKEVOS 11970 61991021994011249910473.5448MSANS -0999CONNE DENIS 11971101993041992041420611638.8848CSANS -3832BEACH SERGE 11973 41994121994011202810241.1248MTECHN -4697PURPAN FRANCK 11935 51976041994011578112723.1550MTECHN -1565NEMOURS ANDRE BERTIN 11939101967071990091932314934.3150MANGL -8977MAHATMA HERVE 11942 41981051994011621213032.0650MANGL -8738ZILINA JEAN LOUIS 11942101980061990031249910473.4750MTECHN -6415ECUREUILS ERIC WILLIAM 11942 61969081994011932314934.7050MSANS -9332FRIRION GEORGES 11945 5199409199309 9597 8729.4950MSANS -5001YVES PHILIPPE 11945 41975111988071578112722.8750MSANS -2290ENSOLEIADO JEAN MICHEL 11946 21988051994011288210745.5250MSANS -8492LAGRIVE LAURENT 11947 81982011993011369311287.2950MANGL -3609GUESDE ERIC 11949 11989061992031249910472.1950MSANS -8482TOUT ANDRE 11949 71980041995011621213034.2250MANGL -8866PERCENEIGE PASCAL 11950 41976071995011578112723.7450MSANS -3195VIVE CLAUDE 11950 21981081995011621213032.2050MSANS -2538AICARD SABINE 21954121976061993031608112915.5150MTECHN -5185LUTHEZIEU PATRICK 11955 51988021994011288210744.2650MANGL -3135EDER DIDIER 11957 819880119930310791 9502.9150MTECHN -9006MAURETTES JACQUES 11958 11985041993011369311286.6950MINFOR -8049COLLIERES CHANTAL 21961 11984031983031288210745.2250MTECHN -8766TERROIR GILLES 11963101987121989091450311832.4150CALLEM -2924LAC BRUNO 11963121989051988052090215981.1450MSANS -5549DUMONT MICHEL 11964 51988051991081450311832.4250MALLEM -8382MONSEIGNEUR CHRISTIAN 11964111992011994011249910471.8950MSANS -8129STATION BRUNO 11966 41994051993051202810239.8750MANGL -3420EMERIAU JOSE 1196711199306199206 9597 8729.8450MANGL -9831CLAMOUR YVES 11967 819950919940910668 9427.4950MANGL -9072MENDON GUY 11968 1199605199505 8656 8146.8850MSANS -4669FAURE ERIC 11968 3199505199405 9126 8455.8850CTECHN -4319MOURISCOT PATRICK 11970 9199306199206 9597 8729.2750LSANS -1731FRANKLIN MICHEL 11970 4199401199301 9597 8729.4050CSANS -0510PILOT DANIEL 11972 519961219951211389 9851.5250CSANS -5973LECLERC MAURICE 11974 3199606199506 8656 8146.3750CSANS -9358MONBEL HENRI 11933 91959031993011557012567.1251MVENTE -7641BRETONNE CHANTAL 21936 51962081990012273717260.9451CSANS -7048CASTELNAU LAURENCE 21937 91962031991042273717259.7851CMICRO -5481PASCAL GILLES EMILE 11937101958051979013327724476.1651MSANS -6723SARRAZA FRANCOIS 11938 21962031989082572519240.3551MSANS -6355REPOS JEAN MARC 11938 41960011980013327724476.5251MSANS -1644ACARDIE BEATE 21939 31963091991072273717260.2251CTECHN -5030LOGELBACH ASTRIDE 21940 11962031991042137316332.4551MVENTE -5298GARDE MARIE FRANCE 21940 91969011989011621213034.1951MALLEM -6400SIONIE CATHERINE 21941 3196206196106 4894 6128.0051MTECHN -5537CAPEOU LUCE 21942 519931219920110024 8999.7951DINFOR -7143DEO NOBUKO 21942 41969091991102137316331.9751MSANS -9555CAMBRONNE DANIELE 21943111962051984122572519240.2851CSANS -3792EAUX JEAN 11944 81966031995072137316330.9751MSANS -6932PAULIN ISABELLE 21945 41972041989011621213033.2851MALLEM -1308CHRISTOL MARTINE 21945111968121993061834514274.8451MSANS -2877DANIELLE GERARD 11946111970051992011471512025.1151MSANS -5367ILE FRANCOISE 2194712199010198910 8656 8146.1451.SANS -3253VERG BIRGIT AGNES 21948101969071985042470018540.3951DANGL -5806FRED CATHERINE 21948 41968041990042572519239.8251MANGL -6174BANQUIER CATHERINE 21950111971061989011621213033.7051MSANS -8732FOUNSUT PIERRE ANDRE 11950 11978071995041249910472.1051MCOMPT -4803ALASSEUR AGNES 21950 71974051992091471512026.1051MSANS -9024CHATARDS CAROLINE SOPHIE 21951 31972081987052334017609.4651MALLEM -1259SOUFFLOT FRANCOISE 21952 81981011983091326611017.2551CSANS -7009PARADIS LUDWIKA 21952 71974011973011215710279.1951MSANS -9186LESPIAT EVELYNE 21952111973041990101578112722.1551MSANS -6834FLEMING JOCELYNE 21953 41973021993012017815517.2851MMARKT -5164BEAUVILLAGE COLETTE 21953 91986081985081684813421.4051MSANS -4947ESCALUS CHANTAL 21954 219810519800510024 8998.4151MSANS -8461MARGUERITES CATHERINE 21955111976061994051471512025.0151DSANS -5391FOURCAULT ANITA 21956 61978061992091471512024.4451MSANS -2777ALMUNECAR CHRISTINE 21958 41993071992011249910471.6251MINFOR -9747DROPT MONIQUE 21958 31979031993041471512024.0851MANGL -2758CRAYS KIM LEE TAMARA 21959 11992031991011202810240.1951MSANS -8238SERGENT ISABELLE 21959111983061982061326611016.0351CSANS -4402DIVISION SABINE 21959 71979101993071471512025.1651MALLEM -1231FACE HUBERT 11959 319950319940111389 9852.6751LTECHN -3907ESBLY GUNDA 21960 81980071979071288210745.3451MANGL -4821TAMEYE MERCEDES 21960 119820919810910668 9426.6651MANGL -1175CRESY CHRISTIANE 21961 21990111989111249910471.6651SSANS -6825FEUILLES DENISE 21961 51982051981051326611016.0651MANGL -5368FLANDRE SUZANNE 21962 71983111982111249910472.3351MANGL -0947LORRAINS CHRISTINE 21962101985041984041288210745.1651MALLEM -5318CLAMART ANNE 21962 51982081981081326611018.0051MSANS -8693FILLIETTE JEANNINE 21962 31982091981091194310201.7051MANGL -5069GRAVELLE ILSE BERTI 21962 81992061991011202810241.9051CSANS -5908VERTS CATHERINE MARIE 21962121984111983111608112915.9651MSANS -3068DUNKERQUE ELIANE 21962 31986101985101202810240.4051MSANS -5894CARESTIER MARYSE 21963 41985091984091288210745.1351MALLEM -1739HILARION LAURENCE 21963 61982091981091497412179.3651MSANS -8326MASSAY MARTINE 21963 41984091983091608112915.6951CANGL -6923GUYONNE NATHALIE 21963 81983101982101608112915.7551CVENTE -3533SAVIGNAC SERGE 11963 319890319880310407 9271.2351MSANS -9590GARIBALDI FLORENCE 21963 519940619920111389 9852.0051CANGL -5287HORIZONS MARIE ODILE 21963 21983021982021249910471.5651MSANS -9152PARRERE PHILIPPE ANDRE 11963 61992021991021381911366.2151CSANS -4730CROISETTE MARC 11963 61987111992012529918968.2051MANGL -7896LONGUE MARTINE 21964 91986041985041288210745.7251MSANS -0156CHTANOU YVES 11964 71993011992011839014314.0851MANGL -3013CELLIER REGINE SYLVIANE 21964 719870619860610668 9426.4151MANGL -1040HAUTI MARTINE 21964 11984101983101288210745.3951MINFOR -0730COURBET CHRISTINE 21964101984101983101202810241.7051MSANS -2393ROTONDE ELISABETH 21964 71984071983071202810241.8451MANGL -6940LELIEVRE RYOKO 21964 21985051984051527112373.2351CSANS -5571MARCEAUX ANDREE 21965 31993091992011202810240.2251MSANS -9937MANDARINE GHISLAINE 21965 11994031992011202810240.9151MANGL -6185HERMITTE FRANCOIS 11965 91990051989051949415051.5051CSANS -5405ARTZAMENDI MICHELE 21965 71989081988111949415050.6751MANGL -4260MIROMESNIL MARTINE 21965 71988031987031450311830.5351CSANS -9396BARBUSSE MICHELLE 21966 91986061993011839014313.0951MSANS -8592PLANTIERS MARTINE 21966 71994031993031267210589.5751CSANS -6905HAVRE PATRICK 11967 61988111987112090215981.2251MSANS -0499BEAUMARCHES JEAN PIERRE 11967111990021994051839014313.9551MSANS -9812PECHERIE FLORENCE 21967 219940419920111389 9852.2251CESP -6177RIQUET JANINE 21968 51994031993031267210589.6651CTECHN -1459FRANCE ANNE MARIE 21968 21988091993011381911366.4951CTECHN -9340EPINE RENAUD 11969 11994081993081206910239.8651MSANS -7293OBERKAMPF JEAN JACQUES 11969 81989041993041249910471.7051CCOMPT -0852GUERARD MARIE SOPHIE 2196911199308199208 9894 8923.1651MESP -8275DELZONS MICHELE 219691119930319920311389 9852.7251CALLEM -5873MARCHE MARIE LAURENCE CHRIS2197011199205199105 9597 8729.3051MSANS -8465BERNASSE ISABELLE 219701119920319910311389 9852.6551MANGL -2444BOUGNON MARIE JEANNE 21970 81993111992111267210590.7451CSANS -3440BAZOCHES MICHELE 21970111993101995041206910240.4151MSANS -2864GOAS SERGE 11970 51992101993081267210590.4151CESP -5499CLOHARS GERARD 11970 819900819890810024 8998.8451CSANS -6120MARVIVO EVELYNE 21971 519950219940210668 9426.5351MSANS -5419BEZANLEU CATHERINE 21971 51994031993031267210590.2951MTECHN -0309TUILERIE SOPHIE 21971 21994051993051267210590.6951CSANS -6131CAGNES NICOLE 21971 519940619930610668 9426.5351CCOMPT -8518VILLOUE JOELLE 21971 61992041993051267210590.0951CSANS -8453JONCHERE DOMINIQUE 11971 319940619920110024 8998.7651MSANS -5604NEUILLY AGNES 21972 119920419910410668 9425.8151MSANS -7047ALOUETTES MARIE ANDREE 21972 419920119910111389 9850.9451CSANS -5306BOPENIAN MONIQUE 219721019920919910911389 9851.9151MSANS -9169FLEURIS LILIANE 21972 71993121992121267210588.9251CANGL -8308BUZENVAL VERONIQUE THERESE 21972 5199607199507 7803 7679.4151CALLEM -1210NAUGAIRE MARIE ANTOINETTE 21973 61993081993091267210589.5252MSANS -5105HUGO CATHERINE 2197311199607199507 9894 8921.4651CANGL -3726LIVRYS BRIGITTE 21973121995071995051288210745.4751CSANS -5859MUZY PASCALE 21973 619930719920711389 9850.6151CVENTE -1436SAUVE DOMINIQUE 21973 61994101994121206910241.1351MSANS -2239CHALIGNY KYOKO 21973 31994091993091206910239.8651CSANS -0183LAURIERS PAULE 21974 81995111994121206910241.2551CSANS -9366PINET LAURENCE 21974 819940819930810668 9425.3651MESP -6833VIGNY EVELYNE 21974 51994081995121206910239.9952CVENTE -1571SEINE GUY 11974 3199609199509 7803 7680.8951CANGL -8078LAMARCK JOSIANE 21974 3199602199502 9894 8922.4151CTECHN -0018LOUVERSEY CATHERINE GINETTE 2197510199611199511 9894 8922.1451CSANS -7419VEROCE MICHELLE 21975 3199406199306 7803 7680.1451CSANS -8512ASSOMPTION CHRISTIANE 21975 3199608199508 7803 7680.5951CVENTE -6365EDENFLORE BRIGITTE 21975 1199308199208 7803 7681.4251.ALLEM -2274LOTUS ISABELLE 21975 7199612199512 9894 8923.1351CSANS -5674MAUBLANC NICOLE 21975 9199602199502 9894 8922.8051CSANS -0762GIORDAN ANNE MARIE 21975 1199607199507 9894 8921.3151MINFOR -0696PICAUD JEANNINE 21976 2199607199507 7464 7525.7451CSANS -6681MARCEL FRANCOISE 21976 3199608199508 7803 7680.6251CSANS -0740CHESNAIE PHILIPPE 11977 1199507199407 7803 7681.2551CINFOR -4654CANNES FRANCIS 11977 3199609199509 7803 7679.5851CANGL -7430MULLERON FRANCOIS 11978 5199607199507 7803 7680.8451CSANS -3935LISSAND ISABELLE 21978 4199607199507 7803 7680.6351CSANS -5586SCHUMAN NANCIE 21931111974111991071578112723.0552VSANS -1401RENAUDOT MARYSE 21933 51968071990071621213033.8152MSANS -1061AMBOISE DENIS 11934 11964041993011663613344.2752MSANS -9799GUILLEMETTE JEAN CLAUDE 11935 31955021991082470018540.7552MSANS -3145SABLES PHILIPPE 11936 11959021993073417325098.3651MANGL -3589FOURMONT PASCAL 11936 71959031982063327724477.0651MSANS -2996PAUL MARIE PIERRE 21936 51972121989011621213033.9152MSANS -2578PISY YVES 11938 71962111981102470018542.2252MSANS -1257LAMARK PATRICK 11939 71963121992052470018541.5052MINFOR -6677BRETHENCOURT NOEL 11939 21972111991011578112722.7052MSANS -9734FIGOURNAS DENIS 11940111971041989101932314934.7252MANGL -6502POMMERY ROBERT 11941 81963121993011663613344.0552MSANS -2718CHENES HAFID 11941 11964081994011557012567.3952MSANS -4104LANCY LIONEL 11942121988011995013587826261.1652.SANS -8284MERY PAUL EMILE 11942 61968021994012137316331.8752MCOMPT -3992BOUTICOURT EUGENIO GIOVANNI 11943 51964071987042273717261.8452MALLEM -9819LATTRE GUY 11945 31974071992071369311286.1252MESP -1150CAILLOUX JOSIANE 21945 11965021985042470018541.4752CANGL -6760HAUTINS BRIGITTE 21945 719781219900711131 9659.0652MSANS -2900FOS BERNARD GUY 11946 91974051993091168610046.6952CINFOR -3096CASTELLAR JACQUES 11946 71972041991112137316331.0352MINFOR -3983FLEURIE ISABELLE 11948111973111994011663613343.3052MANGL -9627CITROEN SILVIE 21948 31970041991012990722150.2852CALLEM -2626BUFFON BRUNO PIERRE 11948 51974051993011621213032.8352MANGL -1995GRENELLE PASCAL 11949 81975041991071578112721.7152MSANS -6675EMAN BERNARD 11950 71973081991012739020403.1152VSANS -1203JACOB JEAN PIERRE 11950 619790819780811389 9852.0052MSANS -1502COUBERTIN MICHEL 11951121979031992121608112916.4752MCOMPT -9762APPOLINAIRE JEAN CLAUDE 11951 51971101992112175716600.9252MANGL -6014MAURICE JOEL 11952 419910319900310024 8999.7952CSANS -8272BESANCON CHRISTIANE 21953 2199304199204 9597 8728.9452SSANS -4121VOLTAIRE PHILIPPE 11953 51972071995122043315671.2452CALLEM -3385CARNOT HENERE 11953121978061993051864214469.1452MANGL -9459SAUVETERRE OLIVIER MICHEL LOUIS11954101982061990011608112916.2352MANGL -0260MOURILLON JOELLE 21955 21984011992011249910473.0952MSANS -6808ROBERT PIERRE 11956 61979061992021471512025.3752DVENTE -1754CITADELLE PHILIPPE 119561019830619910311131 9658.9152MANGL -3114PINCES FREDERIC 11956 61976031988011684813422.5952CSANS -2401PAPE MARIE ANNE 21956 31978061992121471512025.9552MSANS -3724AGNOS ERIC 11956 71976041993111578112721.7052CSANS -1438KERLIBOUZEC EVELYNE 21956 71981111980111527112373.3252MINFOR -8247VERSAILLES LAURENT 11956 61980081995091249910472.5552MSANS -0939FLAMBERTINS ALAIN 11957 819950619920110024 8999.0752CSANS -5765FOCH ROBERT 11957 11981031993031608112916.3252MALLEM -9301GARDETTES DOMINIQUE 21957 1199505199405 9126 8456.6952MSANS -8571TIRE ROBERT 11958 11984051992041326611017.9752MSANS -7487THORNTON JEAN LOUIS 11958 31981041994051804514081.0752MANGL -3406AVEL PAULE 21958 419780619770611515 9930.5352MSANS -0124DESPORTES STEPHANE 11959 21979021995091471512025.7252MSANS -6928ASSIER PIERRETTE 21959111993101992011202810241.1352CTECHN -0989FEROLLES WILLIAM 11959 81983041982041326611016.3052MSANS -9802ORGE JEAN CLAUDE 11959 11980081987112256617145.8752MSANS -8376FOUQUE ERIC 11959 2198801198502 8656 8145.6552.SANS -8925COURBET YVES 11960 71987031989112090215980.8752MALLEM -3897ANDELU ALAIN 11960 81991011994011249910471.7452DSANS -3323BOSQUETS CLAUDE 11960 41983031995121433211715.6952CANGL -7089COULOUBRIER DENIS 11960 7199303199203 9126 8455.6552CVENTE -3026AGUILLON LUC 11961 2199601199501 8656 8145.6652MANGL -9585EGLISE ANDRE ROGER 11961101988111993092401918076.1152MSANS -0634MAINE JOSEPH 11961111986011992121288210745.7052CSANS -7284FORTES ANDREE 21961 51991111990111949415051.2152MSANS -3518VIELLE GEORGES 11961101988091992121249910473.6752MSANS -3969FERIGOULAS SYLVIE 21962 71983011982011288210743.9052MALLEM -1749ARCADIA PASCAL 1196210199305199209 9597 8727.8352CANGL -5023PAVIS YVON 11962 4199512199501 9126 8455.5352MALLEM -6853PLAGNE ROBERT 11962 819840619830611131 9657.1252CINFOR -0421HARAVILLIERS MAX 11962 819850819840810791 9502.9852CINFOR -8436PLEIN ROGER 11962 51984081989112090215981.3652CESP -2433SARTRE SERGE 119621219850719920910791 9502.6652CSANS -4413WALDTEUFEL FRANCINE 21962121982051988051608112916.0252MANGL -2214MONTEZE FRANCOISE 21962 3199302199202 9597 8728.3752MALLEM -0233COMMUNE ANNE 21963 2199312199212 9085 8419.4452STECHN -0441SOLARIUM ELISABETH MARIE PIER21963 21993071992011202810240.9952MTECHN -4510LETELLIER HUBERT 11963 31986111986031527112374.5852CSANS -1778EVEQUE BERNARD 11963 51986111992011949415051.3952MSANS -1339SEGUR SERGE 11963 91985091992121527112374.1252MTECHN -4092HEURSAULT AGNES 21963 51982031981031326611016.7552MSANS -9379GOJA MARIE THERESE 21963 71983041982041288210744.2652MINFOR -1533BODIN ISABELLE 21963 419831219821210024 8998.9152MSANS -9862FOSSE BETTINA 21963 91990111989111949415051.9552MSANS -6255VIGNE NICOLE 21963101984111983111608112916.9152MSANS -6101VAUGRENIER CATHERINE 21963101984051989041527112374.9452MINFOR -8653SEQUOIA HENRI 11964 51988031994011249910473.2052MSANS -9919BILY PATRICK GUY 11964 91985091992091949415050.6352MSANS -7059VALLEROY BEATRIX 21964 2199204199104 9597 8729.0752MSANS -5440PORS ANNE MARIE 21965 21986061985061527112373.1752MSANS -2587VICOMTE PATRICIA 21965 11991111992011202810239.8652CESP -9598SULLY CHRISTIAN 11965 91994051992011202810240.1452MANGL -0899MANU JEAN PAUL 11965 519880519870510407 9270.2952MTECHN -0493POET JEAN PAUL 11965 119891219881210407 9270.5652MINFOR -7853LILAS JEAN CLAUDE 11966 31986051985051288210744.5052MANGL -4637LONGCHAMP CATHERINE 21966 91988051993091839014313.0952MSANS -5141LINDFIELD GERARD 119661119870119860110407 9272.2452MANGL -3945PESSOT VERONIQUE 21966 119910719900710024 8998.8952MINFOR -6408PUJOLS CHRISTINE 21966 71987061986061249910473.0952MSANS -5883AUREA JEAN 11966101988061991011249910471.9452CESP -6385CHAILLY LAURENCE 21967 419910719900710024 8998.4152MANGL -8609CEINTURE ANNE MARIE 21967 21991121995071202810240.1452MANGL -1367NOIRES ANNIE 21967 61991101990101330611017.1952MSANS -6827NOISY FRANCIS 11967101988011987011450311831.9752CESP -3823RESISTANCE CHRISTIAN HENRI 119671119890319880610407 9270.8452MSANS -5716CYRAN PATRICK 11967 11987071994111450311832.6852MANGL -2307ARBELLARA NADINE 21967 61988091990111839014313.9352CSANS -0224VEBRET VIRGINIE 21967 9199406199305 9126 8456.1652CANGL -3639BERGERON CHRISTINE 21967 619951219940110668 9426.1852DSANS -5292CREGY MAURICE 11967 719940819930411389 9852.4952MANGL -8369BRENS COLETTE 21968 81991101990101330611017.4152CANGL -2447REBEYROLIE ANNIE 21968 619900319900911389 9851.0352MALLEM -0478MES CHRISTINE 21968 4199309199209 9597 8728.7152CSANS -2875CLION MARIE FRANCE 21968 319930519920511389 9852.4552CSANS -8148CROS FRANCOIS 11968 41988111987111249910472.7352MSANS -9990VERCINGETORIX CHRISTINE 21968 119950419930411389 9851.2852MSANS -2796BLONC JEAN PIERRE 11968 4199301199511 9597 8727.8152MSANS -9996GUIS LUCIEN 119681219931119920110024 8998.5352CSANS -7769NERVAL MICHELE 21968 41990051994011330611017.8352CSANS -6262RACINE ALAIN 11969 719890419880410407 9271.9552CSANS -9102SAUGES BENOIT 11969 11989071993081381911364.8152MSANS -4448NARON PASCAL LOUIS 11969 2199605199505 8656 8145.6952LSANS -3197CHAUMES GUY 11969 819930619920610024 8998.9452MSANS -2201LUYNES SOPHIE JOELLE 21969 5199311199211 9597 8728.2352CANGL -3000PLAINES JEAN MARC 1196910199204199312 7677 7604.9052CINFOR -7547BREGUIERES THERESE 21969 719920419910411389 9851.3352MANGL -9804CADOT MARIE JOSE 21969 81991101990101330611018.2252MSANS -5321JAUNAC SOPHIE 219691019910719900710024 8998.5852MSANS -3824LAVISSE DANIELLE 2196912199405199305 8359 7952.9252CSANS -6505LOUISE PIERRE 11969 419910119900110024 8999.8152CSANS -9873BOULOURI JEAN MICHEL 11969 71990021992091202810241.3652MSANS -9771BREUILHSUD THIERRY 11969 419910719900710024 8997.9652CCOMPT -8931ELVARD CLAUDE 11970 81994031993032107316096.9852MANGL -2755GEROME MAURICE 11970 8199311199212 9597 8728.9552MTECHN -8557CYRNOS BERNARD 11970 5199404199201 9597 8729.9052MSANS -3651COCTEAU GABRIEL 11970 41994011993011267210588.5352CSANS -4459VITALIS ALAIN 1197010199612199512 9894 8921.9152LSANS -9388COURTENAY JEAN JACQUES 11970 91990031995071202810241.1252MVENTE -1310CAILLADE ADRIEN 11970101996111995111616712994.7752CALLEM -5461GOMETZ CHRISTIANE 21970 61994071993071407611559.6252CSANS -0669MAUVALAT DANIELE 21970 6199209199109 9597 8728.7652MSANS -0103TAILLEFER MICHELINE 2197010199608199508 7803 7680.0552CSANS -5577MOUGINS CHANTAL 21970 619940919930411389 9852.6952CSANS -0340LAMBESC MARIE CHRISTINE 21970 3199607199507 7803 7680.6252CSANS -1328PIERRE PATRICE PAUL 1197111199106199006 8656 8145.0352.SANS -3172DENOUVAL DANIEL 11971 419940319920110024 8999.1652MSANS -9639ESPAON MARC 11971 7199407199307 9597 8727.7852CTECHN -6612FONTMERLE JOELLE 21971 919930419920411389 9850.8452CSANS -1855MAILLOL PIERRE 1197110199303199203 9597 8728.0452MSANS -8791RASTINES PHILIP 11971 81993011992011267210589.2852CSANS -2880FLORALIES MARIE THERESE 219711219930919920911389 9852.3352CINFOR -9921SERPENTINE FRANCOISE 21971 419920219910211389 9851.1652CVENTE -6761KING JACQUES 11971 5199606199401 9597 8729.9952CALLEM -8677BREANCON VERONIQUE 21971 919940819930810668 9425.7252MANGL -0030SUVERET PATRICK 1197110199501199304 9597 8728.6652MSANS -4284REGNAULT JEAN MARC 11971 719900619890610024 8999.3652CSANS -3275POMPIDOU DIDIER 11971 6199610199510 8656 8145.3352MSANS -7270BONNEUIL MARC 1197110199107199007 8656 8145.3052.SANS -2988DEREURE BRIGITTE 21971 8199606199506 8656 8145.8752CINFOR -0334GRAVESONN JEAN 119711119911019901010024 8997.7852CANGL -5425PONT FRANCOIS 11971111995041994041267210588.8852CSANS -7132MIDI JEAN PIERRE 11971 5199608199509 8656 8145.4852CANGL -5172BLOMET JEAN PIERRE 11971 81993061992061267210589.5252CSANS -1753QUIETA DOMINIQUE 11971 41991061995101202810241.7652MSANS -8062DOMINO MARC 11971 719910819900810024 8999.4052MSANS -8636ECLUZELLES MICHELE 21971 9199609199509 9894 8921.5952CSANS -5812REPUBLIQUE VERONIQUE 21972 31995101994101206910240.4052CSANS -0712TEYSSIERES MARTINE 21972 6199607199507 7803 7680.8952CSANS -3543DUNETTE LAURENCE 21972 4199608199508 8656 8145.9152MSANS -7967FOUCANCOURT ASTRID 21972 219930619951011389 9850.8852CSANS -6876THERESE MISAKO 21972 719940819930710668 9427.2652MSANS -9406GALLIEN MICHEL 11972 219910719900710024 8997.9052MSANS -7605BAUMES ALEXANDRA 11972 7199501199304 9597 8728.1952MALLEM -1625ARTHUISIERE JACQUES 11972 61995011994011206910240.6652CSANS -6717DOUMER PHILIPPE 1197212199611199401 9597 8728.8052CESP -1677CHABRIER LAURENT JEAN CLAUDE 1197211199504199404 9126 8456.3952CSANS -8299PUY JEAN 119721119931219940111389 9852.6352CANGL -8443COUSTERES MICHEL 11972 2199107199012 8656 8145.4452.SANS -7741NANT FREDERIC 11972 31991061994111202810240.7652MSANS -0657TAUDE FABRICE HENRI 11972 319940219930211389 9851.3752CANGL -9630GOELETTE JEAN LOUIS THIERRY 11972 4199407199307 9597 8728.1352CSANS -1127EXUPERY SIMONE 21972 5199602199502 9894 8921.4152CTECHN -6944LIBERTE CORINNE MARIE 21972 41993071993051267210589.5253CSANS -3755ARNAUD MARIE PIERRE 21972 6199307199207 9597 8729.3052MALLEM -2437CLAUSONNES MARTINE 2197212199411199311 9126 8457.1152MSANS -2896LUNA NADINE MARIE 21972 8199308199208 9597 8728.3252CTECHN -1758KARU LILIANE 21972 3199207199107 9597 8729.7452CINFOR -5392FER RADHIA 21972 3199210199106 8359 7952.9152.SANS -9857EGLISE CLAIRE 21972 7199402199302 9126 8457.1152CSANS -6707INKERMANN GERARD 119731219951119941110668 9426.5952CSANS -4728ESTANISLAO ERIC 11973 1199608199508 7803 7680.7752CSANS -6566GOULAIN BRIGITTE 21973121994121993121206910240.7753CESP -0727PUY THERESE 2197311199610199510 8656 8145.6552LTECHN -0980ARGENTIERE GILLES 1197311199406199306 9126 8456.1552CANGL -4718DOMOY MICHEL 11973 219940819930811389 9852.0052CSANS -0216CALAIS FREDERIQUE 21973 219930919920911389 9850.6152MVENTE -2997FOIRAIL COLAS JEAN LOUP 11973 1199604199504 8656 8145.4852CINFOR -5877EPI LUC 11973 5199308199208 9597 8729.3052CANGL -0287CARTIER JEAN LUC 11973 7199511199411 9894 8923.3852CTECHN -7891MOUSTRAN PAUL 11973 2199303199203 9597 8729.8452CSANS -3815ELYSEE LOUIS 1197311199304199204 9597 8728.6652CSANS -0959REPUBLIQUE ERICK 11973 619930719951111389 9852.2752CESP -2490GLENANS PHILIPPE 11973 41995101994101206910241.8452CSANS -6935PAYRAC JEAN JACQUES 11973 9199310199210 9597 8729.2252MSANS -8784JACQUET FREDERICK 11973 319930919920911389 9852.2452CINFOR -7986COUCHANT YOLANDE 2197312199608199508 7803 7679.4652CALLEM -1549DRYADES PIERRE G 11973 9199408199307 9126 8456.7052CSANS -0968OPIO SYLVIE 21974 6199606199506 8656 8145.3852CSANS -0353DELATTRE FREDERIQUE 21974 9199603199503 8656 8145.8052CINFOR -1122ACACIAS SERGE 11974101995101994101206910240.9452CTECHN -9008MANOIR DANIEL R 11974 9199606199506 9894 8921.4052CSANS -3650AIRES FERNANDO 11974 7199407199307 8656 8146.2552CSANS -7799TOUR JEAN PIERRE 11974 3199508199408 9126 8456.3752CSANS -4614VILLERS CHRISTIAN 11974 119951119941110668 9427.4752CSANS -6384SEURAT JEAN JACQUES 11974 1199504199404 9126 8457.4952CSANS -0504MEYRIN MICHEL 11974 8199607199507 7803 7679.3752CTECHN -3076TAMARIS THIERRY 1197411199405199305 9126 8457.7452CALLEM -5273CAYES PHILIPPE NICOLAS 11974 2199308199208 9597 8729.3452CALLEM -9558BATOUCH PAUL 11974 6199606199506 8656 8145.2452CSANS -6082PEDRO GERARD 11974 6199607199507 7803 7680.3252CSANS -4712CIDEX NICOLE 21974 9199607199507 7803 7680.0052CALLEM -7982VILAR MICHELINE 21974 9199604199504 9894 8921.4052CALLEM -0377RIBE MARTINE 2197411199609199509 8656 8146.6152CVENTE -1910AUBE DOMINIQUE 21974 3199610199510 8656 8146.0152CANGL -1632COURTAU MARIE JOSEE 21974 8199609199509 7803 7679.6352CSANS -0616HIIS BEATRICE 21974 919930919920911389 9850.9852MSANS -5825TIREUSES MARIE FRANCOISE 2197512199609199509 7803 7680.7152CANGL -8598SAND CHRISTIANE 2197511199607199507 9894 8922.0552CSANS -9425VISA GILLES 11975 319951119950211389 9851.7452CALLEM -8440EYGAUX LAURENT 11975 6199603199507 9894 8922.1652CSANS -3240BARBUSSE JEAN PIERRE 11975 6199510199410 8656 8146.2552CANGL -7022LOUPS DOMINIQUE 11975 3199605199505 8656 8146.7752CSANS -3687SULTZER MARYLINE 21975 8199607199507 7803 7681.1752CTECHN -3649TROIS ANGELICA 2197511199608199508 8656 8147.0652CSANS -8797BELHAITRE RENE 11975 4199409199309 9126 8455.7652CSANS -3401SOURCE PAUL 11975 2199612199512 9894 8921.4152CANGL -0533JOUFFROY LUCIENNE 2197511199608199508 9894 8922.0052CTECHN -4412CAPEAU MONIQUE 21976 1199607199507 7803 7680.6252CINFOR -9518COCULOT HELENE 21976 8199508199408 7803 7681.2952CSANS -1220VALLOIS ALAIN 11976 7199607199507 7803 7680.1852CANGL -7054DANGALYS MARTINE 2197712199607199507 7803 7680.7752CSANS -5515MARNE GHISLAINE 21977 6199607199507 7803 7680.0552CSANS -2958CLAIR GISELE 21977 8199608199508 7803 7680.6352CANGL -5379CONCHES DOMINIQUE 21977 6199607199507 7803 7679.4652CANGL -9250DECHAMBRE MICHEL 11977 8199607199507 7803 7679.4552CSANS -7969SALEON ALAIN 11977 8199607199507 7803 7679.3652CANGL -0131EOLE ROXANE RENEE 2197710199607199507 7803 7679.2852CANGL -9710OUEST HENRIE MARCEL 11979 2199607199507 7464 7525.1452CINFOR -0487PRIEUR JEAN FRANCOIS 11956 81983041982041684813423.3153MSANS -7696BELVEDERE XAVIER 11962 81982071995091450311830.6753MINFOR -2063LIOURA PASCAL JEAN 11964 41986111995082256617145.7853MANGL -7927TRAVERSIERE JEAN PIERRE 11965111986081995091450311832.1553MCOMPT -2549VASCO DANIEL 11968 51990091995111450311832.1453MANGL -2675RESIDENCE JEAN MARC 11969 21995111994111450311831.3453CANGL -8649VIGIER OLIVIER 11969 8199612199512 4638 5819.0153MSANS -7524BEDOK STEPHANE AUGUSTE 11969 51995121994121450311832.5653CSANS -3056FRANCE MARION 21971 61996091995091450311831.7553CSANS -9905CORNICHE DANIEL 11972 31996091995091450311832.2057CSANS -4894PORTE RONAN JEAN PIERRE 11972121993091992091450311831.9353CSANS -6471SUCCURSALE LAURE MARIE 21972 71996091995091450311832.1854CALLEM -8530TOURS ANNE YVONNE 21973 31995121994121450311832.3854CSANS -4004MORTON JEAN CLAUDE 11965 81992031991031965617846.6854CANGL -4099MONTELIER DENIS 11971 519940819930811389 9851.1257MSANS -9423CHATEAU CARL 11956 51980091992121471512024.3958MSANS -2026BERT CLAUDE 21957 51979031986021497412181.1158MALLEM -0951MERAY MARIE HELENE 21964 61990051989051249910472.7058MTECHN -5282PINEL LILIANE 21948 71977031992011471512024.4859MINFOR -5545DOM ANNIE 21960121982091995061638413150.2959DSANS -4161BOIS ANNICK 21960 81983021982021326611016.2459MSANS -1624LORRAINE CHRISTIAN 11961 41983081991012781920674.8359MSANS -0982VEYANS MICHEL 11961 21982091991092529918968.7059MINFOR -0123LOCARNO ANNE MARIE 2197411199402199302 8359 7953.1159MSANS -7957AVAUX PHILIPPE 11942 51963041991072273717261.4960CCOMPT -0611SAUVAN JEAN FRANCOIS 11946 71980111994011471512025.0260MTECHN -8634MONTGAZIN ANDRE 11950121974061991012137316331.7560MALLEM -3872AZUR JEAN CLAUDE 11951101970101990101932314935.1760MMICRO -7401PARC PIERRE 11952 91989011994011288210745.9360MSANS -8111STADE BERNARD 11953 21983021984051249910473.4960MANGL -8795MOTU JEAN LUC 11959 81979101994011578112722.8260MSANS -2118BAUDETS MARIE CHRISTINE 21961 31983011982011608112915.3560MTECHN -8422WIEHN BRUNO 11963121988061992021249910472.6660MANGL -3871SOLE MARTINE 219661019910919950510876 9503.4760MINFOR -6169CUOQ CORINNE BRIGITTE 21967 21989121995071249910472.2560MANGL -2571BARAT MARTINE 21968 81994061996012303517377.3560CSANS -4114HOURTINS DOMINIQUE 11977 1199608199508 7803 7680.5960CANGL -1079GUEN HELENE 219391219820419810411131 9657.7561MSANS -0830EGLY DANIELLE 21950 1199406199306 9126 8457.4261MSANS -1903GENEVIEVE HARDY 11953 91978111989112256617146.1661MINFOR -9550INGERSHEIM PHILIPPE 11961 61982041987041608112917.1961MANGL -3284BELLETRUD JEAN 11950 61977101993121369311287.2363MALLEM -2911SOUBISE IVAN 11958 71982031992112529918967.7663MTECHN -5851CREACH FRANCOIS 21963 9199608199508 7803 7680.0863MSANS -6333DUPARCHY LILIANE 21973 3199406199306 9894 8921.6763CSANS -1729CURAT ROBERT 11935 91958051994123417325098.2464MSANS -7436CHALLONNIERE VALERIE 21941 41962041989012137316332.3664MSANS -6301BLUM CHANTAL 21943 71969071991051932314935.2664MSANS -7026SARRETTE MICHEL 11946 21991011990013200223583.2364.ANGL -0646MARIE BRIGITTE 21950111971011992061834514275.6164DMANAG -1101ENFANTS ANTOINETTE 21955 61981011995011527112373.9164MANGL -8770RACHERET LAURENCE 21956 71978061993051608112916.8864MANGL -4751LIONS DAVID 11958 91980071993092090215981.1464MANGL -9291SOULEYAS DOMINIQUE 11958 11980011992101911114779.7764MANGL -2505LUCHON JACQUELINE 21958 21989011993041249910473.4964MSANS -8607VOLVESTRE ELISABETH 21958 11991111990111249910472.9764SALLEM -1586PESSAC JEAN YVES 11961 21989051988051949415050.2864CSANS -5341RIOU ROBERT 11962 61985091993011949415052.4365MCOMPT -8946MOULINET ANNE 21962 81983041982041608112915.6064MSANS -5619MARCQ MONIQUE 21963101995101994101206910241.3064MSANS -8989JUZAN CLAUDE 11965101990091994092401918075.4464CANGL -0763PERAULT CHANTAL 21965 21986041985041527112373.5364MSANS -1526JEREZ NICOLE 21967 519911219920111389 9851.6164.ALLEM -2211KELLERMANN FREDERIQUE 21967 91991111990111202810241.9764MSANS -4302KERCADORET DOMINIQUE 11971 81994071993071206910240.2364CSANS -1236PALETTE ROSE MAY 21971 91994031993031267210588.9264CSANS -8225SEROT MARTINE 21972 11992061992031330611017.7065CALLEM -5326DRAGUIGNAN FRANCOISE 21972 519930619920611389 9852.0564MTECHN -5970DANUBE PHILIPPE 11974 11994071993071206910240.4965CSANS -6556BROUILLET ANTOINE 11937 11986101986012687820055.0565.SANS -1186AOUT JEAN JACQUES 11937 21987011986012431618272.0165.COMPT -7999PIERREFONDS STEPHANE 11938 31964051994011663613342.7665MINFOR -1312GRENOUILLERE PHILIPPE 11939 71964101987016400345693.2465MALLEM -0460MARRONNIERS GERARD 11942 41961061994113587826261.7965MINFOR -4154LOUIS PHILIPPE 11942121965101993012739020403.3065MVENTE -3603MUETTE GEORGES CHARLES 11942 41968071992013844228044.8465MANGL -8992COUDREE PASCAL 11943 91968031988072273717260.3265MSANS -9382CONSTANCE MADELEINE 21944 519830619860211131 9657.1265VSANS -0255MARTINIQUE GERARD 11946 31994121993123882428316.7365MSANS -8195EXELMANS BERNARD 11946 91984051984111215710278.1665MVENTE -3879GOUT JACQUES 11947 51968121992122470018540.5765MSANS -9678HETRES VIANNEY 11947 91968091994094121428006.1765MALLEM -6027STRASBOURD JEAN CLAUDE 11951 21972101987052470018540.1565MALLEM -7805BESSIERES JEAN 11952 51973031988112334017609.4265MSANS -7152REUILLY ANNE 21953 91974071993121471512024.5665MINFOR -4995BERCHET FRANCOISE 2195412199306199206 8656 8145.6065MMANAG -1933ERMITAGE JEAN CLAUDE 11955 11991031994021249910471.6165MSANS -0728VOISEMBERT ISABELLE 21955 61976011991011471512024.2165MSANS -0718CERNAY MARC JEAN MARIE 11959 11988011987013669126843.7365.SANS -2726ORDENER MARIE FRANCOISE 21959 21980071991101369311287.9765MSANS -0225PLELO PHILIPPE 119591119800319790311389 9851.3365MSANS -0630GOBELINS BERNARD 11959 71981031991012781920674.6165MTECHN -1138ISARDS ELIANE 21960 21988101990042581519316.5865.SANS -8716TOURELLES JOSETTE 21961 81983041989112090215980.4365DANGL -3837CONTAMINES ANNIE 21961 81984121992061527112373.2265MANGL -0223FOUSSEAU DOMINIQUE 21961 21996071995082005015476.6165DINFOR -8553OUSTALADO PIERRE 11962 61984011993121326611017.7265MSANS -1723HIGH MURIEL 21962 71983011982011608112917.1865MSANS -2779PLAT MICHEL 11963121984051993102401918074.6765CANGL -7160BOILEAU DENIS 11964111985031990111949415051.9565MANGL -1054MARINET CRISTOFORO 11964101985091993092401918076.4465MALLEM -0034ANGELY JEAN PIERRE 11965 31988081991121249910473.3265MINFOR -0684DIEUDONNE CORINNE 21965101988121987121249910473.7465MSANS -4943SICARD DOMINIQUE 21966 919931019921010363 9233.2765MINFOR -8211CARLE PATRICK 11966 31994011993011621213033.5665MALLEM -1276GREFFIER SERGE 11967 119930619940110024 8999.1365CSANS -5313BIARRITZ CHRISTINE 21967 91990111991012602319433.9065.ALLEM -5161DUBOC NICOLE 219671219880119870111302 9774.4865MANGL -1515SABLEAUX REGINE 21969 71993011992011839014313.2665MSANS -7518LANORVILLE JEAN DAVID ALBERT 119701219960519950511389 9851.7065CSANS -6488CATALAGNE PHILIPPE 11970 71996101995101706413577.4365CSANS -8039LAURENS PATRICIA 21971111993031995011557012567.4165.SANS -7894PEPINIERE MARIE ANNE 21971 41991111991111723313653.7565MSANS -9988MEN JACQUES 11972 71994061993061420611638.1665CANGL -0742TOUTES JEAN FRANCOIS 11972 71993031992031420611637.6665CANGL -3618FREDISANE BRUNO 119751019960619950611389 9852.5465CANGL -7403AUGUSTINES ERICK 11937 61988031987024330331419.2172.ALLEM -7418PATRICIA JEAN CLAUDE 11944 71990071993011369311286.2072.SANS -9902CORSE MARIE JOSE 21958 41988101983101326611018.1872.INFOR -1972FLANDRIN CATHERINE 21963121988101983101288210744.3772.SANS -6223BEAR MICHELINE 21963 51989061992031450311831.6972.SANS -1899CHEVILLY ISABELLE 21963 71989011992061450311832.7272MTECHN -1131BLAISE MIHOKO 21963101990011991061450311831.0372.SANS -7170AIGUEBONNE MARIE 21971 11995101994101206910241.9972CSANS -0384LAMBESC ALBERT 11973 119901019920110024 8999.7672.TECHN -4786VIGEN EVELYNE 21939121962121990102273717261.1873MINFOR -5969COTE MIDORI 21946121994101993102334017610.5973MSANS -6378MYOSOTIS YVES 11949 31992011994113844228045.8873.SANS -3664MAREUIL NADINE 21966 21989061989111288210744.8673.SANS -8858EANOLIAS JACQUELINE 21949 51977071991121911114778.7075CSANS -1090LORETTE YVES ANDRE 11950 61971081995013587826261.5875MSANS -3800KOUTIO ALAIN 11961 91982121989052090215980.3975MINFOR -5591PALALDA MARC 11965 81995061994061267210590.3275MSANS +5745ESCOURCHE BENEDICTE 21935 71962121994051834514275.50 0MTECHN +9692VICENTE LAURENCE 21941 81967101989011621213032.80 0MANGL +9146NICOLAS ROGER 11941 61964071995023417325098.65 0MSANS +2985TESSEREAU MARIE HELENE 21941 91967011990011932314933.78 0VSANS +3368MOGADOR ALAIN 11941 11961091993114330331420.55 0CSANS +7394CHAUSSEE ERIC DENIS 11944 91965111983123200223583.86 0MANGL +4655MAILLOT GEORGES 11945 51970091986122470018541.64 0CANGL +2825CAMILLE NADINE 21956 91994011993011949415050.45 0MSANS +1460BRUYERES JEAN MARC 11958 81984081988052090215980.07 0MSANS +4974LONES GERARD 11959101979011994121608112916.70 0MSANS +8811CROISILLES DOMINIQUE 11961101983051991011868714507.13 0MSANS +4682MUY CHRISTINE 21962101986051985051288210745.30 0MANGL +2974SEYSSAUD GERARD 11963 91984101989051949415050.55 0MALLEM +3185QUINET OLIVIER 11966 71985061993111868714507.94 0MSANS +9543KOMITAS YVES 11967 21993011992011330611017.70 0MTECHN +3493COUDET ERIC CHRISTIAN 11935101955041992063417325097.97 1MTECHN +9039CHAMBOURCY JEAN PAUL 11936 21965031995033417325098.51 1MALLEM +3731CLERE BRIGITTE 21936111963091995082666519900.77 1CSANS +2935BONVIN ROBERT 11937 71960121985042273717261.66 1MANGL +4278VALBOSQUET VERONIQUE SIMONE 21939 21972071992021932314933.54 1MSANS +1653LIEGE LAURENCE 2193912198901198605 8656 8145.57 1.SANS +4477LECOURBE DIDIER 11939121965051993011663613342.67 1MSANS +1400AVENE ANDRE 11940111969121993041557012568.44 1MALLEM +9742YZENGREMER MICHEL 11941121968011995042201216756.19 1MVENTE +7255PEYRESTORTES MARIE CHRISTINE 21941 11962041988072470018541.83 1MANGL +1725EPEND MARIE AGNES 21941 41973071989011621213033.65 1VSANS +4647PERADONNERIE JACQUES 11941121974071992071369311287.41 1MSANS +7633SCHEFFER CLAUDE 11944 11969031991011433211714.46 1MSANS +9793SABLONS MARIE FRANCE 21945 5199408199308 9126 8456.87 1VSANS +6057EAU BRUNO 11947 91972041991071433211715.33 1MSANS +6465JADES CATHERINE 21947121970011995042137316331.60 1MINFOR +8298BERGERS BERNARD 11947101975091993011369311287.29 1MSANS +9254LEGROS SUZANNE 21947 41971111995111684813422.57 1MESP +7761KAMAL ALAIN 11948 91977041993111471512024.08 1MCOMPT +5772GAUTHIER SABINE 21948 61977071994041471512025.34 1MTECHN +9643BARTHELEMY DOMINIQUE 11949 519871019901111131 9657.16 1LSANS +3906ROUYRE LAURE 21949 31973071972071326611016.21 1MSANS +8707SICILE JEAN PIERRE 11950 11976071993011369311286.56 1MANGL +0091THIVERNAL DIDIER JEAN 11951101980051991101471512024.71 1MSANS +5757CLOPERIE FABIENNE 21951 71972051995071684813423.26 1MSANS +7795LATOUR CATHERINE 21952 4199406199306 8359 7953.72 1MSANS +4879EGUILLES GILLES 11952 61972121990071621213032.51 1MANGL +8311VINS JEAN PIERRE 11952 119930919920910407 9272.06 1MTECHN +5964JUST STEPHANE BERNARD 11952 51974061993011369311286.48 1MSANS +2822NEMAN ELISABETH 21952 7199304199204 9597 8728.14 1MSANS +1340ABBE MICHELE 21953101973071991041578112722.60 1MSANS +5357ZOLA BERNARD 11954 41980061992011471512024.35 1MSANS +8456DHUYS CORINNE ANNE 21954 71979031993041471512025.50 1MINFOR +4618FERRY BRUNO 11954 41977041995011578112722.24 1MSANS +8212CIRCLE BERNARD 11955111975041991071578112722.42 1MSANS +8015BACHELET DOMINIQUE 11956121977031994072644919744.10 1MTECHN +4320SUPERI MONIQUE 21956 319940519920111389 9852.00 1MSANS +0442CONTOUR ALAIN 11957 91977031995062201216757.70 1MSANS +1034PROLONGEE MICHELINE 21957 61980051994071471512024.15 1MSANS +2106BARDE JEAN CLAUDE 11958 219840719830711131 9659.17 1MANGL +1977FOCH BERNADETTE 21958 3199202199102 8656 8145.03 1.SANS +3620BAGNOLET ANDRE 11958 11978061992051471512024.33 1MSANS +3344PEUPLIERS JOSIANE 21959 8199207199201 8656 8146.16 1DSANS +9038MALVILLE ETHEL LINKA 21959 31993091992011202810240.59 1MTECHN +0475PIERREFONTAINE BERNARD 11959 61984081987112090215979.62 1MSANS +4077MONTMELIAN NOELLE 21960 21984031983031288210743.92 1MSANS +1421FONTCHANDON PATRICE 11961 71984081989052090215980.97 1MALLEM +7043MOULERON MARTINE 21962 5199303199203 8656 8145.83 1.SANS +7239EPARGNE PASCALE 21962 91983011982011608112915.57 1MSANS +0361BRUANT LAURENCE 21962 31983041994091894014661.48 1CSANS +1988MIGNARD ANNE 21962 51993081992011249910473.36 1MSANS +8159GOLFE JEAN CLAUDE 11963 81985101992071288210745.49 1MANGL +7227BLEU MICHELE 21963 21994071992011249910472.61 1MTECHN +2721SATGE SOPHIE JULIE 21963 6199503199403 8656 8146.07 1MESP +1514PANNES JOEL ETIENNE 11964 11984101983101288210743.81 1MSANS +1595SEPTEMBRE PATRICE 11964 11988031987031527112373.40 1MSANS +5702CONCORDE PAUL 11965 71994051994011288210744.94 1MMARKT +3500DRIONNE JEAN XAVIER 119651119860119850110791 9501.81 1MSANS +3597PIERAM DOMINIQUE 11966 31991101990101381911366.72 1MINFOR +3537JEAN ANNE MARIE 2196610199610199510 9894 8921.90 1MSANS +0036CHATEAUBRIAND FRANCOISE 21967 8199307199207 7803 7681.42 1.SANS +2501GASTA PIERRE 11967101987091988071949415051.95 1CESP +5621KERGUILLE PASCAL 11967 71988071994061381911364.83 1MALLEM +5823BRIAC MONIQUE 21968 51994011993011360611210.93 1MSANS +3717FRADINIERE DANIEL 11968 51988041991041249910472.01 1MTECHN +2374PETITS SYLVIE FRANCOISE 21969 91992091991091330611018.24 1MSANS +8139POMPE ERIC 11969 21989041995031249910472.21 1MESP +3293GUSTAVIA MICHEL 11969 11993021992021420611637.74 1CINFOR +6848IMPASSE CLIVE 11969 71988071994011249910471.88 1MSANS +2857ERMITE DOMINIQUE 11969 319910719900710407 9271.86 1MTECHN +9167PARENT JEAN CLAUDE 11969 919930419920411389 9850.61 1CTECHN +6582OR MARYSE 21970 419920719910710024 8998.62 1MSANS +3685ANNEAU CORINNE JEANNE 21970 919920819910811389 9852.27 1MSANS +4890CIMIEZ PHILIPPE 11971121994101993101360611209.89 1MSANS +7740MARCEAU AGNES 21971 119920919910911389 9852.45 1MANGL +5934RANCHO DOMINIQUE 11971 91992071991071420611637.60 1CANGL +6784WEST JEAN LOUIS 11971 71995011994031202810241.57 1CSANS +0502ARRALLES GILLES 11971121993121994011249910473.27 1CSANS +5900LESIGNY OLIVIER 11972 6199606199506 8656 8145.74 1CVENTE +9357EGLISE ROGER 11972 5199207199312 9597 8728.89 1CINFOR +2647MONASTERE PHILIPPE JEAN 11972 919940619930610363 9233.31 1CSANS +7752RANCE GERARD 11973 2199607199507 7803 7680.14 1CINFOR +2565AQUITAINE GENEVIEVE 21973 119940619920111389 9852.22 1CALLEM +6946ORBAY CHRISTIANE 2197311199207199101 8656 8146.88 1MSANS +3358SALONINA ETIENNE 11973 419930919920911389 9852.36 1CANGL +7527BOULEYGUE PATRICK PIERRE 119741219940419930410668 9426.72 1CSANS +4780VALMORE ALBERT 11974 81995011994011206910241.16 1CSANS +6139PALMAROLE BERNADETTE 21975 1199504199404 8359 7952.78 1CSANS +2461CHAFFARD FREDERIC 11975 1199408199308 7803 7680.62 1CANGL +4422KAZ ELISABETH 2197612199607199507 7803 7681.11 1CSANS +3477CABRINE SYLVIE 21978 7199608199508 7803 7679.51 1CTECHN +6323FABIA RENE 11935 31960121990082273717260.44 2MSANS +5986ANNA DANIEL 11935 41970041991011433211714.88 2DSANS +1512FONTAIN HENRY 1193511198901198801 9894 8922.57 2VESP +6902BLANCS BRUNO 11935 61958071993052470018541.64 2MSANS +1158CORNEBARRIEU JEAN FRANCOIS MARCEL11936121964011994011557012566.45 2CTECHN +8277PRIEURE CORINNE 21936 51963011991072273717260.26 2CANGL +3981TERME FREDERIC 11937 71959021989013844228044.89 2MSANS +1713DANVILLE DANIEL 11937 51961101985022470018540.87 2MANGL +9871CAZALIS THIERRY 11938 61966121989062947921840.15 2MANGL +0383CRESSELY JOELLE 21938111962091990012273717260.55 2VANGL +3742PYRENEES CHRISTIAN 11938121971101995011663613342.85 2MESP +6595BAGUIERE FRANCOIS 11938121964081983102022115556.35 2MALLEM +6543PIERRON PATRICK 11939 7198901198801 9894 8921.33 2CSANS +8167CLAUX MARTINE 21939 21967011992021932314934.48 2CSANS +4406LESBACHES COLETTE 21940111973071994041894014662.43 2MSANS +8258HARTMANN MARC 11940 31968061995011663613343.06 2MVENTE +3848BARAUDIERE JEAN CLAUDE 11940 11964101990042739020404.83 2MANGL +1529PICOURENC ANNY 21940 71967011989062470018541.86 2DVENTE +3069PERIER MICHELE 2194010199601199501 7803 7681.25 2MSANS +8473COLONIE PIERRETTE 21941 31968041991041932314933.58 2MINFOR +0084NIEMEN ODILE 21941 51970071991101932314933.73 2CSANS +6401ALLERAY ARLETTE 21941 21972121993071894014662.64 2CSANS +8343LEDION FRANCOIS RENE 11941 71972031991071663613344.41 2MALLEM +9940LAUNES LILIANE 2194210199005198606 8656 8145.83 2.SANS +7584MARSAT SERGE 11942101964081994011557012567.26 2MSANS +1051ROSAN STEPHANE 11942 51962041991072273717261.13 2MANGL +8928POINCARE ANNE MARIE 21942 41965021994051834514275.50 2MANGL +0874FRANCS KATHERIN 21942 61968031992021932314934.00 2MSANS +3411CORDELIERS ELISABETH 219421119931119921110152 9116.90 2MSANS +8736PERTUADE DIDIER 11943 31973071992041403411520.93 2MANGL +5553OLIVIER CHANTAL 21943 71964071992102137316331.97 2MTECHN +8502AUGUSTE JOCELYNE 21943101962121991072273717261.16 2CTECHN +7314DRAIO TOMOKO 21943111969111991072273717260.71 2MSANS +7892HAUTIL MARIE AGNES NICOLE 2194312199201199101 7803 7681.35 2.SANS +1146RUES LAURENT 11943 51970041990032022115556.13 2MSANS +5013POURNAY STEPHANE 11943 71969101991011433211714.01 2MMARKT +1970SARREBOURG CHRISTOPHE 11943 91962121988122470018540.20 2MTECHN +2665SAVOIE HELENE 21944 91968091986062470018540.53 2MSANS +9470KALISTE SUZANNE 21944 31970071991041578112722.12 2DSANS +7109PEREIRA JOSIANE 21944 71965011982102470018541.72 2CSANS +0293COURDIMANCHE JEAN CLAUDE 11944 41967011991012273717260.50 2MSANS +6308BASQUES ERIC WILLEM 11944 71970051988042273717261.30 2MSANS +9758ROSSA ROBERT 11944 21976051991101369311286.71 2MSANS +0368GEROFOSSE JOELLE 21944 5198810198306 8656 8146.34 2.ANGL +3899SALIVE JACQUES 11945 81971051991071433211713.67 2MTECHN +4807RONDINELLE NOELLE 21945 81968091993062470018540.42 2MSANS +1251CAP CLAUDE 1194510198907198903 8656 8146.20 2.ANGL +8624FREVILLE ALAIN 119451119820119810111389 9852.74 2MSANS +2995ROI JEAN 11946 91972011990101433211715.50 2MANGL +2130POMPE JEAN MARIE 11946 11972081991071578112722.03 2MSANS +1524ANTARES CHRISTIAN 11946 41972011990011433211714.43 2MTECHN +2651AUBE YVES 11946 71971071987041932314934.48 2MALLEM +5389YVON CAROLE 21946101969031993031834514275.34 2CSANS +5055BERTHIER CAROLE SIMONE 21947 319931019921010024 8999.31 2MINFOR +9623LAGER NORMA 21947 61982071992121471512024.51 2MSANS +9198CAGEAC MICHEL 11947101971031991011433211715.45 2MTECHN +1117MONS JOELLE 21948 41970081986052334017609.84 2MSANS +3883BELFORT FLORENCE 21948 2199503199403 8359 7952.96 2MINFOR +1886CHERCHE CHRISTIANE 21948 3199412199312 9597 8729.72 2MSANS +9452MORGANE ISABELLE HELENE 21948 61971061989011621213032.70 2MVENTE +1240POSTEL JOHN 11948111974071992011403411520.33 2MTECHN +2793DALHIAS EUGENE 11948 71974041992031518612336.02 2MSANS +1264TRESSERVE EVELYNE 21948 71969081991012990722149.03 2MTECHN +2964PUJADE ROBERT 11949 81974071992041403411521.74 2MANGL +9832COUTURIER PATRICK 11949 11972031988102273717260.76 2MSANS +7619ETIGNY FLORENCE 21949 21970111995042137316332.59 2DVENTE +3262FABRONITA ANNE 21949 11969091993061834514274.66 2MSANS +2312SENONCHES ERIK 11949111977041993041369311287.23 2MALLEM +8743GALLA DANIEL 11949 31970081991012137316331.79 2MALLEM +0857RAYNOUARD JEAN PIERRE 11950 91982061993111369311287.65 2MSANS +2136DEROISIN JEAN MARIE 11950 11979061992011608112916.74 2CSANS +4603LEPURDIE PHILIPPE 11950 91977101990101684813422.12 2MSANS +2694JOSEPH ERIC 11950 31979021992011249910471.62 2SANGL +0601SAOUVES PATRICIA 21950 51971021990101834514275.83 2MTECHN +7409RENE DANIEL 11950 11973051990122470018541.83 2MANGL +0950SENNELY JEAN PIERRE 11950 51977081986091621213033.28 2MANGL +1214LOTHIERS ALAIN 11951 51976101993011608112915.65 2MSANS +6388LAGRANGE ANDRE 11951 81976031984112470018541.20 2MSANS +2773MORGON ALBAN 11951 91974051988122334017610.33 2MANGL +7718PIEDS PASCAL BRUNO 11951 61981061993011471512025.91 2CSANS +8483MEDITERRANEE FREDERIC 11951101970101991112334017610.56 2MSANS +6772TRARIEUX GUY 11952 91976041992121932314933.54 2MTECHN +3860MONTABO GHYSLAIN 21952121972041979101684813421.64 2MMICRO +4868SEVRIER BERNARD 11952 31981041992121369311287.50 2MANGL +5715CHEVREUSE CATHERINE 21953 11974081991092175716600.56 2MSANS +3702CALIFO BEATRICE 21953 21973021993012017815517.91 2MESP +4778LABORDE SHOKO 21953 61973041990101578112723.50 2MSANS +4134GABONNAISE GHISLAINE 21953 61980071979071202810241.30 2DESP +4174GAGNEUR JEAN FRANCIS 11953 81979011991101369311288.22 2CSANS +6892NOLET JEAN LOUIS 11953 81982051992041369311287.41 2MSANS +5817SERPENTINE CLAUDE 11954 11973111989122175716601.28 2MSANS +9960GASSIN PASCAL 11954 81974121991012334017610.60 2MSANS +4935ANNE EVELYNE 21954101975021986101684813423.38 2CANGL +7050LUBECK MARIE CHRISTINE 21954 81975101993091608112915.33 2DESP +4537ANNECY ROBERT 11954 91974061992011578112721.89 2MANGL +1403CHAUVETS CHRISTINE 21954 31977031992011471512025.55 2MINFOR +3733JAUSSERANNE MASAYO 21955 41978011981091834514274.29 2MSANS +3799VAILLANT ANNE MARIE 2195558199606199506 7803 7679.58 2MSANS +1112CHAUMINE RUTH 21956 71985091984091288210745.99 2MSANS +8102AUSSOU MARCELINE 21956 91985061984061288210744.53 2MMICRO +3321GABRIE JEAN LOUIS 11956101976031993041471512024.75 2MSANS +6037SENART JEAN PIERRE 11956 419810319921011389 9852.47 2MSANS +2073CHAUFOURNIERS FRANCOIS 11956 61976111994041471512026.24 2MSANS +3246LAMANON VERONIQUE 21956111980041995101527112374.97 2MTECHN +5182MA PIERRE 11957 41978121994071911114779.14 2MALLEM +1023GIONO PATRICK 11957 91989011995011249910472.21 2MSANS +6811GENERAL ALAIN 11957 219930719940111302 9775.56 2MSANS +9879FOUJU PATRICK 11958 91983051987052090215979.70 2MSANS +9605ATLANTIQUE CATHERINE 21958 4199510199410 7803 7681.20 2MSANS +4610COLMAR YVES 11958111982021981021608112916.50 2MSANS +1905INGRANDES GILLES 11958 11978061993041471512024.03 2MSANS +6585VERON PHILIPPE 11958 41990091989111450311831.69 2MINFOR +1508DOBROPOL ERIC JEAN 11958 71978071995041249910473.33 2MTECHN +9616AIGUELONGUE JEAN PIERRE 11958 71979101994051783213884.92 2MTECHN +5207GANDOUX PATRICK 11958 11980081985112256617145.24 2MSANS +5107FABRON CLAUDE 21959101982021981021326611016.48 2MTECHN +6821ARCADIE RAPHAEL 11959 519810119800111389 9851.34 2MSANS +9011TUTELLE CLAUDINE 21959 3199201199101 7803 7680.57 2.INFOR +9117TOURISTIQUE AGNES 21959 31983111982111326611016.24 2MSANS +2719CRECH DOMINIQUE 11959 81983101991012781920673.39 2MSANS +9688BAUME BRIAC 11960 1198901198801 9894 8921.36 2MVENTE +0734CIPRES DOMINIQUE MAURICE 11960 21984111993041527112374.40 2MSANS +2402VALBOIS DOMINIQUE 11960 419880419870410407 9271.77 2MSANS +4887ARBAUD JACQUES 11961 61985101993011168610047.18 2MSANS +3196ARCADES YVES 11961 619910819900810024 8999.88 2MSANS +0090SENLIS COLETTE 21961 7199610199510 8656 8147.17 2MSANS +1096BOULOGNE AIME 11961111982061981061326611016.53 2MTECHN +2728ABOUT CATHERINE MARIE 21961 219841019831011389 9851.55 2DSANS +9891EXELMANS PATRICK 11961 61992061991061249910472.97 2DSANS +4344SANTA MARYLENE 21962 91993081992011249910472.41 2DSANS +6050PROSPER JOELLE 21962 41982051981051326611018.19 2MESP +1207CAUSSADE MONIQUE ESTELLE 21962 91982111995011450311831.07 2DTECHN +0864MIOLLIS FRANCOISE 21962 6199501199401 8656 8146.41 2MANGL +0149MONVALLON BRIGITTE 21962 41983011982011326611016.29 2CSANS +2375ALIZE CAROLE 21962 91983011982011215710280.24 2MANGL +8618RESID CHRISTIANE 21962101996111995111202810241.90 2MSANS +2736PAPIN GERARD 11962 51982051993091949415052.11 2MSANS +3073JONCS PATRICK FRANCOIS 11962 919890519880510407 9270.62 2MANGL +6231ENFER PHILIPPE 11962 61988031993041288210744.28 2CALLEM +5886CHANAZ RENE CHARLES 11962 41992091991091839014312.94 2MSANS +7276ORGEMONT DANIEL 11962 119830719910711131 9658.28 2MINFOR +8307GUILLAUME BRIGITTE 21963 21986051985051288210744.10 2MALLEM +6242ESCLIMONT MARC 11963121986071993051288210745.94 2MMARKT +2593CARNOT JEROME HENRI 11963 719890619880610407 9271.23 2MSANS +9494TAILLANDERIE JOSETTE 21963 41985101984101249910472.84 2MANGL +6039BOURRIER ODILE 21963121984051992011288210745.88 2DSANS +8408MARINE JEAN PHILIPPE 11963 419850619840610791 9502.46 2MSANS +3121DOMAINES MICHEL 11963121983061983081326611016.74 2CALLEM +3716LANDES DANIEL 11963 919851019841010791 9503.30 2MCOMPT +7915LAMBALLE CHRISTIAN 11963 7199009199510 8656 8145.48 2.SANS +9027RUGBY NICOLAS PHILIPPE 11964111993051992051249910472.12 2MSANS +2392MAXIME FRANCIS 119641219850419840410791 9501.95 2MCOMPT +3798BORNEL PATRICE 11964 51984061993071527112374.31 2MANGL +8092DOURNAZAC MARIE CLAUDE 21964 71988031995091450311831.39 2DTECHN +9707FEUILLANTS STEPHANE 11964 91985041984041288210744.95 2MSANS +1926ESCLAPON JEAN PIERRE 11964101987071990011288210744.14 2MSANS +9268DOCKS CATHERINE 21965 81985101984101288210745.97 2MALLEM +6133MOULYN JEAN NOEL 11965 519950119940110024 8999.58 2MANGL +2064GABRIELLE CLAUDE 119651119940419940110363 9232.71 2MANGL +3515ARZENS JEAN MICHEL 11966121987061994101249910473.45 2CSANS +1327LEVALLOIS CHRISTIAN HENRI 11966 419870119860110407 9270.96 2MALLEM +4538VALLEE PATRICK 11966111987091986091527112373.35 2MSANS +3705TOLLARE GUY 11966 319900219890210407 9271.28 2MANGL +2150SUD FREDERIC 11966 819891119881110407 9271.41 2MANGL +0295WEBER PATRICK 11966121989041994071249910471.94 2MANGL +8904ARMAGNAC BRIGITTE 21966 21993011992011839014312.78 2MSANS +0895ABORD CHANTAL 21966 31992021991011202810241.94 2MINFOR +3361MONTMORENCY LUC 11967 119891219890411302 9775.47 2MANGL +5793CHANEZ OLIVIER 11967 61989021988021539912452.16 2MTECHN +9149AUBEPINES JEAN CLAUDE 11967 919950619920110024 8999.72 2MSANS +6376MYANS DIDIER 11967 419900919890910024 8998.71 2CINFOR +7437KERILIS CHRISTINE LUCIENNE 21967 219950519940510668 9426.77 2MMARKT +5688TALLOIRES DOMINIQUE LOUISETTE 21968 81992121991121949415052.16 2MINFOR +3037GRANADOS BRIGITTE 219681119921119911111389 9851.33 2MSANS +0075CROUESTY PIERRE G 119681119900619890610407 9271.65 2MTECHN +7531UCHA GERARD 11968 319880619870610407 9270.24 2MALLEM +7464MORLET CHARLES 11968 319890419880410024 8999.79 2CVENTE +0214BLAZY CECILE MARIE NOELLE 2196812199405199305 9894 8922.34 2MMARKT +4596BONHEUR PHILIPPE 11969 81990011992061202810240.46 2MTECHN +3345ERESTE ERIC 119691219900919890910024 8999.72 2CSANS +2283MONTS PIERRE 11969 3199606199506 7803 7681.34 2CALLEM +5377ROGER FRANCK ANTOINE 1196912199306199206 8656 8147.19 2.SANS +2310PANORAMA JEAN PIERRE 11969 1199407199307 8656 8146.86 2MSANS +5201LINCON ALAIN 11969 11990101989101202810240.66 2MSANS +0199ROLAND ERIC JOSE 11969 119890719880710407 9270.29 2MSANS +9200FABREGAS LIONEL 11970 419940219940310024 8999.90 2MTECHN +7648PEPINIERES JEAN PAUL 11970 119920419910410024 8999.90 2MANGL +0531FALAISE PATRICK 11970111993101994051450311831.87 2MTECHN +0234TERTRE GILLES 11970 419940419930510363 9233.63 2CALLEM +4680FREIGNEAUX TORBEN 119711119910519931110024 8999.31 2MANGL +6897BRIGAND MAGGUY 21972 719910719900710024 8998.62 2MSANS +3962VIMANEY DOMINIQUE 219721119940719930411389 9852.18 2MSANS +3186VALLAURIS STEPHANE DENIS 119721119931219921211389 9851.57 2CSANS +8810GRENELLE BERTRAND 11972 219931219921211389 9851.21 2CSANS +4405ROBIAC FLORENT 11972 41992121993021420611638.14 2CTECHN +1562PORTO DENIS 11972 31992021994011249910471.76 2CSANS +9401VIEILLE DOMINIQUE PIERRE 11972 119940619930610363 9232.37 2CSANS +6240ROMARINS MAURICE 11973 61993031994011202810241.12 2CTECHN +7717INDRE GEORGES 11973 7199306199201 9597 8728.41 2CTECHN +4476AUGUSTIN CHRISTIAN 11974 419941119931110668 9425.55 2CSANS +1784LOIN MARTINE 21975 3199607199507 7803 7680.09 2CSANS +3218FLORENCE PIERRE 11977 1199606199506 7803 7681.25 2CESP +2085HEOL GUY PAUL 11977 5199410199502 8359 7951.66 2CSANS +0871BOUCHE MICHELE 21934 9199201199409 7803 7680.72 3.SANS +6519INGRES CLOTILDE 2193511199202199102 8656 8146.47 3.ALLEM +4038ADAM JANICK 21936111960061980062470018542.10 3MSANS +5872MURES MARYSE 2193610199210199110 9085 8417.54 3VSANS +1672LECOIN MIREILLE 21938 7199505199405 7590 7562.85 3MANGL +7357DETRIE MARIE PIERRE 21939 61962071983032470018540.96 3MSANS +6152LAVA MICHEL 11939 71962111991013844228045.78 3MSANS +3943SOUPANE MARIE HELENE 21940 31967011990011932314934.18 3MANGL +3325REVIREE ALAIN 11941 21973071992011403411521.25 3MANGL +2673HENNER LILIANE 21942 6199501199401 8656 8145.91 3CSANS +1755THEBAIDE MICHELE 21942 71966061995011834514275.86 3CSANS +7360DUCHEMIN VALERIE 21942 61970051991091932314933.73 3MANGL +1599CHALETS ALAIN 11943121988031993011215710279.23 3MSANS +9946AULNAY LAURENT 11945111972061995072470018540.87 3MVENTE +2412GILLES ANNE 21946101969081990012137316330.83 3MSANS +0843EPICEAS COLETTE 21947111971011994051834514274.26 3MANGL +6293TERRAS ERIC 11949 41976021992012470018542.13 3MSANS +0336AMOUR MARC 11949 31978081993121471512024.17 3MSANS +5125BASTIDES GUY 11949 91975091990011684813422.12 3DESP +7428LEGENDRE ELISABETH 21950 91979121978121249910472.15 3MSANS +5015GERARD VALERIE 2195112199307199207 8656 8146.11 3.ALLEM +4029SUISSE HERVE 11951 41970101990101932314935.08 3MTECHN +3802BARTHELEMY JEAN 11951 11976051994041471512025.77 3MESP +1871FELIX JEAN CLAUDE 11951 419811119870411131 9657.08 3SSANS +0467MALMAISON HENRI 11952 81976041992011578112722.66 3MANGL +4342PEYRE ANDRE 11953 519820419810411389 9851.64 3MESP +4047DORDOGNE GERARD 11954 11984081993011471512025.01 3MANGL +0870CHARBONNIERE HERVE MICHEL 119541219860119850111131 9658.11 3MANGL +5403CLEMENT RICHARD 1195511198103198910 2079 1.27 3MANGL +2799LOUBET HENRI 11955111980051995041249910473.33 3MANGL +8532LEDRU GERARD 11956 41975061992081868714506.76 3MCOMPT +6909NICOLAS SYLVIE MARIE FRANCOI21956 91977041992021471512026.04 3MALLEM +4518CLAUDE BRIGITTE 21956 21978041992021471512025.74 3CSANS +9477MERE MARIE LAURE 2195612199201199101 7803 7679.73 3.SANS +5508BATHIE PAUL 11957 31979051995041249910473.65 3MSANS +8413MARRONIERS ROBERT 11957111979121992011471512025.46 3MANGL +4314MAUGARNY VERONIQUE 21958 11978071992121471512026.22 3MTECHN +4329MAREUIL JEAN PAUL 11958 21981051994011471512025.56 3MVENTE +8123CANADA FRANCOIS 119581219940719930711389 9852.20 3MCOMPT +8870NEUVE JEAN FRANCOIS 11959 81978071992091471512025.02 3MTECHN +8119RAMPART PIERRE 11961121981061993051527112374.76 3MALLEM +7639ASSAS ERIC 119611019850119840111131 9657.96 3MANGL +7720SIFFRET PATRICK 11961 719870319870410791 9502.58 3MVENTE +5003PUYBERNARD DANIEL 119611119930419920410024 8999.03 3MSANS +8713VAGNE FREDERIQUE JOSEE 21961111982021981091608112916.97 3MANGL +1064CASSANYES JACQUES 11962121988061995011373711327.43 3MSANS +6331CORMIER MIREILLE 21962 51985091984091249910472.33 3MSANS +8037FARRERE JEAN LOUIS 11962 91987071992052529918967.97 3MVENTE +2186JOZON CLAUDINE 21963111984091992011949415051.54 3MSANS +6036VERQUIERES YVON 119641119880719911010407 9271.97 3MSANS +7970FOIRAIL MARC 119641119850319840310791 9502.86 3MALLEM +1484VICTORET NICOLE 21965 5199610199510 8359 7952.10 3MANGL +7412FLERS GUY 11965 219880219870210407 9270.06 3MSANS +3857DENIS BRIGITTE 21965 91993091992011202810240.55 3MESP +5856ILIZ THIERRY 119651119860519850510791 9503.61 3CALLEM +0008CESAR ERIC 11966 91987081986081249910472.87 3CANGL +8742MONTANT CATHERINE 21966 91993101992011202810240.28 3MALLEM +9552LACOMBE FRANCK 11966 51989021991121450311832.47 3MSANS +4423ROC CLAUDE 119671019931119930110024 8998.17 3MSANS +2631MORIZET SERGE 11967 51988041992051450311830.88 3CSANS +2963BEAUMONT PASCAL 11968 2199306199301 9597 8728.13 3MINFOR +1467OTTO JEAN 11968111991111990111467711987.67 3MANGL +9461BARREAU PHILIPPE 11968 11990011989011202810240.08 3MSANS +8108ARCANG PATRICK 11969 51990021989021381911365.41 3MSANS +7093HERAULTS DANIEL 1196911199408199308 9597 8728.82 3CSANS +3952LEDOUX VERONIQUE 21969 919910919900911389 9851.84 3MSANS +7563SUPER THI VIET 11971 21990081994011249910473.67 3MSANS +4441MIRAPOL DOMINIQUE 21971 819930619920611389 9851.34 3MSANS +2892LOTS THIERRY 11971 2199303199510 9597 8728.23 3MSANS +5535HOULGATES PASCAL 11971 6199607199507 7803 7681.13 3CSANS +2838PLAGE JEAN LUC ANDRE 11972 11992071991071420611638.68 3MTECHN +9036MERCEDES YVES 11972 51993101992101420611639.01 3CSANS +2537MONTSOURIS PATRICK EMILE 1197211199505199505 9597 8727.87 3MALLEM +0228AUBERTS JACQUES YVES 11972 6199404199201 9597 8729.43 3CVENTE +5626VERNEDE ROGER CL 11973 41994101993091450311831.06 3CSANS +6525AVES SYLVIANE 21973 2199204199104 8656 8145.93 3.TECHN +9781OLLIER ANNE MARIE 21973 619931119921111389 9850.97 3CSANS +1379ROSTAND PIERRE 11974 4199507199504 9126 8457.54 3MSANS +5204CRAVANT DOMINIQUE 11974 1199601199501 7803 7681.40 3CSANS +6619HORIZON JEAN MICHEL 1197410199606199506 7803 7681.44 3CANGL +5826VALBONNE ANTOINE 11974 71993091994081202810240.77 3CMICRO +0256GRANG DOMINIQUE 21974 5199508199408 7590 7563.95 3MTECHN +4230FAISANDERIE ANNE MARIE 21974 819930819920811389 9852.69 3MALLEM +4212ORME HERVE 11976 8199606199506 7803 7681.44 3CSANS +6753PINTADES HERVE 11977 9199608199508 7803 7679.99 3CANGL +7715VAILLANT CHANTAL 2193111198801199302 7677 7603.76 4.ALLEM +8632CLAIRETTES JACQUES 11935 51964081994011557012566.54 4MSANS +3535CASANOVA THIERRY 11936 91963081995112022115555.22 4MESP +1574AVENUE PIERRE ALAIN 11936 719890119920811131 9657.20 4MINFOR +4591VINCIN NICOLE 21939121966071993012137316332.68 4CSANS +3788POTERIE MICHEL 11939 81972061990011403411520.75 4MALLEM +0118BRETHON GUY 11939 419871119950310407 9270.03 4MSANS +2869LIMERGUE BRIGITTE 21939 91963041991072273717260.91 4CANGL +8403BOSQUET FABRICE 11939 81966071990011433211714.79 4MSANS +3617VATA JEAN 119401019930819910110407 9270.62 4MSANS +4772SAENS BERNARD 11940 719900519890510024 8999.04 4MSANS +3869MARIUS MIREILLE 21941 81961101995072137316330.70 4VESP +3900PERDONNET PHILIPPE 11941 119921219911210407 9270.44 4MSANS +7958CARDINALE ROSELYNE 21942 21963101992072137316331.25 4MSANS +9381LOTOS CAROLINE FREDERIQUE 21942 11968011990011932314934.90 4MESP +1020FLORIDE KATIA 21942 71972071993111834514276.10 4DSANS +9843MEON GERARD 11943 41973101991011621213032.20 4MSANS +0204GAILLARD CHRISTIANE 21944 71964071993012137316331.82 4MSANS +1733VUE CATHERINE 21944 61963111992072137316331.78 4MVENTE +6248AYGUESVIVES MICHELE 21944 41970071991071684813421.33 4MANGL +4598FEUILLERAIE JEAN MARIE 11945 219890119910610791 9502.23 4CSANS +3077SAPIAC ALAIN 11945 71971111991012470018542.09 4MANGL +2431RENAUDES NADINE 21946 61968111990012137316330.56 4CSANS +1120SATUR JOSIANE 21946 51969031990012137316331.03 4CSANS +0145ITALIENS EDITH 21946 81968111984062470018540.30 4CSANS +4624COURDIMANCHE JEAN LOUIS 11947 81968121989102273717259.95 4MTECHN +8599LONGCHAMP JOSETTE 21948 7199201199101 7803 7679.49 4.ANGL +3219SERNAGLIA FREDERIQUE 21948 51969031968031326611016.35 4MMICRO +7793ANATOLE ERIC 11948 519910119941010024 8998.50 4MSANS +4753VENT JEAN MARC 11948 61970011988012273717261.76 4MSANS +5892CHARLEROI MARTINE 21949101968111992091834514275.70 4DSANS +8687GOELETTES JEAN LOUIS 11950 91975041995011578112721.71 4MSANS +5669ADRIENNE CATHERINE 21950 61972101991072017815517.59 4CESP +2743CLAIR MARC 11950 11978031994011369311286.26 4MANGL +1234DAMPIERRE MICHELLE 21950111969081995042334017608.88 4MSANS +9403LECLERC CLAIRE 21951 71971071991042137316331.51 4MSANS +0934ENCLAVE JEAN CLAUDE 11951 21981051990041621213033.38 4MALLEM +9416BLEU JEAN CLAUDE 11951 21976051991011369311286.78 4MSANS +9196PYANDIERE MARIE NOELLE 21951 41982021981021326611016.03 4MSANS +3568MOISSAN JEAN PAUL 11952111976071991071578112723.29 4MALLEM +7750TONNELIERS MARIE 21952111973011993071471512024.35 4MINFOR +2095MARS BRIGITTE 21952 81984011992011288210744.49 4DMARKT +4777GORBIO MARIE DENISE 21953 61973061991011578112723.74 4MALLEM +8945VASSY MICHELLE 21953 11973051993041471512025.88 4MSANS +3712MAURUCHES PHILIPPE 11953 819860119850111131 9658.99 4MALLEM +6740EUZKADI JOEL 11953 11973031990071578112722.87 4MANGL +7024BRUSC EVELYNE 21953 71976041991121578112723.36 4MMICRO +8219INFIRMERIE JEAN PAUL 11954 91980051990101608112916.59 4MANGL +5540BRUAND DANIEL 11954 51974031993031684813422.75 4MANGL +7460MATISSE MARGIE 21954 61975041991101578112723.42 4MANGL +2655THEZAN MONIQUE 21954 91975081991091578112722.28 4MSANS +9672BORON ERIC 11955 51975081992102017815516.74 4MSANS +8145BOULETS DOMINIQUE 21956 1199105199005 9894 8921.63 4MSANS +3110CERF VALERIE 21956111993081992011249910472.37 4MTECHN +7652BAY PATRICK 11956 71976071992011578112722.47 4MCOMPT +4074FRANK DANIELLE 21957101992111991011202810241.17 4MSANS +4741ESCOUTADOU FRANCOISE MARIE 21957 2198901198505 8656 8145.06 4.ANGL +0933SOUCARRADE BEATRICE 21957 5199312199212 9894 8922.21 4MALLEM +7852CAILLOTS CLAUDINE 21958 71978091992091471512025.14 4MSANS +5344THEODORE CHRISTINE 2195811199310199210 7803 7680.44 4.SANS +8813MILLIERE BEATRICE FRANCOISE 21959 51981071980071202810241.36 4MSANS +5426NATIONS ISABELLE 21959101981111980111463211946.14 4MSANS +4656TILLET FRANCOISE 21960 71983041982041608112916.59 4CANGL +8524ALLIER ANNE MARIE 21960 1199209199109 8656 8146.28 4.SANS +0380MARAINVILLERS NATHALIE 21961 2199410199310 8656 8147.15 4CSANS +1404FAISANS ERIC 119611219830319830811131 9658.86 4CSANS +6501MERICOURT FRANCOISE 21961 519951119941110668 9426.09 4MANGL +4607CHAPPEL CHANTAL 21961 41982091981091330611017.46 4MANGL +1959PEY JOSIANE 21961111982111981111608112916.95 4MALLEM +8843TIMSIT HUBERT 11961 61982041988011326611017.25 4MSANS +1688BENOITE JEAN CLAUDE 11961 91987071992121249910472.51 4MTECHN +5712FOUENT VINCENT EMILE 11961101983071982071326611016.03 4MSANS +7184FRANCE RAYMOND 11961 419880319870310024 8998.35 4MINFOR +5235HAUTS YANNICK CLAUDE 11961 819871019861010791 9503.90 4MVENTE +6310PEYRIGOUE PATRICK 11962 81982031989071326611016.78 4MALLEM +5397COURCELLES MIREILLE 21962 9198810198505 8656 8145.89 4.SANS +4469PASSELEU CHRISTIANE 21962 41984011983011381911366.72 4MANGL +8234MAIAUX BRIGITTE 21963111991071991011249910473.22 4DANGL +9770JARD MINELLE ODILE 21963 91988111987111249910471.84 4MSANS +5324CERF CLAUDE 11964 419870719920510791 9503.34 4MSANS +9061ROMAGUE MARTINE 21964 71983111982111326611016.12 4CANGL +8920PORQUIER DANIELLE 21964 41987021986021527112374.66 4CALLEM +7098CHATENAY ANDRE 119641119841019831010791 9503.94 4CVENTE +8128PRECONIL YVES 11965 71988021987031527112373.94 4MSANS +6719KEFYSSIA CHANTAL 21965 319940619920111389 9851.03 4MSANS +6244MANGEON MICHELINE 21965 8199402199304 7803 7680.34 4MINFOR +3461LUCIA CHRISTIANE 2196610199308199208 8656 8145.56 4.ANGL +9241ROTOURS PIERRE 119661119900819890810024 8999.13 4CSANS +6268TOURING GENEVIEVE 21966 1199403199303 8359 7952.46 4MSANS +4829COLLES EMILE 11966 419910719900710024 8998.31 4MESP +0750CADET YVES 11966 919860419850410791 9503.79 4MTECHN +0057ESCALE THIERRY 11967 71989021988021450311831.93 4MSANS +9924CHINON BRIGITTE 21968 8199207199107 8656 8146.65 4.SANS +7821AILES CECILE 21968 41991051992111202810239.81 4CSANS +7114LANCIER WILMA 21968111994031992011202810241.07 4CESP +4765TILLEULS JEAN 11969 51992041994011249910472.59 4MINFOR +4429EDOUARD FRANCOIS 11969 319890419921010407 9272.09 4MINFOR +1431GIORDAN SONIA 21970 5199201199101 8656 8145.51 4MANGL +9920BOUIN CATHERINE 21970 919900419890410876 9502.28 4MSANS +5522AURELIA MARIE CHRISTINE 21971 31993031993051267210590.24 4MSANS +7479TRINITE NOEL 11971 3199604199504 7803 7680.36 4MSANS +3516GASPARDES KUMIKO 21971 41993061992061267210590.05 4MSANS +5784BOITE REMY 11972 819910619900610024 8998.26 4CANGL +1143MACORNAY ROGER 11972 6199212199112 9597 8728.58 4MSANS +0244FEUQUIERES CLAUDINE 21972 719921019911011389 9851.57 4MSANS +0161LONGAGES FREDERIC 11973 119920819910811389 9852.02 4MSANS +5206TISSOUS ELIANE 2197311199405199305 8359 7951.97 4CESP +6992FOUGERAIE JEAN YVES 119731119931219921211389 9852.45 4CSANS +3522REST ANNICK 21974 9199306199206 7803 7680.08 4.TECHN +9573FONTAINE CATHERINE JEANNE 21975 2199407199307 7803 7679.87 4CSANS +5048HAUTES JEAN RENE 11975 619961219951211389 9850.74 4CSANS +1152QUARTIER MARTINE 21975 6199408199308 9894 8921.41 4CSANS +0049LAUNAY NOUARA 21976 6199607199507 7803 7679.85 4CSANS +4557ROBARESSES HELENE 2197611199507199407 7803 7680.53 4CANGL +4244GEMEAUX DANIELE 21977 9199608199508 7803 7679.33 4CALLEM +0257PUNAAVIA GUY 11935 219930119920110407 9271.82 5MSANS +4173ALPINS FRANCOIS 1193510198811198505 8827 8263.65 5.SANS +5358CHEVRY JEAN DENIS 11936 9199503199201 9085 8418.03 5MCOMPT +4903WILSON SERGE 119361119890119930210791 9503.49 5CMANAG +2411BINEAU RENE 11937 41970081991011433211713.71 5MSANS +5097OURS MADELEINE 2193910198810198506 8656 8145.20 5.SANS +1099VILLAINE YAN CLAUDE 11939101968061990011433211713.58 5MINFOR +0060ATTAMRK CORINNE 21939 41962061983102470018542.06 5MSANS +7199LECONTE EDMOND 11940 51972061995012201216757.94 5MSANS +7870PIA PHILIPPE 11940 71967071991101433211715.00 5MSANS +4990ROSSAYS SERGE 11940 21963091988012273717260.31 5MSANS +3381BUSSEROLLES ISABELLE 21940 8199505199201 9085 8418.09 5DSANS +0099RAHAL PHILIPPE 11940 11961051984062470018541.16 5MSANS +5909TOURRETTES LILIANE 21940 91961101983102470018540.93 5MTECHN +8941BEZIERS CLAUDE 21941 11961051992102137316332.72 5MSANS +7223CHARMETTES MARCO 11941 41972091991011433211714.06 5MSANS +8980LARMINAT FRANCOISE 21941 4198910198512 8656 8146.16 5.INFOR +1164PROVENCAL NICOLE ALIX 21942 91968101991072273717260.89 5CSANS +7010DELOISON SYLVIA 21942 51968121991101932314934.72 5MSANS +3304ROSES MARIE THERESE 21942 81968091993111834514275.11 5MSANS +7469BUTTE MARIE FRANCE 21943 21962121991072273717261.13 5MSANS +8184VANNES MARC 11943 11971051994011621213032.96 5MSANS +1647CLAIRES CEDRIC 11944121969011991011433211713.67 5MTECHN +0926BEACH CLAUDE 21944 41970041991101932314934.45 5MANGL +3781COULANGES CHRISTINE 21944 61965021992091932314934.21 5VSANS +7004GUILBAUD MARTINE 21944 41966061995042137316330.61 5MSANS +5511CAPUCINS JACQUELINE 21944 41965121990082470018540.74 5MSANS +0535OLLIERES MARIE JOSE 21944111964071993072137316331.95 5DALLEM +6700DOLET FREDERIC 11944 91973041992011403411521.64 5MSANS +9005SUCE LYDIE 21945111977061992011471512025.50 5MTECHN +2933PEGOMAS MONIQUE 21945 81982061981061326611016.62 5VALLEM +1543GATTIERES MICHEL 11945 81970091991041433211715.59 5MSANS +0725AUBIERS PHILIPPE 11945 91976051993011369311286.75 5MANGL +2098ENTREES ANNY 21945101968061994102666519899.56 5MSANS +8761WAGRAM JEAN FRANCOIS 11946 21971101988061932314935.35 5MTECHN +2003PAULINE AGNES 21947 2199303199203 8656 8146.59 5.SANS +1732RELAIS GILLES 11948 31970031993111834514274.96 5MSANS +6970THIERS MICHEL 11948 71970101994071834514274.42 5MALLEM +4216HUGO FRANK 11948 21971031991012990722149.47 5DALLEM +6627ABBAYE GERALD 11948 619810319800311389 9850.65 5MANGL +5230DUNANT PHILIPPE 11948121983101993041326611016.87 5MANGL +2460POINTE DENIS 11949 51975081992011578112722.47 5MANGL +7858ARBONNE FRANCIS 11949 71974081992012470018541.70 5MSANS +3903CHAMPAUBERT PIERRE J 11949 41976101992011369311286.24 5MANGL +8857DIVE MYRIAM 2195012199311199211 8656 8146.88 5.SANS +0497KARINE JEANNINE 21950 5199311199211 7677 7604.39 5.SANS +3876SANGUINAIRES FLORENCE 21950111970021991091834514275.86 5MTECHN +3265PAVILLON PHILIPPE OLIVIER 11950111970041987102470018542.13 5MSANS +2421VERDIER MARTINE 21950 41970071994031834514274.80 5MANGL +8685PROVENCALES JEAN MICHEL 11950 11978061992121471512026.06 5CANGL +6880CHARONNE GISELLE 21950 21971031994071834514275.47 5MCOMPT +3995BELLEVUE CHANTAL 21950101977011992011471512024.48 5MSANS +1936MANHASSET JULES 11951 31970101991021834514276.22 5MVENTE +8771MAURIN JEAN MICHEL 119511119930819910110791 9503.74 5CSANS +8918MORON DANIEL 11951101971031986072470018541.02 5MCOMPT +7486HAUTACAM JEAN PIERRE 11951 11979061992011249910472.78 5MSANS +8979PARE LUCIEN 11952 41973071991041578112723.72 5MSANS +8316MOUSLIM PASCAL 11952 31972051990071621213032.39 5CSANS +0252AUNES CLAUDINE 21952 71972051992111684813421.69 5MALLEM +4525CHAVONNES FRANCOIS 11952 31976111992071578112721.79 5CANGL +2153CROULEBARBE JEAN JACQUES 11952111972121994011684813423.34 5MSANS +4523PITARD JACQUES 11952 91973081990123417325097.24 5MSANS +0877MILLION CLAUDE 11952 31974121992012017815516.65 5MALLEM +0553CRABERE HERVE 11953 91979051992121471512025.97 5DANGL +4593COLLINES FRANCOISE 21953 81973051994031911114779.59 5CSANS +5525MILLY JEAN HUGUES 11953 11976091991012022115555.39 5MSANS +8419CREMIEUX CHRISTIAN 11953 71972071991072137316332.68 5MSANS +5466CHENEY JOSE 11953101977031994011578112723.31 5MALLEM +8647MOTHE DOMINIQUE 11953 21984071992051326611017.10 5MVENTE +7550BORDEAUX GILBERT 11953 8199006198709 8656 8146.61 5.VENTE +5317SIMAREGRE MARION 21954 21975081993071608112916.88 5MSANS +7895BEAULIEU ALAIN 11954 41982031994011471512025.55 5MSANS +7110BRUNES MICHELINE 21954 91977011994011471512024.69 5MSANS +9833MOULINS FLORENCE 21954 3197505197405 8530 8066.58 5MSANS +9346RIVIERE BRIAN 11955 31980081992011249910473.42 5MESP +3155ALAUDA CATHERINE 21955 51977051993071471512025.55 5MSANS +4303MARJORIS PATRICK 11955121980041992121369311286.96 5MSANS +8955LACRETELLE ANNE 21955 419960719950710668 9426.57 5DSANS +0292ENCLOS CHANTAL 21956101977071977041834514275.97 5MVENTE +7044ENGHIEN GERARD 11956 11978061992041369311286.93 5DESP +3352LOZERE SERGE 11957 81983021991092529918968.46 5MANGL +7626HENIN PHILIPPE 11957101986081993011168610046.99 5MALLEM +1198MARTYRS WILLIAM RENE 11957121977031991052043315671.24 5CSANS +4601CEYZERIEU PHILIPPE 11958101979121987111684813421.72 5MSANS +6850BEAUSOLEIL BRIGITTE 21958 81981031986021527112374.79 5MANGL +0505CLAPIERS MARIE CLAUDE 2195810199403199303 9126 8456.57 5MSANS +6127MONTEE CHRISTINE 21958 31980091994071471512024.15 5MSANS +4080FOCH SERGE 11959 319810319810511131 9658.24 5MSANS +8151ECUREUIL OLIVIER 11959 21989071996012815620945.31 5.TECHN +2121BOURDAILLERIE SIMONE 21959 11979071993041471512024.56 5MSANS +5078FERNAND ANNE MARIE 2195912199110198510 8656 8146.61 5.SANS +2667BERGERE PIERRE 11959 51978061985041684813422.48 5MANGL +2407SOLEIL NADIA INGRID 21959 61989061988061249910472.73 5MTECHN +2235VILLEMARECHAL GERARD 11959 61983061989121326611017.72 5CINFOR +0110ANDRE NADIA 21959 319930519920510363 9233.61 5MANGL +4644AVIGNON CHARLES 11959 519830319920611131 9657.56 5MANGL +7070MONGE HONORINE 21960111980051985061608112916.23 5MSANS +8043EGAL LIVIA 21960 11985101984101288210744.85 5CTECHN +5249THEODULE REMY 11960 41987051991041949415052.11 5MALLEM +7737CLUB ISABELLE ANDREE 21960111980061994011471512025.77 5MANGL +3853DZOANH CHRISTOPHE 11960 61988101994041288210744.58 5MANGL +2653MARSACQ CLAUDE 11960 31985111984112256617146.01 5MTECHN +6452POSTFACH ALAIN 11961 31985081984081288210744.98 5MTECHN +0681LOGE PASCAL 11961 11985031991021527112372.86 5MSANS +9537JEAN MICHEL 11961 31988061991121249910471.84 5MVENTE +6327NOUES ANTOINE 11961121982101981101608112916.14 5MSANS +6682VATONNE BRIGITTE 21961 71982011981011608112916.65 5MSANS +9847GAMBADES JOCELYNE 21961101982011981011288210744.17 5MANGL +6375GAUTIER CLAUDUNE 21961101984071994011450311832.63 5CINFOR +6651RIVA PIERRE 11961 919830619820611131 9657.62 5MSANS +1485REUILLY JOSETTE 2196212198901198603 8656 8146.41 5.ALLEM +9501BETHUME MICHEL 11962 81985031993041326611016.65 5MSANS +9435PROVENCE JEAN MARC ROBERT 11962 919940919920110024 8999.30 5CSANS +6492VENDELAIS DANIEL 11963 119830419820411131 9657.66 5CINFOR +9242REVELLATA BRUNO 11963111987071993041288210744.41 5MSANS +4454ETANG BEATRICE 21963 31983081982081326611017.61 5MESP +7265AMPHYTRION JOEL 11963 31990091993041249910472.78 5CSANS +2299ADRIAN ALAIN 11963121988101987101288210745.70 5MESP +8642ALE MYRIAM 219631219940719930411389 9851.34 5MALLEM +9850BOULOURIS CHARLY BERTRAND 11963121987091986092090215980.25 5MINFOR +3445COLOMBE SYLVIE 21964 319870619860611389 9850.74 5MSANS +1844GUY PAUL 11964121985121994011433211715.27 5MANGL +7102QUINQUENAIS MICHEL 11964101984091994041574112685.17 5MSANS +1584KERVENEL JEAN CLAUDE 11964 71984061987121288210745.76 5MANGL +2604LIBERATION FRANCOIS DANIEL 11964 819841019840810791 9503.36 5MSANS +0403HERMITTE PHILIPPE 11964 61983051993051527112374.04 5MSANS +5722CHATAIGNERAIE LIONEL 11964 91983121992061527112373.67 5MSANS +3237HUYMANS MICHEL 11964 21984021990011527112372.81 5MALLEM +5398TASSIGNY CHANTAL 21964 51988111987112090215981.24 5MSANS +1027VRAUX PHILIPPE CLAUDE 11965 91993091993031202810240.76 5MSANS +3198BERIN DENIS 11965 81987011994091693613499.07 5MANGL +1036MADAME EDOUARD 11965 81986091985091288210744.77 5CSANS +6124ABELIAS DELIA 21965 519940919930411389 9850.65 5MSANS +1462BLANCHE MARIE FRANCE 219651219940319930311389 9852.60 5MTECHN +0587ORMEAU GENEVIEVE 21965 51990011989011249910471.76 5CSANS +8260BROSSAY JEAN PIERRE 11965 319931119911010407 9270.24 5MESP +8146BROC ANDRE PAUL 11966 319940219920110024 8998.37 5MANGL +8310HOTTINGUER ISABELLE MADELEINE 21966 1198906198512 8656 8145.98 5.INFOR +6654TAHITI MARIE LOUISE 21966 6199501199401 9597 8729.13 5MSANS +5470LAGARDELLE XAVIER 119661119900719890710407 9271.97 5MSANS +8823ROUCHERETS EVELYNE 21966 61985101984101249910472.06 5MTECHN +8327BARRELLET PASCAL 11966 41987021993121288210743.92 5MTECHN +8879GROULT ANNE MARIE 21966 41993011991011202810241.70 5CANGL +5928DREZERY ALAIN 11966 91989081988081539912453.11 5MSANS +3229THOMAS SABINE DOMINIQUE 219671019940519920111389 9852.59 5MTECHN +1136BRECHE MARIE AGNE 21967 3199601199501 9126 8456.70 5MANGL +5446POMMERAIE GUY 11967 8199606199506 8656 8145.80 5MSANS +0654CARAVELLES ROBERT AH 11967 81989071989021450311831.55 5MANGL +0015TAVANNES LOAN 21967 419930619920610024 8999.72 5MINFOR +8197NETTER GILBERT 11967 61987051994041249910472.06 5MSANS +5236PASSERO MARC 11967 8199309199209 9085 8418.26 5CSANS +3054WILSON GERARD 11967 119870919860910407 9272.09 5MSANS +9725GUILHEM DANIEL 11967111990021989021539912451.67 5MSANS +6092CLEME MARIE CHANTAL 21968 3199201199101 8656 8146.46 5.SANS +2456HOLBERN FREDERIC 11968 2198902198802 7207 7448.96 5.ANGL +6716VILLERSEXEL TANGI FRANCOIS 11968 2199306199206 9597 8727.78 5MSANS +6119RAVAS ANNE MARIE 21968 6199502199402 8656 8146.19 5MSANS +2294VILLAGE SYLVAINE 21968 91992041991041202810240.68 5MINFOR +8140CAMIN JEAN MARCEL 11968 51988121993121249910473.45 5CANGL +7302MERIDIEN MAURICE 11968 219880519910210407 9271.32 5MANGL +7914JOLI MAURICE 11969 31989041992121249910472.06 5MANGL +2148ESPAGNE BRUNO 11969 819920319910310024 8999.36 5MSANS +1823BOUCICAULT NICOLE 21969 519941019930411389 9851.82 5MSANS +9657MAGESCQ EMMANUEL 119691119920519941010024 8999.97 5CSANS +9896MIO JEAN 11969 11991101990101330611017.19 5MTECHN +8478SOURCE SIDNEY 11969 61989041988101249910473.49 5LSANS +6336HASARD ERIC 11969 4199305199205 9597 8729.63 5CANGL +5471LEVAINVILLE LAURENT 1197011199301199201 9597 8729.97 5MVENTE +5314HALLES JACQUES 11970121991101990101467711985.86 5MSANS +1685NORMANDIE MICHEL 11970 319900719890710024 8999.40 5CANGL +6830LAOUADIE GWENAELLE 21970 2199608199508 8359 7953.65 5MTECHN +1727CAUVETS MARTIAL 11970 7199311199409 9597 8728.99 5CSANS +5830BRIOLLAY JEAN PAUL 11970 21991011994011249910473.24 5MINFOR +8526CAMPION FRANCOISE 21970101991111990111202810240.91 5MANGL +6622TANANARIVE GILBERT 11971 51992071992091330611016.75 5CSANS +7788JOCELYN CHRISTIAN 11971 6199302199202 9597 8728.05 5CESP +2781SAFRENIER PIERRE 11971 8199301199201 9597 8729.63 5CSANS +6277PAULEL HERVE 1197112199403199201 9597 8729.54 5MANGL +6618NOTRE PIERRE 11972 519930919920910363 9232.44 5MSANS +6648SAKAKINI BERNARD 11972 319920419910911389 9851.24 5MANGL +8593JULLIEN JEAN PIERRE 11972 8199604199504 9894 8922.45 5CVENTE +8229CHANTELOUP CHANTAL 21972 11992101991101420611637.21 5MSANS +8361OUCHES FRANOISE 21972 4199508199408 7803 7680.80 5CSANS +3075LUMIO JEAN LUC 11972 41991111994011249910472.52 5LSANS +5865FERROLLES MARIE CECILE 2197210199403199303 7803 7680.27 5MCOMPT +0134SEVRES DOMINIQUE 11973 5199507199407 7803 7679.72 5CTECHN +4254HENIN SERGE 11973 3199409199510 9597 8728.17 5CSANS +8695AMBASSADE MARIE BEATRICE 21973 8199605199505 7803 7680.62 5CALLEM +4411DAVOUST FRANCIS ALAIN 11973 719930419940711389 9851.73 5CCOMPT +3332COUST JEAN PIERRE FLORENT 11973 2199507199407 7803 7679.46 5CSANS +4946SAUVAGE PATRICIA 21974 5199604199504 7803 7680.77 5MSANS +1918BABY DOMINIQUE 21974 519941019950810668 9425.45 5MINFOR +6316CORENTIN MARTINE RENEE 21974 119930919920911389 9851.84 5CANGL +3700PROSPER MARTINE 21974 4199508199408 7464 7524.42 5CANGL +2405COUDUN WALID 1197411199605199505 7803 7679.55 5CALLEM +7545DELEY MARTINE 21975 2199606199506 7803 7679.91 5MSANS +3372HARRETCHEVERRIA FRANCISCO 11975 3199506199406 9894 8921.49 5CALLEM +4733SIMON CATHERINE 21975 9199608199508 7464 7525.73 5CESP +3419LAVIROTTE MICHELE 2197510199507199407 7803 7679.76 5CALLEM +3469VASNIER CORINNE 21976 6199607199507 7803 7679.73 5CSANS +7472VERLAI JEAN MARIE 11977 3199606199506 7803 7680.84 5CSANS +5601PEYNIBLOU ROBERT 11977 1199606199506 7803 7680.44 5CANGL +3668NARCISSES MARIE FRANCE 21977 9199606199506 7803 7681.07 5CSANS +9202GARE BRIGITTE MARIE MADEL21977 3199507199407 7803 7679.58 5CTECHN +4110KEROUAL FABRICE 1197711199607199507 7803 7679.54 5CSANS +3531OUCHE ALAIN 11935 31965081995011557012568.13 6MSANS +3428DAUPHINS NOUNA 21935 81967011990071578112723.50 6MSANS +8594BAIE JACQUES 11936 51962021994033844228045.97 6MALLEM +1267ORGE GERARD 11938 41964041994011557012567.81 6MSANS +7513PINSONS PATRICK 11938 41963071995082947921839.78 6MSANS +4234DORMANT CHANTAL 21939 71970011991011932314934.66 6CINFOR +4904PANORAMIC LAURENCE 21940 9198901198610 8656 8146.50 6.SANS +3727GUYNEMER VERONIQUE 21940 51972051989101621213032.21 6CSANS +8364COUDERC ANNICK 21941111973101990071621213033.61 6CANGL +1743VALLEES GERARD 11941 71970041995062470018540.61 6MANGL +5058LIBERATION THIERRY 11941111973101991011403411521.37 6MSANS +8875BRAILLE CLAUDE 11941 71974041989101834514274.74 6MSANS +5325HESPERIDES JACQUES 11942 81963041991072273717260.64 6MANGL +9083PONS JEANNE 21942111972101994041894014662.64 6MSANS +3082SIROIS JEAN 11942 11965111989071663613342.67 6MANGL +0164ENCRABE DOMINIQUE MARIE 21942 8198810198410 8656 8145.03 6.ANGL +5264PARLY MARIE HELENE 21943 61963031993032922321685.16 6MANGL +3102GRDE GERARD 11943 11966061991012470018540.24 6MANGL +6225GRAVAS GILBERT 119431219750819881211389 9852.47 6MINFOR +0486TOCQUEVILLE MICHEL 11943 71965061990012470018541.72 6MSANS +6103DAUDIN MICHEL 11943 31971081991071433211713.97 6MANGL +9562JULES MARYSE 21943 71962091984062470018540.75 6VANGL +1659EVANS MARIE NOELLE 21944 21963121994072137316331.91 6MSANS +5753SAXE BERNARD 11944 51964111985063200223582.85 6MSANS +5551AMBROISE GILES 11944 21972081991012470018541.97 6MSANS +2734FELICE PHILIPPE 11945 91970051991011433211715.24 6MSANS +2627SAVIGNY ANDRE AUGUSTE 11945 71964121990052470018542.04 6MSANS +2707VAUGIRARD HELENE 21945 8199407199307 7590 7562.63 6MSANS +0420DARDOUNELLES DANIEL 11945 21971021990011433211714.52 6MINFOR +0574JAURES MARC 11946101972081994011663613343.70 6MANGL +4658BORA JEAN PIERRE 11946 31973091992011403411520.69 6MMARKT +2852BERLIOZ PASCAL ALAIN 11946121969111991012273717260.45 6MSANS +9183STATION BERNARD 11947 61976101991011283810705.62 6MSANS +7225BONSECOURS ANNE 21947 51976071993111471512024.74 6DSANS +5915ANTILLES ISABELLE 21948 61969081995101433211714.47 6MSANS +7173GIOTERAIE ROBERT 11948 61967111986042470018541.91 6MANGL +7940NICOT ERIC 11949121974041992011403411520.15 6MSANS +6066CLEMENCEAU YVES 11949 31971041995012201216756.31 6MSANS +8113VITRY DOMINIQUE 21949 7199311199211 9597 8728.28 6DVENTE +6047TASSIGNY THIERRY 11950 41973081994122470018541.72 6MTECHN +9002BERRAT BRUNO 11950 51977051993041369311286.29 6CANGL +8038AUDIBERT PATRICK 11950 719770119931211389 9850.58 6MINFOR +4759BLANCHE MAYAKO 21950 51970101991071578112723.11 6MSANS +6982CYRANO DANIELLE 21950 51974111991071578112723.74 6CANGL +9782BARRAGE CLAUDINE 21950 3199109198902 8656 8146.01 6.ANGL +4552ABBADIE MONIQUE 21950 61976011991101578112722.87 6MANGL +3112AGENT DANIELLE 21950 11993121992011202810240.31 6MESP +4893GRANDE ISABELLE 2195012199507199301 7677 7604.70 6MINFOR +6863FERTE MARIE JOSE 21950 71970101991012137316330.65 6MINFOR +3487TALARIC MICHELINE 21950 21973101991071578112722.51 6MANGL +7125FERRAYONN JEAN MICHEL SERGE 11951101977101994041249910473.47 6MVENTE +5445RON DOMINIQUE 11951121971101991013200223582.31 6MSANS +0070PLASCASSIER DANIEL 11951121975051991011369311286.30 6MSANS +0688PARGAMINIERE JEAN 11951101976061993011369311286.15 6MSANS +0032FOUR CLAUDE 11951 61975111991011684813421.95 6MCOMPT +2442BOULOC MARIE FRANCOISE 21951 31974051986052334017609.66 6MALLEM +3898KENNEDY YVES 11951121977101991011369311287.25 6MANGL +8228LEFRANC JEAN LOUIS 119521219931119910110791 9502.26 6MSANS +7142LEGER VINCENT 11952 81976051991011684813421.99 6MANGL +0571DOMINICAINES JERZY 11952 31971101991013200223582.94 6MSANS +0382KERHAM CATHERINE 21952 21974041991071578112722.07 6MSANS +8150BEARN FRANCK 11952 21982091993011527112372.87 6MSANS +7995BAUDIN DANIEL 11953 91975051994011369311287.19 6MSANS +4159CHASSENARD JEAN BERNARD 11953 519870619860610791 9503.21 6MSANS +3964FAREMOUTIERS LAURENCE 21953 6199311199211 8656 8145.08 6MSANS +0454CHERBOURG ISABELLE 21953 6199610199510 7803 7679.81 6MVENTE +5111CROIZAT CHRISTOPHE 11953111973031990071578112722.69 6MALLEM +2014LISIERE XAVIER 11953 8198911199501 9894 8923.22 6MSANS +9741PARIS PASCAL ELIE 11954101978081991012022115555.53 6MTECHN +0737YERRES GERARD 11954 61976091995042529918968.84 6MTECHN +3053TORRE PAULE 21955 91976061995101881314585.97 6MVENTE +2120CORMEILLE JEAN LUC 11955 5199610199510 8656 8146.74 6MSANS +1540PIJOUNIE ANGELE 21956 51977021981091834514274.87 6MANGL +6259VICQ CATHERINE COLETTE 21956 219780719770710668 9425.82 6MSANS +8345DAGOBERT DJARN 11956 719820919871111131 9658.24 6MINFOR +3734GARNIER PASCAL FRANCOIS 11956101977081994042201216756.71 6MSANS +4365ESSO ANTOINE 11956121976061994011369311288.10 6MSANS +0262ROLLAT HERVE 11956111979081991012175716601.93 6MSANS +7989RHONE YVES 11956 71977051994041249910472.06 6MANGL +4035ISLIP ANNIE CLAUDE 21957 41993101992011249910472.06 6MINFOR +8638DUNOIS JACQUES 11957 51981031995062273717260.50 6MINFOR +6417ALBI RENE 11957111980091993121369311288.04 6MANGL +7559MARIENTHAL MONIQUE 21958 319940919930411389 9852.59 6MSANS +1621CAMBRIDGE ALAIN 11958 8199312199212 9597 8729.04 6MINFOR +3476CREPY ALICE 2195811198711198611 9511 8688.22 6MSANS +2482CHORON EVELYNE 21958 7199110199409 8656 8145.42 6.SANS +4165BALZAC MICHEL 11958 71985121995011433211713.76 6MSANS +9040FERDINAND CHARLES 119581219781019771011389 9852.24 6MANGL +6858CUVRAY MARTINE 21959 71980041994011471512025.82 6MMARKT +2723PAPARA FRANCOISE 21959 61980051994011471512025.70 6MTECHN +1222FOSSES MONIQUE 21959 21980041993121804514081.78 6MTECHN +8741BOULEVARD MICHEL JACQUES 11959 91979021993041471512024.62 6MTECHN +5441ZOLA BRIGITTE 21959111979081993071471512025.82 6MINFOR +9947ERMITA CATHERINE 21959 81982081981081326611017.38 6MSANS +2563FLORISSANT PHILIPPE 11959 51981071989052256617145.21 6MMANAG +3583MOLLAY JEROME 11959 81981031993051608112916.41 6MALLEM +6466ORMES ANNIE 21961 21981081995071433211713.85 6MALLEM +1432AGRIANT ROBERT 11961 31984031991091527112372.83 6MCOMPT +3657NOVEMBRE SERGE 11961 51986071992101527112374.36 6MSANS +5054FRANCK HUGUES 11961111984031983031608112915.87 6MALLEM +7313CRESTET JEAN PIERRE 11961 41984091994091326611017.55 6MSANS +1383ORIOL ANNE 21961 61983021982021288210744.01 6DSANS +9235DANTE JEAN MARIE 11962 71984031993081527112374.13 6MANGL +1924MALVEZIN MARTINE 21962111984071983071608112915.47 6MSANS +0722MUSSE JOELLE 21962101982081981081608112916.65 6MMICRO +2536BEAUSOLEIL DOMINIQUE 11962 219830419851210791 9502.17 6MSANS +3286DEEPFIELD GERALD 11962 319930819921210876 9502.09 6CSANS +9760CHAMPET MARTINE 21962121988101987101202810241.67 6DTECHN +0459FERRAILLONS NICOLAS 11962 819850919840910791 9501.95 6MSANS +9070ROUGUETS JEAN RENAUD 11962 919920519910510024 8999.54 6MSANS +5609MONNEGER GEORGES 11962 61984101993051527112374.00 6MALLEM +8699COLMAR CATHERINE 21962 21988061987061202810241.09 6MINFOR +0121PARAY JEAN FRANCOIS 11963 219830419920311131 9658.07 6MVENTE +9033TIMBAL FRANCOIS 11963 91991021991022529918969.60 6MSANS +0477HORTENSE ALAIN 11963 51984021992101527112374.84 6CSANS +9565CARRETIER JOSE 11963 81986121992121450311830.53 6MINFOR +5210BARTHOU PASCAL 11963 319850419850511131 9657.21 6MANGL +7365GALLAIS PATRICE 11963101984031983081288210745.79 6MSANS +3436TADJOURAH PATRICK 11964 51984061991011288210744.35 6MTECHN +0043HILLS JEAN MARC 11964 719840619830610791 9503.67 6SSANS +6646ROOSEVELT FLORENCE ANNICK 21964 51989111988111249910472.39 6MESP +5680PORSMORIC MARIE MADELEINE 21964 31983041982041326611017.97 6MANGL +6503MONCEY JEAN PAUL 11964 319940219930110024 8998.77 6MALLEM +9162BROSSOLETTE MARYVONNE 21964 91984111983111288210744.28 6MSANS +5895QUATRE DANIEL 11964 31984101993011616712994.89 6MSANS +3689ETOILE ALAIN 11965 31985051992011527112374.54 6MSANS +6754MAXIMIN JEROME 119651119930819920811389 9851.10 6MANGL +1818BOYARDVILLE KINEO 11965 919850519840510791 9501.83 6MALLEM +6998HONORE PATRICIA 21965 31989051994011381911366.18 6DSANS +0086COLLETTE SERGE 11965 41985091991121288210744.14 6MALLEM +2914ESPAGNET ERWAN 11965 21984051983051288210744.17 6MSANS +9284COLIBRIS JEAN JACQUES 11965 41993101992101330611018.00 6MTECHN +5732LEUTHREAU ALAIN CHRISTIAN 11965 11987081992011450311831.39 6MSANS +7234MARDELLE ROGER 11965 81986041993051450311832.14 6MALLEM +2688TILLEUL FREDERIC 11965 619930719940110876 9503.04 6MSANS +6325MIGNEAUX FRANCOIS 11965 419940119920110407 9270.44 6MANGL +0520PIBRAC STEPHANE 11965 219850819840810791 9503.76 6MSANS +5142HUBIES BRIGITTE NOELLE 21966 41991071990071202810241.79 6MCOMPT +2662PEYLONG GHISLAINE 21966 9199201199101 7803 7680.36 6.SANS +5787PRADIER PHILIPPE 11966 11987051994091693613499.34 6MALLEM +0594PARK GILLES 11967 11989101988101249910472.52 6MSANS +9155VIADIEU DIDIER 119671219940419920110024 8998.50 6MSANS +9944STRASBOURG ROBERT 11967121993061992061267210590.24 6MALLEM +0751MONTDAUPHIN CLAUDE 11967 819910319950610024 8998.80 6CANGL +6596INFROIT STEPHEN 11967 41990011994011249910473.45 6MSANS +2539CARTHY ANNICK 21967 41994071992011202810241.09 6MSANS +9966ENFERT BRIGITTE 21967 919930719920711389 9851.37 6MALLEM +8934REGNIER ANNICK 219671019950319930411389 9851.96 6MALLEM +1654LEADER MICHEL 11967101995101994101839014312.60 6CANGL +7794ANEMONES EVELYNE FRANCOISE 21968 11993031991011202810241.66 6MTECHN +5095BLAIRE MARIE JOSE 21968111989101988101539912453.06 6CSANS +3446RICHOIN JEAN PIERRE 11968121990091994121450311832.51 6MINFOR +0591FERON CHRISTINE 21968101994031992011202810240.76 6CSANS +6142SORBIERS ROSWITHA 21968 81993061992061267210589.60 6CSANS +4698JEAN GERARD 11969 51989101991091249910472.96 6MTECHN +9192SAVIGNE ALAIN 11969 31991011990011202810240.26 6MESP +0014NANTAUX ETIENNE 11969121994061992011202810240.46 6MANGL +6632JULLIAN FREDERIC 11969 9199102199002 8656 8145.20 6.SANS +1053MORTIER GUY 11969111992121991121330611016.35 6CALLEM +3261SUCHET MARIE THERESE 21969111994031992011202810239.91 6MSANS +4711BLANCHE ALAIN 11969121992121993031267210589.55 6MCOMPT +5942FLOREAL JEAN PAUL 11969 11990111989111381911366.49 6CVENTE +1744ESPAGNE JEAN PAUL 11969 119900219890210024 8998.41 6MESP +7503TOUCHARD ANNE MARIE 21970 21990111989111202810241.57 6MSANS +2585ESTIENNES JEAN 11970111993111992111330611018.18 6MANGL +8805CHENIER ROBERT 11970 71992071991071420611638.05 6MSANS +7438ROSELINES SYLVIE 21970101994031992011202810240.72 6CSANS +6724POTHONNIER MARIE JEANNE 2197011199206199106 8656 8146.42 6.SANS +5056POINCARRE KARINE 21970111994031992011202810241.45 6MINFOR +2915REILLE MICHEL 11970 7199602199502 9256 8533.59 6CANGL +3988ATALANTE BRUNO YVES 1197012199402199302 9597 8728.68 6CANGL +3548JOURDAN GUY 11970101994061992011202810240.35 6CALLEM +1071CHAROLLES JACQUES 11970 1199306199206 9597 8728.82 6CINFOR +7830BOCH BERNARD 11970 3199304199308 9597 8729.09 6CINFOR +7543REIN PIERRE 11970 9199501199401 8656 8146.05 6MSANS +0754ELANS EVELYNE 21970 5199010198910 8656 8146.07 6.SANS +0414CHARDON HERVE 119711019931019921011389 9852.65 6MESP +3628VILLACOUBLAY PHILIPPE 11971 919930319920311389 9851.12 6MALLEM +0150ADDAX MICHEL 119711219940719920110024 8999.70 6CVENTE +9176CAHEN HUGUES JEAN LUC 11971 219921019911011389 9852.24 6CSANS +2846COOLE SERGE 11971 1199403199201 9597 8729.70 6CSANS +2967LANCIERS KLAUS 11972 819930319920311389 9851.59 6CANGL +5218EXELMANS JEAN JACQUES 11972 1199210199101 9597 8727.83 6MMICRO +5276ALLEE JEAN JACQUES 11972 519931219921210363 9233.79 6MALLEM +7650FARLED DANIEL 119721119941219931210363 9232.28 6MTECHN +1760COURTILLE FLORENCE CLAUDE 21972 419940819920111389 9851.61 6MSANS +0061FLORIDA CLAUDE 21972 719930519920511389 9851.24 6CANGL +4799DUBAN REMY 11973121993011994011202810240.82 6CSANS +5516LUZAC BERNARD 11973 5199606199506 7803 7680.27 6CMICRO +2886KERINEL PATRICK 1197311199309199209 9126 8456.47 6CALLEM +2318BURNOL MICHEL 11973 6199310199210 9597 8729.58 6CALLEM +2243BASCH GEORGETTE 21973 319930919920911389 9852.41 6MSANS +9674JAUNE SANDRINE 219731219951219941210668 9426.66 6MVENTE +3507CAMPANULES GERALDINE 21973111994031993031267210590.14 6CTECHN +8457ROAD MARTINE 21974 719940619930610668 9426.03 6MSANS +5644PERROQUETS PHILIPPE ANDRE 11974 3199407199307 9126 8455.98 6MANGL +5222PASTEUR CLAUDE 11974 3199606199304 9126 8456.34 6CTECHN +2362GORBELLA ANNIE 21974 21994091994071450311830.61 6CANGL +3214NELSON JEAN YVES 11974 2199412199312 8359 7953.60 6CINFOR +2883CHEIRON MICHEL 1197511199611199511 9256 8532.96 6CSANS +3892LENNON NICOLE 21975 3199207199307 7803 7681.02 6.INFOR +2980ROASSAL JEAN MARC 11975 7199507199407 7803 7680.67 6CTECHN +3954BARONNETTE FRANCOISE 2197612199610199510 7803 7680.59 6CANGL +8734MARGUERITE ANNIE 21977 6199606199506 7803 7679.49 6CSANS +2986ROURE CLAUDE 11977 8199608199508 7803 7679.40 6CSANS +2812FABIEN CATHERINE SYLVIE 21930 1198905199501 8827 8264.04 7.SANS +4059LECOURBE FREDERIQUE 21935 41961101982052470018540.38 7VSANS +3810LACS ELIANE 21935 51961111987012273717261.07 7MANGL +1179VIES FRANCOISE 21935 1199306199501 8656 8146.82 7.TECHN +4536CAPUCINS JEAN PIERRE 11936 61958121993103200223584.44 7MSANS +5665CAMOIN MARIE CLAUDE 21936 8198910198511 8656 8145.15 7.SANS +5858BONODIERE MARIE CECILE 21937 41962071985102273717261.25 7MALLEM +3737MAREY ANDRE 11937101973071992011403411520.80 7MALLEM +3343ECLUSE SERGE 11939 21970081995062201216755.92 7MMARKT +7410MONNETIER MARIE JOSEPH GEORGE 21939 51963051991072273717260.50 7MANGL +9145ULI MARC 11940 31969061991011433211714.60 7MALLEM +4704MANOLA MICHELLE 21941 11961081987032572519241.16 7CALLEM +6915PLERGUER JOSE 11941 81973071992041403411521.34 7MSANS +1437DIGUE GEORGES 11942 11973071992011403411521.70 7DSANS +7658DOYENNES PATRICIA 21942 51964101992072273717261.07 7MSANS +3938DOMINE OLIVIER 11943 51971041991011433211714.10 7MALLEM +4424CORBEIL JEAN PIERRE 11943 81974051993011369311287.59 7MSANS +7614PHILIPPE MICHEL 11943 31963091986012273717260.13 7MSANS +3959RONCIERE MARIE CLAUDE 21943 21973071990041621213033.19 7MSANS +9296THABAS ANITA 21944 51964071990102273717261.39 7CALLEM +9017DELAPORTE ANNE PATRICIA 2194511199201199101 7803 7679.64 7.SANS +3629RAMBUTEAU JEAN PIERRE 11945121972061991071433211715.51 7MANGL +3070ETIOLLES MICHEL 11946 21975031994121471512025.95 7MANGL +3212CYCLADES BEATRICE 21946 31966121995072017815517.38 7MSANS +8064ARCANGUES MARIE CHRISTINE 21946 71969031984062470018542.19 7CSANS +4281GAURBETS CHRISTIAN 11946 319890119941110791 9502.01 7MANGL +0562BLANQUET ANNE 21946 6198810198511 8656 8145.21 7.SANS +2853MESTE MARYSE 21946 1199301199201 9085 8417.91 7MTECHN +4550CHEVRY CLAIRE 21947 71968041993111834514275.06 7MVENTE +2513EUDES SABINE 21948 11970041993121834514276.18 7MTECHN +2928HEYRAULT FRANCOIS 11948 21972041991012137316331.56 7MESP +8846LIGNIERES JEAN CLAUDE 11948 41975061991011369311287.77 7MSANS +0470POTEL PHILIPPE 11949 21974051991112043315669.51 7MCOMPT +7926OUSTAOU CATHERINE 21949 31970111988042334017610.69 7CVENTE +1398NOUVEAU MARIE PIERRE 21949111969101990012137316331.39 7CSANS +7196THIERS PASCAL 119501019800619790611389 9852.33 7MSANS +8076DELANNE COLETTE EMMANUELLE 21951 71971061990011621213033.43 7MSANS +8525VOISIN PIERRE 11951 61976051991071578112723.68 7MTECHN +7965DELESTRAINT MARIE CLAIRE 21952111973021992102017815517.91 7MALLEM +2553CONVENTION MONIQUE 21952 91978061992121471512025.64 7MTECHN +3819SOLEMAR ANNE 21952 81979061979021684813422.18 7CTECHN +3540SAISSY DANIEL 11953 81980081989041684813422.77 7MALLEM +1880GOUFFE JEAN CLAUDE 11953 71983061995011578112722.61 7MSANS +7620MOIRAX REINE 2195310199307199207 9894 8923.11 7MSANS +2953TOMBE PATRICIA GABRIELLE 21953 41975101991091578112723.06 7MTECHN +5507ALEXIS JOCELYNE 21954 41975011974011288210745.40 7MSANS +4941FONVAL MAX 11954 41978051994011369311286.83 7MSANS +4394BRIAND JOSETTE 21954 71975051995011881314584.61 7MALLEM +6207FOINS CLARISSE 21954121976071992011578112723.18 7CSANS +9748CHARVE MARIE CLAUDE 21954 1199103198801 9894 8921.67 7MSANS +9682TIPHAINE JEAN CLAUDE 11955101978091994041471512026.06 7MINFOR +1788NAJY ALAIN 11955 11975031991071578112721.89 7MINFOR +7956NOTAIRE FRANCOISE MADELEINE 21955 31977011981041684813422.41 7MSANS +3415PRAIRIE PASCALE 21956 719911219901210024 8999.63 7MSANS +9208ESCADENIERES JEAN FRANCOIS 11956 61984081993011471512026.22 7MSANS +0945MAISON HEIKE 21956121977021992011471512024.30 7MSANS +2271LANDE MICHEL 11957 41982021994011471512025.56 7MSANS +3201BANGKOKNOI CATHERINE MONIQUE 21957 41978081977081834514275.41 7MANGL +6914BANCHEREAUX JOSETTE 21957 31981051995041433211714.15 7MANGL +8957LAFFON BENOIT 11958111977091994011621213033.05 7MSANS +4169FOUBERT AUGUST 11959 819820519871011131 9658.59 7MANGL +7880DIV JOELLE 21959111982041981041330611017.86 7MMICRO +7448ORSAY SYLVIE 21959 11984111983111608112917.15 7MSANS +6126SAUVEUR ANNICK 21961 21981051980051288210745.75 7MSANS +7782PETRO CHRISTIANE 21961 4199004198706 8656 8145.57 7.SANS +3730PEREIRE FABIENNE 21962 51982091981091608112916.37 7MTECHN +4013TROUIN ETIENNE 11962 21987061993091839014312.81 7MTECHN +1602VINCENT MICHEL 11963 51986111985112090215979.83 7MSANS +1113AVENYE PASCALE 21963 8199407199307 7803 7680.81 7MSANS +5901GIORDAN JACK 119641119840219830210791 9503.99 7MTECHN +5007CASTEBELLE PATRICE 11964 41984061993121288210745.40 7MVENTE +5706QUIOU SUMIYO 21965121986091985091288210745.79 7MSANS +8009COULOMMIERES FRANCIS 11965 119880819870810407 9271.16 7CSANS +4505VERGNE IRENE 21966 61991031990031381911366.63 7MSANS +2764BALAN GABRIEL 11967 21988051992121249910472.84 7MSANS +5527CHAMIER BLAISE 11968 81992011991011381911366.84 7MSANS +9559OUSTALET JACQUES 11970 2199207199402 8656 8146.28 7.ANGL +9156GUILHERMY YUKO 21972 8199208199108 7803 7679.37 7.SANS +2342LAJARRIGE MARIE JOSE 219721219920719910710363 9233.39 7.SANS +0358MERINDOL JEAN PIERRE 11974 81995051994071288210745.57 7CALLEM +7473MERMOZ JACQUELINE 21931 7198810199501 8656 8147.15 8.SANS +7635DERAIN NATHALIE 21933 4198903199501 8656 8145.62 8.COMPT +2535TREVISE PHILIPPE 11935 61963081994122666519901.15 8MSANS +4757GERMINY MARIE LOUISE 21935 81954091982072273717260.53 8MANGL +5975FAVORITE MICHEL SERGE 11935121963041981052470018541.88 8MSANS +3758CALANDRELLES YVES 11935 51968021993011663613344.05 8MVENTE +3094TARN ANNICK 21935 61959081982052470018541.01 8MSANS +7689COURONNE MICHEL 11936 91958091995012666519900.32 8MSANS +0853COLLEDEBOEUF PIERRE 11936 71973031992041403411520.30 8MSANS +5252COSSIGNY PASCAL PAUL 11936 21964121989072947921839.52 8VSANS +2084HARET COLETTE 21937 5199605199505 7803 7680.09 8MSANS +8285MASSENET MARIE FRANCE 21937 81963091991072273717260.26 8CANGL +7176ROBESPIERRE PATRICK 11938111962121985072273717260.68 8MANGL +1151QUERCIOLO ABDELAZIZ 11938 31965111995011834514274.24 8CSANS +1464SANE CLAUDE 11938 9198801198604 8656 8145.80 8.INFOR +6980MARTIN CHRISTIAN 11938 71972101990011433211714.42 8MSANS +7189CUERS JEAN BAPTISTE 11939 81966071993011663613344.45 8MSANS +7123BOISSIER MARIE JOSEE 21939 61962121990102273717260.22 8CINFOR +7519VACHET CATHERINE 21939 11983081992011326611016.12 8MANGL +2640BARBERAZ MARYSE 21939 61967011989091932314933.85 8MSANS +1630GRACAY ISABELLE 21939 71966071991101932314933.67 8MSANS +6303DOUBLE YVELINE 21939 51964071994102666519901.01 8DANGL +8547BEAU SOPHIE 21939 71967071990071578112722.87 8VSANS +7642ROCHEREAU ANNICK 21939 41966061994072137316330.94 8MSANS +4913LAURICESQUE JEAN FRANCOIS 11939 619900719920710407 9271.92 8MSANS +0289CARIBOU ELISABETH 21940 21959051992091932314934.03 8MSANS +5838MAUPERTHUIS CLAUDE 11940111961061994053417325097.60 8MVENTE +1874GRANGES CATHERINE 21940 819940919920110024 8999.72 8MSANS +1504FONTENAY GERARD 11940 51963121988113200223582.58 8MSANS +9111MONTILS DENIS 11940 31973031992071369311287.46 8MSANS +8171VIVES FRANCOIS 11940101966071989071433211715.65 8MSANS +5585COLLEGE REMY 11941111971121991052022115556.35 8MSANS +6338ANSE FRANCIS 11941 11963071992041557012568.02 8MVENTE +9521ARBOUSIERS ANNY 21941 71963031993122334017609.66 8DSANS +5504HONORE MARC 11941101966071990011433211715.68 8MSANS +0434ROUGET ELIANE 21941 41961051994101684813421.91 8MINFOR +8697ROCHEFORT MARIE CLAIRE 21941 81963031991072273717259.86 8CANGL +5183NID BRIGITTE 21941111969011992121834514274.42 8MANGL +4171LAFFITTE ODILE 21941 6199201199101 7803 7679.41 8.ALLEM +9168OISANS DOMINIQUE 11942 61976101992011578112723.00 8MSANS +0577REDERSKAAI ANNE 21942 41971011994071834514275.68 8VSANS +4455LORREZ ERIC 11942 4198810198604 8656 8146.28 8.ESP +1456ALESIA LIONEL 11942 41963041984102470018541.64 8MANGL +6360QUESSINE PATRICK 11942 51962111993123200223584.16 8MSANS +9206RAVAGERS LUC 11942 71967011994121557012567.18 8MSANS +5506ORA MARCK WITOLD 11942 81964071992012470018540.60 8MANGL +0645MALOUET MYRIAM 21942 81962101991072273717261.18 8MSANS +2325LONGUERAIE GUY 11943 61975031990011433211713.61 8MSANS +6153LUNAIN LINETTE 21943 9198810198604 8656 8147.06 8.SANS +8628ANCIENS PATRICK 11943 21963041992032739020403.89 8MVENTE +7345FLORENT FREDERIQUE 21943 41962121987082470018541.61 8CTECHN +9650GODARD GERARD JEAN 11943121975021993011369311286.71 8CANGL +0047BEUNE YANNICK MARIE 11943 71962121984092470018540.80 8MSANS +9696RAFFET CHRISTOPHE 11943121993041992041642313188.35 8.ESP +2868MONTREAL SABINE PASQUA 2194312199401199301 8656 8146.11 8MSANS +9052ORANGE JACQUES 11943 61972071992011433211714.46 8MANGL +0622GEOFFROY MARTINE 21943111970091991101932314934.93 8VVENTE +5329VILETTE GUY 11944 21967121990041433211714.75 8MSANS +7979BORDS MAEVA 21944121964071993061834514275.97 8MSANS +0046GREENS BRIGITTE 21944 4199009198909 8656 8147.19 8.SANS +7861LAGACHE CAROLINE 21944121963111991072273717260.85 8MSANS +6041MAIRIE MICHEL 11944 61969101989056400345693.48 8MSANS +6790VAUX ARIANE ELIANE 21944 31964071993102137316332.47 8MANGL +7706NICOLE CHRISTIAN 11945 31966041995072137316330.79 8CSANS +3032VOIE CLAUDE 2194510199501199401 7803 7680.95 8CSANS +4678GASCOGNE LYDIA 21945 51966121993011471512025.37 8MTECHN +6211LEFEVRE MIREILLE 21945 61966021995042137316330.58 8MSANS +4373CHENAIE FRANCOIS 11945 419940919930910363 9232.55 8MSANS +6516SABLONS ROBERT 11946 91982011992101249910472.66 8CSANS +3672CORVETTE JOELLE 21946101968111992121834514274.53 8DALLEM +6368ALPES ANNE CLAIRE 21946 31965121993031834514276.15 8DTECHN +9883MATRUT NICOLE 21946121973041993041471512025.11 8MSANS +1004DUNOIS GERARD 11946111973071992121518612335.69 8MSANS +5302REMUSAT ALAIN 11946 11975051991011578112723.33 8MSANS +0673VASES DANIEL 11946 41969051995032666519900.02 8MINFOR +5739COUR CLAUDE 21946 3199512199412 8656 8146.09 8MSANS +0992EVENOS GERARD 11947 819941119920110407 9271.52 8MCOMPT +2791BERTHELOT ANNIE 21947 51977071991101578112723.00 8CSANS +7501GOUBET FRANCOIS PIERRE 11947121972121991071621213032.53 8MTECHN +8208PIERRAILLES MICHELINE 21947 91971011995011834514275.91 8MSANS +2702BLAQUE JEAN JACQUES 11947 11970061991102739020405.01 8MTECHN +8704COLLINE JEAN PIERRE 11947 119890119880110152 9116.67 8MSANS +4666HELLEN PIERRE 11947 61979021993041471512024.60 8MSANS +8568AQUILON ISABELLE 21947 11969011991012137316332.22 8MANGL +7824REVA JOSIANE 21948 6199003198608 8656 8146.61 8.SANS +9576MONTET LIONEL 11948 61969121994072470018541.95 8MSANS +3165HAUTS MYRIAM 21948 51970121991022022115555.81 8MANGL +9783THOMAS MARIE PAULE 21948 51971101990072022115555.44 8CMANAG +0892EPARGNE PIERRE 11948121973051990011684813423.29 8MSANS +8463GIMONT MARIE LAURE 21948111970011991071834514274.30 8MSANS +3612GLENAN ALAIN 11948 11973071990011834514276.06 8MSANS +3989AVENIR HERVE 11948 41979071992011249910472.66 8MSANS +1849GRASSE JEAN MARIE 11948 51974111992041403411521.97 8MSANS +5860GRANGES MARLENE 21949121969031989011621213032.26 8MSANS +0021ECOLES MARTIAL 11949 91981091992011249910472.37 8MSANS +5620BLANC MARIE SABINE 21949 1199107198704 8656 8146.01 8.SANS +9485MONT PHILIPPE 1194911198704198604 8656 8146.68 8.SANS +5814TERMES YVES 11949 41978021993121369311286.03 8MSANS +7863YESILKOY DOMINIQUE 11949 71969031990012137316330.92 8MANGL +0579HILARION ETIENNE 11949 31968121989021932314934.09 8MSANS +4379FORGERONS JEAN FRANCOIS 11949 11977041993011369311287.16 8CANGL +3965BOISGELOUP ANNE ANDREE 21949 81971011984082470018542.24 8MINFOR +8322FLAYAT RICHARD 11949 119800919860911389 9851.64 8MSANS +3220PLASCASSIER CATHERINE 21950 91974051991071578112721.53 8CSANS +2062NOIRAY GUY 11950 31993111992111642313189.25 8.SANS +1017COROT MICHEL 11950 11977021993041369311286.53 8CANGL +5913CITEAUX YVES 11950 61978031995082000715437.49 8MTECHN +4766COLOMBE GUY 11950 81972041989101621213033.97 8CANGL +8829CARCE ANNICK 21950 51970111991071578112723.22 8MSANS +5482ENTREPIERRES DOMINIQUE 21950 81974081991081578112723.00 8MMARKT +6118THEOPHILE PHILIPPE 11950 21970041995102666519900.36 8MSANS +6158PUYGARD PHILIPPE 11950121971041993103916628549.82 8MSANS +7664FRANCOIS HUBERT 11950 41974071993011369311287.46 8MANGL +3674HOP VINATIER ANNE ODETTE 2195010199507199407 8359 7952.07 8MINFOR +8401STADE YVES 11951121972051990011621213032.80 8MINFOR +4992SOLEIL MURIEL NICOLE 21951101972021991072137316330.58 8MANGL +4163FRESNAIE PHILIPPE 11951121977051991011684813423.49 8MALLEM +6140VERTE ICHIKO 21951 51972071993042017815516.20 8MANGL +7521SILLAT JOELLE 21951 71973081991021684813421.81 8MSANS +8682HUYSMANS DANIEL 11951 61977051993011471512025.47 8CSANS +4383JAVELOT CLAIRE 21952 21975041995101881314584.67 8MANGL +3010CARLA ANNE 21952 21972081980102470018540.07 8MSANS +5234BELLEGARDE GHISLAINE 21952 51972021991121608112916.45 8MSANS +4958NAPOULE ANDREE 21952 71974011973011288210743.90 8MSANS +8132ALDE PATRICK 11952 61971121989071621213032.29 8MSANS +6296ALEXANDRIE CATHERINE 21952 11973051994041450311832.36 8MALLEM +2851FEDERATION JACKY BRUNO 11952 419830419820411389 9851.21 8MSANS +2922TRIERE JEAN PIERRE 11952 21972041989101621213032.87 8MESP +4520BARONNETTES MICHEL 11952 51975121993011369311287.43 8MSANS +7884LEPINE YAN MICH 11952 11986061995071288210745.04 8MSANS +2916GRENADIERS LAURENT 11952 71977101991041578112721.89 8CSANS +6995CIVRY MARILYN 21953111975041993041471512025.05 8MVENTE +8042BERTHE DANIEL 11953 11976071993011369311286.57 8MSANS +4389CARPATODE JACQUELINE 21953 31974051993012017815517.95 8MSANS +4164THENIOUX THIERRY MICHEL 11953 31972071992072175716602.09 8DTECHN +9986ARS DOMINIQUE 21953111974051991071578112721.65 8MMARKT +2077VELETA CHRISTIAN 11953 81977121991071684813421.55 8MANGL +7207VICT MICHEL 11954 71979091994041249910472.66 8CSANS +0617ARBOUSIERS MARC 11954111981041991011608112915.62 8MANGL +6266PALOMBES ALEXIS 11954121978061994011578112723.22 8MSANS +3336REPUBLIQUE LOIC PIERRE 11954121986031991121288210745.67 8MTECHN +6034LAMOTHE ROBERT 11955 71976081994011369311286.38 8MSANS +8420COULEUVRE DIDIER BERNARD 11955 21978061994011369311286.30 8MVENTE +7021INVILLE JEAN MICHEL 11955 11975051994012397418037.86 8MSANS +2224EGALITE ISABELLE 21955121978031992021471512025.97 8MALLEM +3309HELENE ISABELLE 21955 41986041992011288210745.22 8MSANS +2341LANGUEDOC ANDRE 11955 61980081979081684813421.33 8MTECHN +5599KOETZINGUE MARTINE 2195512199402199302 7803 7679.49 8MSANS +1570ORB NATHALIE 21955 21976061992072043315669.60 8CTECHN +0095DUNOISE DANIELLE 21955 21977041981011608112915.51 8MTECHN +5288CHELLAH MARIE HELENE 21955 91976071991121578112721.88 8CALLEM +9228CARDINALE PATRICK 11955 81979071994101249910472.03 8MSANS +5668FOY MARC LAURENT 11955 419840319830710791 9503.63 8MSANS +2007NEUVILLE PHILIPPE 11956 31976091991011578112721.79 8MSANS +8560MAI DANIEL 11956121983041995101433211715.69 8MSANS +6777PALAIS ANNE MARIE 21956 21977071976071834514274.96 8MSANS +0514GRENIER MARIE CLAUDE 21956111978061992051471512025.43 8MANGL +2450MEYRAN CHRISTOPHE 11956 91978081990052022115554.36 8MSANS +0738CHATEAU SYLVIE 2195611199310199210 9894 8921.99 8MVENTE +4115MIROIRS LINE 21957 71977071981091834514275.11 8MCOMPT +2843BERRIERE THIERRY 11957 319930819940110876 9503.70 8MSANS +1706KERDANIOU FREDERIQUE YVELINE 21957111979081993051608112916.01 8MTECHN +3794MAL GERARD 11957 71989061993011326611016.03 8CANGL +4102ZOUAVES ALAIN 11957 51980051986112256617145.74 8MMARKT +6349GALLEU LAURENCE 21957101977021992011471512024.60 8MSANS +1461BORGHESE TEVA 11957 91977081995041249910472.91 8MSANS +1587CALIFO ROLAND 11958 6199305199201 9597 8729.39 8MSANS +1182GRANCEY VALERIE 21958 11978031992021471512024.17 8CALLEM +9993VALLON JEAN FRANCOIS 11958 21982031994011471512024.97 8MCOMPT +3559OR CAROLINE 21959111979081993071471512025.77 8MSANS +8859BERENGUIER MARTINE 21959 81980051993071527112373.49 8DSANS +9596SINGER MARIE ODILE 21959111981081980081326611016.26 8MALLEM +1614PIED JOCELYNE 21959101979081993071471512025.56 8MSANS +7872CASTELET CATHERINE 21959 31980101979101684813422.12 8MSANS +3066SCHWEITZER JEAN JACQUES MARIE 11959101984091993121326611016.80 8MSANS +6764EGEOIRES DIDIER PIERRE 11959 519890819880810407 9271.56 8CANGL +0114EGLISE ANDRE 11959121981101992101608112917.19 8MANGL +8832ISOLA ERIC 11959121981061993121471512025.47 8MSANS +0083BRUZETTES JEAN PAUL 11959 31984081991061326611016.78 8MSANS +9690MAUPERTUIS GEORGES 11959 61981011989111608112915.03 8MANGL +5294GIRONNETS MURIEL 21959 31981041980041684813421.54 8CSANS +2982HORACE SATO 21959 7198609198507 9511 8689.07 8MSANS +1765ARGE PHILIPPE 119591019930519920510024 8998.08 8CALLEM +9648MOLENE HEYMAN 11960 21984111991092529918968.43 8MSANS +2260BOULAZAC FRANCOISE 21960 11980101979101684813423.35 8MSANS +0614RENOIR JEAN ADRIEN 11960 31983081993011215710279.72 8MSANS +5022CARTOUCHERIE JACQUES 11960111984121994011578112723.60 8MSANS +7019AULNES BETTY 21960121980091988051527112374.16 8MTECHN +1225GRANIER DIDIER 11960121982091993011527112374.09 8MSANS +0305CANTARON JACQUELINE ANNE 21960 21979111993101471512025.92 8MANGL +9818ULBACH NATHALIE 21960 81982011981011326611018.09 8MALLEM +6769TOURENNE MARIE HELENE 21960 81993081992011249910471.66 8MSANS +4168CAILLE NELLY 21960 11980101979101684813423.35 8MSANS +2371PILATTE PHILIPPE 11960121984071991061326611018.09 8MSANS +1380SALLE BRUNO GEORGES 11960 31982011988112090215980.82 8MSANS +1410REPUBLIQU ROZENN 21960 51983041982041608112915.17 8MSANS +1668VALESCURE GILBERT 11961 619880319930111302 9775.91 8CESP +4486CHANZY GILBERT 11961 81984061988052090215979.76 8MSANS +4667CLAIR ANNICK 21961 51982071981071326611017.91 8MSANS +3248CAMPANELLES MARTINE 21961 51982081989112090215981.29 8CSANS +6422BARBELET THIERRY 11961 319810119800111131 9657.47 8MSANS +5543JUMIN HENRY 1196111199405199201 9597 8729.85 8MANGL +2561SAURSON MICHEL 11961 319820419900111131 9658.72 8MANGL +3290CHARBONNEL PATRICIA 21961 7199607199507 8359 7952.19 8MSANS +4075ORSAY JEAN MARC 11961 919890619950910407 9272.24 8MINFOR +3928DAVID BERNARD 11961 51981091993121326611016.78 8MALLEM +3502MONTGOINS ODILE 21961 91984091983091288210744.01 8CSANS +2628MANET MICHELE 21961 51984091983091288210745.57 8MSANS +3679LAY CAROLE 21961 81982101993071527112374.70 8CTECHN +9476FERREOL PATRICE 11961 51985101993011168610047.54 8CALLEM +6300VALLIER NICOLE 21961 3199207199107 8656 8146.11 8.ANGL +2306RAHO BERNARD 11961 919900319890510407 9270.44 8MSANS +7612VIEUX PASCAL CHRISTOPHE 11961101983051982051326611017.92 8MCOMPT +9056CRAPONNE PHILIPPE 11961121985031989112090215981.60 8MSANS +5891PRESIDENT ROBERT 11961 21992121993122401918074.91 8MSANS +4133AIR PIERRE 11961 71981071991091326611016.35 8MSANS +9028OUSTALET JEAN 11961 819821219811211131 9658.52 8MTECHN +3462MONTEIL JACKY 11962 819820619810611131 9657.15 8MSANS +7126JUSTICE MARIE PIERRE 2196211199504199404 7803 7680.66 8MSANS +2705VILLA MIREILLE 21962 2199201199101 7803 7681.04 8.VENTE +6788EXTE DOMINIQUE 21962101984111991091527112373.05 8MSANS +6035AUMALE SYLVAIN 11962 619840319830311131 9658.70 8MSANS +3359CERNOY PHILIPPE 11962121988061989091527112374.58 8CSANS +8236CANAULET LOIC 11962 919870219870110407 9271.16 8MSANS +2285FAURE NICOLE 21962101982071981071326611016.83 8MSANS +6765PICARD AXEL 11963 61992121991121330611016.03 8CSANS +6602COUDREE LAURENT MARCEL 11963111986051994111693613498.86 8MSANS +6537BOTZARIS MANUEL 11963 91984031991091288210744.23 8MSANS +9865CARDELINO ELISABETH 21963121986061985061288210744.19 8MSANS +7936GAMBARDELLA MONIQUE 21963101984111983111288210743.92 8CSANS +1490PAUTEL PATRICIA 21963 21993091992011202810241.21 8MSANS +8828CAMP JEAN FRANCIS 11963 31983101993011949415050.78 8MSANS +6652SURESNES BRIGITTE 21963121989081988081249910472.82 8DSANS +9991PROF CHANTAL 21963 819950319940311389 9850.74 8MSANS +4136ONDINE LAURENCE 21963 61984111983111608112915.66 8MTECHN +2731DRIVE MICHEL 11963 81983051982051326611017.83 8MSANS +7391SOIE BEATRICE MARIE 21964 11986101985101168610048.22 8CALLEM +7157CEDEX GERARD 11964111991121990121330611016.53 8MSANS +1010ARCES ELISABETH ANNE 2196412198811198606 8656 8145.62 8.ANGL +7723GRATENTOUR FRANCOIS 11964121991051995081202810240.84 8MSANS +7515JARUNSANITWONG PIERRE JEAN 11964 3199612199401 9597 8729.36 8CSANS +7251ISIDRO DANIEL 11964 91988051987052090215980.28 8MSANS +4749AVERTIN CLAUDE 11964101986071993041288210744.26 8MTECHN +2395LOGNES HEDWIGE 21964 61984091983091288210744.23 8MSANS +1171DELMAS DANIEL 11965 11988051992041249910473.45 8MTECHN +8804MAHON FRANCINE 21965 51993061992061202810240.46 8MANGL +0367DANTZIG JEAN 119651219940619930610363 9232.62 8CANGL +4984SOULT ERIC ANDRE 11965 219931119921110024 8999.21 8CANGL +5821POMPIDOU GINETTE 21965 51985061985061347711131.13 8MSANS +6382LABOURD CATHERINE 21965 71989071995091249910472.66 8VTECHN +0635WILLOWCREST JEAN CLAUDE 11965 71985071992121288210745.13 8MSANS +0760PENIL PASCAL 119651019870119860110791 9501.81 8MTECHN +6467HAVRE ANDREE 21965101987051986101527112374.07 8MSANS +9897ONGUI PATRICE 11965 619940119930111389 9851.07 8CSANS +5429HINODE FRANCOISE 21965 2199304199204 9126 8456.10 8MESP +6900MANTEAUX GERARD 11966 719910219930610024 8997.99 8MSANS +0370CASTELL MONIQUE 21966 41989031988031249910473.24 8MALLEM +8517WASHINGTON BERNARD 119661219890119860410407 9272.17 8.ANGL +9967TREMEUR HERVE MARIE 11966 81989081988081249910472.59 8SCOMPT +6163MOLLARD JACQUES 11966 21993021992011249910473.00 8MANGL +7120SOGNES HELENE 21966 31989031988031249910472.73 8MINFOR +6709KERIMEL MICHEL 11966101988011987011539912453.47 8MANGL +5303HETROLLIER MARIE LAURE 21966 119940919930411389 9852.11 8MANGL +7075CEZAIRE JEAN LOUIS 11966 61985041992061527112374.63 8MTECHN +5072SAUVETAT ALAIN 11966 919910519900510024 8999.27 8MANGL +6154CALME MICHEL 11967 91988041991061249910472.82 8MANGL +3329DOME PATRICE 119671219921119931110024 8999.31 8MSANS +6319CALVAIRE YANICK 11967 119920819910810024 8998.01 8MSANS +4968LYCEE MICHEL 11967 31991101990101467711987.34 8CSANS +0009LOS JEROME 11967 2199611199511 8656 8146.86 8CSANS +1878BEAUVILLE ERIK 11967 91990031994011249910473.09 8MSANS +9800DORET CAROLINE LILIANE 21967 719930619920611389 9851.28 8MTECHN +4797PORTOI MIVA 21967 61989111989111839014313.36 8MSANS +7931LABERTRANNE SYLVETTE 21967 81994051992011202810241.97 8MTECHN +8940BARRES MICHAELLE 21967 81990021993071330611016.66 8MSANS +3164CROUY ANDRE 11967 71992091991091839014314.38 8MSANS +1556CAMP VERONIQUE 21967 9199302199202 8656 8145.66 8.SANS +2245FRINGANE VINCENT 11968 419940219920110024 8999.94 8CTECHN +0888CURIE JEAN BERNARD 11968 91988091993121249910471.74 8MSANS +3431BOUEL BERNARD 119681019880919870910407 9270.97 8MSANS +3147ROCHERS ISABELLE 21968 51994071992011202810239.96 8CTECHN +7236SIMENTAL BERNARD 11968 219910719910510407 9270.44 8MCOMPT +9853YAN DAMIENNE 21968 71994011992011202810241.16 8CSANS +3267LONG BRIGITTE 21968 11992091991091330611016.93 8MSANS +8141EXUPERY GERALD 11968 51994011993011267210590.11 8CSANS +3839MINIMES JEAN PIERRE 11968 71989011988011450311831.78 8MESP +6386PAUCOURT SALOLOM 11969 91994011993011420611639.24 8MTECHN +5948CARRERE JOCELYNE 21969 6199205199105 8656 8145.60 8.SANS +1726ASQUES SYLVIE 21969101994021992011202810240.50 8MANGL +3067CHEVRAINVILLIER BERTRAND 11969 119940119920110024 8999.90 8MSANS +5762WINSTON JEAN 11969 11989101988101450311832.69 8MSANS +6200MONTGOMERY DANIEL 11969 91990041995011330611016.47 8MSANS +9177RIEUX BERNARD 119691119920619910611389 9852.27 8MINFOR +6151CANTAGALLO EDDY FELIX 11969 71994011993011202810240.23 8MSANS +8371MOUTHON HERMINE 21969 919950319930411389 9852.29 8MTECHN +5982LONGWOOD MARIE NOELLE 21969 71991091991051330611016.84 8MVENTE +3924ANGELES MARYSE 21970 219940719920111389 9850.74 8MSANS +5000MARCHAND ANDRE 11970 8199306199206 9597 8727.91 8MSANS +6053EXINCOURT DOMINIQUE 11970 419940619920110024 8999.43 8CESP +6405ORMILLES ALAIN 119701119910819900810024 8999.57 8MSANS +4367OURCHES AGNES 21970 1199506199406 7803 7680.36 8CSANS +6055LACATE DENIS 11970 9199308199208 9597 8729.66 8CTECHN +4701DUCA ANDRE 11970 71991051990051467711985.86 8CESP +6470ALLEES YVON 11970 71991021990021467711987.75 8MALLEM +6121RIVAGE FRANCOIS MARCEL 11970 419950119950110363 9233.88 8CSANS +0867FOURS CHRISTINE 21970 3199409199309 8359 7952.10 8MTECHN +9075SEMBAT FREDERIC 11970 3198912198812 8656 8145.26 8.ALLEM +9637JUAN MURIEL 21970 5199310199210 8656 8146.70 8.TECHN +6609GAYE NICOLE 21970 8199607199507 7803 7680.41 8MSANS +5493LAUZES MICHEL 11970 11991071990071202810241.09 8MSANS +6491BRAS BEATRICE 21971 619921019950410668 9425.45 8MSANS +7556YOLA PHILIPPE 11971121994041993041360611209.94 8CTECHN +7031ECOLE CHRISTINE EMILIE 21971 419910219920111389 9851.19 8MSANS +5834ORANGERIE SERGE 11971 8199302199202 9597 8728.46 8CSANS +4526LOT PHILIPPE 1197110199407199307 9597 8729.27 8CSANS +4363QUART VINCENT 11971 4199404199201 9597 8728.44 8CSANS +7702MONTARNAUD PIERRE 11971121992111991111420611638.97 8MVENTE +8710GAULTIER ISABELLE 21971 31994011993011267210589.57 8CSANS +5198ROUILLON CLAIRE LUCIE 21971 819940519920111389 9851.97 8CANGL +6286WATTEAU JEAN CLAUDE 11971 81994071993071360611211.56 8MSANS +3787TAUDE JACQUES 11971121993121994011202810241.40 8MSANS +3968CAPRI MARIE CHRISTINE 21972 8199607199507 7803 7681.22 8CESP +5435BERRE JOELLE 21972 21994091993091360611211.42 8CSANS +2682VINGT GENEVIEVE 21972 7199406199306 7803 7681.40 8CSANS +5935ORVEAU FRANCK 1197212199609199509 8656 8146.25 8MTECHN +5312LUCE GUY 11972 81994041993041420611637.47 8MSANS +5416ESSARTS FRANCOIS 11972 819931019930711389 9850.62 8CSANS +5534ISLE MICHEL 1197210199312199212 9597 8728.58 8MSANS +3974DEVIN FRANCOIS 1197212199605199505 8656 8145.57 8CSANS +6877COUPERIN PHILIPPE 11972 5199310199210 9597 8727.95 8CSANS +4740PLAISANCE SERGE 11972 219950119930410024 8998.82 8CSANS +3393MANAU EDITH 21972 219941019930411389 9851.88 8MTECHN +9615BOL JEAN CLAUDE 11972 21991071994011249910471.79 8MSANS +4599GUYAU MAUD SOPHIE 21972 519940719920111389 9852.47 8MANGL +8612HAMELIN JEAN MARC 11972 8199310199401 9597 8728.98 8CSANS +8541RESIDENCE MICHEL 11972 319951219941210668 9426.89 8CTECHN +3801NASTRINGUES SABINE 21973 8199606199506 7803 7679.46 8CTECHN +2827OREE JOSEPH JEAN JACQUES 11973 6199502199402 9126 8456.78 8CANGL +7660ESTIENNE JACQUES 11973 1199406199306 9126 8455.56 8MSANS +5260JACQUES ERIC BERNARD 11973 319931119921111389 9851.61 8CSANS +3671GARCHES GEORGES 11973 31992021991011202810240.68 8CANGL +4348ROQUEFORT JEAN PIERRE 11973 819930319920311389 9850.74 8CINFOR +6630LAGRANGE THIERRY 11973 9199302199505 9597 8729.63 8CTECHN +9712EMPIRE CHRISTIANE 21973 6199606199506 7803 7680.67 8CSANS +3751OASIS JACQUELINE 21973 219930319920711389 9851.25 8MSANS +3830DRECHO JEAN 11973 61993051994011202810240.55 8CSANS +4561DANNEMOIS JEROME 11973 5199612199601 7803 7679.91 8CSANS +3191JAVEL CHRISTIAN 11973 5199311199211 8656 8147.13 8.SANS +1618CHASLES CORINE 219731219940719930710668 9427.08 8MSANS +4268SENE LUC 1197312199306199206 9597 8728.23 8CSANS +8421ROCBARON JOEL 11974 1199510199410 7803 7680.36 8CSANS +0930ESTANOVE ALAIN 1197411199606199506 7803 7679.99 8CMICRO +6807TOURDRES MANUEL 11974121994051993051360611210.28 8CSANS +4488CHAUVEAU CECILE 2197412199601199501 7803 7679.51 8CSANS +8315COUVENT PIERRE 11974121995121994121450311831.06 8CSANS +6605EDMOND SYLVIE 21974 8199504199404 7803 7679.78 8CTECHN +9778ONS MARIE SIMONE 21974 7199405199406 7803 7679.96 8MSANS +3816AURIC PASCAL 11974 6199502199402 9894 8922.63 8CSANS +2018FOUR PATRICIA MICHELE 219741219940719930710668 9427.40 8CALLEM +7643SEGUIER PATRICK 11974 5199406199306 7803 7679.67 8CSANS +5610SAGET HENRY 11974 9199407199307 9126 8456.47 8CALLEM +6425FINLAY PHILIPPE 11974 81993121994011202810241.74 8CANGL +8616PAEA MICHEL 11975 5199407199406 7803 7681.40 8CSANS +9958DULUD GILLES 11975 6199612199512 8656 8146.52 8.TECHN +8573PIBONSON CHRISTOPHE FREDERIC 11975 6199607199507 7803 7680.81 8CSANS +7803INCAPIS PASCALE NANCY 21975 7199604199504 7803 7680.34 8CALLEM +7514VIENOT ANDRE 11975 3199508199408 7803 7679.78 8CSANS +7507FAISANDERIE JEAN PIERRE 1197512199607199507 7803 7679.99 8CSANS +3865MICHEL PATRICK 11976 3199507199407 7803 7680.12 8CSANS +4755OCTAVE MARC 1197612199608199508 7803 7679.99 8CSANS +0542TORREILLES ALAIN 11976 5199510199410 8656 8145.80 8CSANS +9647DELORME DOMINIQUE PIERRETTE 2197612199407199307 7803 7679.69 8CSANS +4725TACONNAZ BEATRICE 21976 4199508199408 7803 7681.17 8CALLEM +9564CESSOLE FRANCIS 11976 4199607199507 7803 7681.20 8CSANS +8087CHUTES GUY 11976 3199407199307 7803 7680.62 8CANGL +5480LOUIS JACQUES 11977 9199607199507 7803 7680.59 8CSANS +1361BANVILLE PATRICK 11977 4199607199507 7803 7680.34 8CSANS +6209BEAURECUEI CATHERINE 21977 4199607199507 7803 7680.57 8CSANS +3656FLIREY JEAN CLAUDE 1197711199606199506 7803 7679.59 8CANGL +9051SUANE ALINE 21929 919680919870111389 9851.91 9VSANS +2724DEL PIERRE 11930 21989021995023455825330.03 9.SANS +7341GRATECA PIERRE 11933 21966071993012273717260.26 9MSANS +6774BARRAU AGNES 21933 8199512199412 8656 8145.06 9MANGL +0536FIRMAMENT SCHEHRAZAD 21934121962101982052470018541.72 9DSANS +7368RESSAC RICHARD JOSEPH 11934 11967011994011557012567.09 9LANGL +7599ANNE JEAN FRANCOIS 11935 11974031994011578112722.84 9VSANS +1083COUCOURDE DOMINIQUE 11935101973061991011433211715.02 9MSANS +2946ROLLAND OLIVIER 11936 51962111984122470018541.29 9MSANS +7241THERMALE MARGUERITE 21936 7199306199206 9511 8688.67 9MESP +1695LOUVEL CHRISTIAN 11937 519820219920311389 9852.69 9MSANS +9744SALENGRO SYLVIAN ERIC 11937101961071991083417325097.15 9MESP +7083OLIVETTE CATHERINE 21937101966071989031932314934.86 9MALLEM +0151DUCHEMIN JEAN JACQUES 11938 41962061991012470018541.29 9MINFOR +8395FRANCO ANNIE 21939101984011991091288210745.34 9MANGL +9978BARBERAZ MARIE CLAUDE 21939 71972071989011621213034.09 9VANGL +2131ARGENT CATHERINE 21939 71963121994042137316332.05 9MALLEM +3235THUI HUGUES 11939 61967071995041557012566.37 9MSANS +7994THIBAULT PATRICK 11939 31962051983032470018542.10 9MTECHN +5783DOMATS MICHELE 21939121963031992021932314934.12 9MANGL +6426PORTAIL JEAN FRANCOIS 11939 11969121995041557012567.53 9MESP +6856JULIE JEAN MARIE 11940 319950219940211131 9657.83 9MANGL +4024LEBRUN ALAIN 11940111965041995041557012567.77 9MESP +9739NOCETA YVES 11940 21972041991011663613343.82 9MSANS +9045MURET RENEE 21940101964091993072137316332.29 9CSANS +4987UNIVERSITE CATHERINE 21940 41967011990011932314935.20 9MESP +1530CYRILLE ANNICK 219401219741019881011131 9659.19 9VSANS +1447HAMEAU OLIVIER 11940 61964081988092947921838.88 9MTECHN +8268ANNEES PATRICK 11941 51961081992042022115555.75 9SANGL +9303SCIOTOT ALICE 21941 61973071991101578112722.75 9MSANS +0509PIECE ROBERT 11941 51963121994073844228045.38 9MSANS +3288ISERE EMMANUEL 11941 51965081990011433211714.24 9MSANS +9898CHANTEGRIVE JEAN MARC 11941 91964091992082470018540.12 9MSANS +0163DAUTHEVILLE MARCELLO 11941111964121992072137316332.45 9MANGL +0652VAUTHIER MARIE ALICE 21941 41971021991101932314933.60 9MINFOR +7932VAUX DANIEL 11942 51969031991011433211713.80 9MSANS +0197MAURENS CLAUDE 11942 91962081984123200223582.94 9MTECHN +3251RUELLE JEAN 11942111976041992011403411520.12 9MALLEM +8289OLYMPE NADINE 21942 51964121993102137316331.37 9MSANS +9503GLORIETTE ALDO 119421019951219941210024 8999.12 9MSANS +4563CERTAIN LOUIS 11942 31965071995011557012567.22 9MANGL +6383DESGRANGES JEAN CLAUDE 11942 71983051993011249910473.49 9MSANS +8658VALLONGUE BERNARD 11942 71963041995102666519899.30 9MESP +4745RUCHERS GILLES 11942 21980051979051249910473.56 9MSANS +8824PEYBERT JOCELYNE 21942 31963031994012137316332.51 9MSANS +7242CORMEIL PATRICK 11942 81970041990011433211714.79 9MANGL +0065ANGES XAVIER 11943101966101990011663613343.16 9VSANS +4531SENART JEAN LOUIS 11943 21967111987012273717261.13 9MSANS +7154MUIDS THIERRY 11943 31962121990013844228044.24 9MINFOR +5345ORATOIRE ALAIN 11943121970081989011932314934.36 9MSANS +3282SOUGERES JEAN LOUIS 11943 11968051990011433211715.33 9MSANS +6215JOFFRE PASCALE 21943 81986021991071249910473.24 9MINFOR +7867BASTIDE HIROKO 21943 51964071993072334017610.06 9MCOMPT +6194STEPHAN KARIM 11943 81966051995041557012567.45 9MANGL +4570MONDENARD JACQUES 11944 61965051994012137316331.93 9MINFOR +3691CAORCHES MICHELE 21944101965081995042137316331.97 9MINFOR +8595PRAD BENOIT PIERRE 11944111965031984123200223582.37 9MALLEM +6617LONDRES PATRICK 11944 41972041991011621213032.39 9MSANS +9701CAPUCINES ALAIN 11944 119820119830511389 9851.24 9MSANS +7661ROSERAIE FRANCOIS 11944 31973071992011403411521.88 9MANGL +0274FROMAGERIE ALAIN 11944121971011991101433211714.28 9CSANS +9427GROULES MARIE FRANCOISE 21944 81963111993082334017609.06 9MANGL +9749HEROLD ISABELLE 21944 31973071991071578112722.97 9DSANS +5120MONTBY PIERRE 11945 81978041994011663613343.91 9MINFOR +7337MAGINOT PHILIPPE 11945 61965031994012137316330.71 9MANGL +2937PAYEN JEAN PAUL 11945 81973051992011403411520.53 9CANGL +3034SCHUMANN GEORGES 11945 81970041991011433211715.11 9MSANS +4582PETENATI MARIE CHRISTINE 21945 11974121993032043315669.65 9MALLEM +2430TOURNELLES ALAIN 11945 91975031993011369311287.38 9MSANS +4782CHENAY MARIE LAURENCE 21945121968091989012273717259.78 9MSANS +1091RENNES MARIE ANGE 21945 61974071990071621213033.56 9MSANS +2494ONA FRANCOISE 21946 51969081993121834514275.25 9MESP +2170VIENNE MARIANNE 21946 81970021991102137316330.67 9VSANS +2830FONTAINE ANNETTE 21946 41968041991091932314935.20 9MSANS +8673ABEL JEAN PIERRE 11946 2198810198510 8656 8145.21 9.SANS +9142ORSAY MICHEL 11946121970121991041663613343.28 9MSANS +6458FOYER JEAN LUC JACKY 11946 71969111986012470018540.12 9MSANS +8418RIVERIN ALAIN 11946 11979091992011249910473.05 9CCOMPT +2785PONT ANDRE 11947 41968041990102739020403.33 9MANGL +3079MOISE YVES 11947121972071991101433211714.69 9MTECHN +6994CHEMINEES SOPHIE 21947 11976061981091834514276.09 9MANGL +0913ROCHER BRIGITTE 21947101971041990102334017609.66 9MSANS +3030LUZIADES ANTONINA 21947 519940619920111389 9851.64 9MSANS +2592CLOUZIT NATHALIE 21947 7199208199108 8656 8145.20 9.SANS +2816BAULE VERONIQUE 21948 51973031972031236910396.01 9MANGL +0561DELAUNE JEAN NOEL 11948 11975041993011369311287.82 9MSANS +4506DIDEROT JEAN PAUL 11948 619790519880411131 9657.51 9MTECHN +5103CORNETIERE FRANCOISE 21948 21983061990041288210744.22 9DSANS +0785RUDLOFF MICHEL 11949121971121993122547019086.15 9CSANS +7465DEVORAH MICHEL 11949 91980041990091608112915.38 9MSANS +6601LAS CLAUDE 11949 61969051990043417325096.67 9MTECHN +5921SAINTPIERRE CAROLE 21950 31974021991071578112722.12 9CSANS +4717BERARD DENIS 11950101983081987011283810705.67 9DTECHN +6138DUCERIS COLETTE 21950 81992051991011202810241.85 9SVENTE +1254ESQUIROL JEAN CHRISTIAN 11950 81975081992101369311286.84 9MANGL +3226BOX CHRISTINE 21950 41970041990101834514275.65 9MSANS +4683MAUNE PASCALE 21950 61974051995072175716601.42 9MSANS +3496FROIDE JEAN JACQUES 11950111972101991012137316331.69 9MANGL +2173BERNARD CHRISTIAN 11950 41972051991042137316331.34 9MANGL +2204VIA STEPHAN 11951121972101991072017815517.05 9MSANS +5528HORIZONA JEAN PAUL 11951 219931019940510407 9270.34 9MANGL +2181CHAPUIS ALLAN 11951 1198810198603 8656 8145.89 9.SANS +8003COMPREIGNAC JEAN RENE 11951 81973101994082201216756.14 9MALLEM +4444HOTELS ANDRE 11951 41981111992011249910471.71 9CTECHN +3137GARIDECH MICHELINE 21951121993051993041249910473.47 9MANGL +5824LONGCHAMPS SYLVIE 21951 51972011990071578112722.42 9MANGL +8477MENEZMEUR NORIKO 21951 51973071991041578112722.69 9MESP +1336RANELAGH PIERRETTE 21952 21972041995011881314585.46 9MALLEM +6782LAVACHET ALAIN 11952 11978091994011369311287.77 9MINFOR +6451MONTPARNASSE AURIC 11952121973031987112470018540.56 9MESP +9132BOUVELARD ALAIN 11952 619930819910110407 9271.74 9CSANS +9726VIGIER GABRIEL 11952 419930819920811389 9852.47 9MSANS +4608DESPAGNE ANNIE 21952 3199503199403 8656 8146.05 9MSANS +2221LYANES YANN 11953121973071995041881314586.14 9MVENTE +1575PELURES MICHEL 11953111975011991012781920674.59 9MSANS +4898BLANCHET ODILE 21953101973071984051834514275.11 9MSANS +2339ODES MICHEL 11953 31976121993041471512025.77 9MSANS +4008BETHANCOURT MARIE ANNE 21953111981121980121202810241.36 9MSANS +1590CIVRAC PHILIPPE 11953 91977051993041369311286.83 9MTECHN +6109PEIRE GERARD ANDRE 11953 31972071991082175716602.51 9MCOMPT +7232CHAMP MICHELINE 21953 7199001198801 8656 8145.87 9.SANS +4789TOURACHE ALAIN 11954 71974081993011369311286.53 9MTECHN +8709QUIETUDE MONIQUE 21954101977011994101471512025.14 9CSANS +1712BIR ALAIN 11954 31975011991091684813421.42 9MSANS +7069TUBY ROBERT 11954 71975061991071578112722.30 9MSANS +4017BLEURY BRIGITTE 21954101977011992011471512025.20 9CSANS +4255BEAUSEJOUR FRANCOISE 21955101981031995071433211714.70 9MSANS +3435VENTS PHILIPPE 11955 71978041991011471512025.16 9MTECHN +3130CIGALONS PHILIPPE PIERRE YVES11955121978111995021608112916.95 9MALLEM +9170ALMA ANTOINE 11955111978101992011578112722.61 9MANGL +9114CASTEL LILIANE 21955 51976071991121578112722.52 9MVENTE +4844CHER JOELLE 21956 31993091995111202810240.94 9MINFOR +1241GOUVERNEUR JEAN PAUL 11956 31976031990101684813422.68 9MSANS +9766FRAYSSE CHRISTIAN 11956 819800719821211389 9850.88 9MSANS +6781CHANTEREINE JEAN LUC 11956 91979011992012175716602.36 9MSANS +6220PUYRAVEAU MICHEL 11956101985041988061326611017.52 9MSANS +5187BOLIVAR DANIELE MARIE 21956 81981081995071433211714.30 9MSANS +8283VICINAL MARCEL 11956 91977111992012175716600.94 9MSANS +0990CORMERY EYT 11956111979121995041249910472.84 9MSANS +9255SERRES MARY ANNE 21956 71981011980011684813421.58 9DANGL +9968TRAILLES JEAN 11956 919870419860910407 9271.59 9MSANS +6046RONDE JACQUES 11957101976121992011608112915.20 9MSANS +4312DUROC KETTY 21957111980041979041684813421.51 9CANGL +1998MADELEINE CATHERINE 21957 21980061994041471512025.70 9MSANS +0810TROMPETTES LAURENCE GISELE 21957 91994021992011202810240.40 9SSANS +1103JOURDANS JEAN MARIE 119571019900419910410791 9502.58 9MANGL +3941SOUGRAIGNE MICHELINE 21957 71980071979071684813423.49 9CSANS +1971BORDINAS GENEVIEVE 21957111980011993111471512024.89 9MSANS +5459VORS ANNE 21957 5199006198906 8656 8146.61 9.SANS +5423FLOQUET FABRICE 11957 3199408199308 8359 7953.59 9MSANS +0905CARREL KARIN 21957101980101979101684813423.47 9MANGL +4069JUZET JEAN FRANCOIS 11957101976071993062043315669.89 9MSANS +4527MANIGUETS PIERRE 11958 819820619810611131 9658.16 9MSANS +2372FONTANGE EMILIENNE 21958111981041980041381911366.00 9MANGL +4357RAYOL PATRICIA 21958 41994031992011202810240.40 9MSANS +5408BLANCHE GERARD 11958 41981021985112256617147.10 9MANGL +3006FOULQUES JOELLE 21958 51979031993041471512026.00 9MINFOR +6430PERIGORD PIERRE 11958 219790519780511389 9852.09 9CSANS +6468PLANTADE BEATRICE 21958101981041980041684813422.18 9MALLEM +0044MONTBRUN PIERRE 11959 51983061993121326611017.97 9MANGL +2272GRANGE JEAN MICHEL 11959 519790319820111389 9851.46 9MSANS +8185TONNER CHANTAL MARIE 21959 3199606199506 7803 7681.35 9MSANS +8317DAMESME JOELLE 21959 919940219930211389 9851.73 9MSANS +3554FRONTONAS MICHELINE 21959 61979101978101202810241.66 9MESP +3926TARNES NELL 11959 11980101993041471512024.20 9MVENTE +9173BLIGNY MARIE MADELEINE 21959 1198810198510 8656 8146.64 9.TECHN +9704DEMMLER ANDREE 21959101979101993071471512024.66 9MANGL +1648RENAULT MARIE ODILE 21959111986121991071249910472.96 9MSANS +1803HONORE ISABELLE 21959111982041981041202810240.26 9MALLEM +5795SUQUETTE SYLVIE 21959121980031995021527112374.40 9MANGL +9158ALDERBURCHS PATRICE 11959 719790619811011389 9852.67 9MSANS +8333PONCHETTES VIRGINIE 21959 7198801198510 8656 8145.83 9.SANS +5238BOURRE CLAUDE 11960 51981031984091684813423.35 9CSANS +7478ERDRE ANNE 21960 81993111992011202810240.71 9MANGL +2036SALENGRO SYLVIANE 21960 31985121984121288210744.62 9CINFOR +7716GOLF BERTRAND 11960121982071989021608112916.95 9MANGL +4057MILTAT HERVE 11960 719810419800411131 9657.84 9MANGL +2635BIGNAN MARTINE 21960 51981041992092090215980.88 9MSANS +7613PIERRE JACQUES 11961121986041990031527112374.84 9MSANS +0365CLICHY BERNARD 11961 419830519830511131 9658.07 9MSANS +2806GOIZ DIDIER 11961 119840419830411131 9658.46 9MSANS +4103BRUSC CATHERINE 21961 319940919930411389 9852.47 9MSANS +1349MAUROIR ERIC 11961 819900119870310407 9270.29 9.SANS +0451RENARD JEAN MICHEL 11961 1198810198604 8656 8145.78 9.SANS +8494CYGNE SYLVIANE 21961111983021982021326611016.71 9CSANS +9150GAY JEAN CLAUDE 119611119880719870810407 9271.52 9MSANS +3221SURCOUF GUY 11961 91984081992121527112374.97 9MSANS +3083CANADA ALAIN 11961 11982051982111326611017.29 9CSANS +0448LAVANDES GILLES 11962 319930819920811389 9850.79 9MALLEM +3439VERSAILLES MARC 11962 319840419830411131 9657.57 9MALLEM +5360VEZELAY THIERRY 11962 119880919870910791 9502.46 9MSANS +8567PRE FRANCOIS 11962 519910119940810407 9271.42 9MINFOR +0702LACOSTE PHILIPPE 11962 61985091984091608112916.14 9MESP +3016CARDELINE ELISE 21962 11993091992011202810241.27 9MSANS +7387BELLERIVE EVELINE 21962 91992111992061330611016.03 9MSANS +3882RETHACKER JEAN LOUIS 11962 719930819921210407 9272.17 9MSANS +5174SEILLANS NICOLE 21962 71983081982081608112915.08 9MTECHN +2800VILLETTE JEAN PIERRE 11962 51985041991091288210744.28 9MANGL +9420ROURES YANNICK 119621019820319810311131 9658.82 9MSANS +4001ASNIERES JEAN PIERRE 11962121987071994091693613499.67 9MSANS +8856CANALS GILLES 11962 219911219901210024 8999.16 9MANGL +9775MOUETTES FRANCOIS 119621219900219890210407 9270.91 9CVENTE +7097BROUENOU JEAN PIERRE 11962 619860319850310791 9502.82 9MSANS +8917CHANCELIER PATRICK 11962 31995021994021202810240.53 9MSANS +8358CREBILLON NICOLE 21962 61983011982011608112916.37 9VSANS +1296BERARD MICHELE 21962 119941019931011389 9850.89 9MSANS +3188CONCY MICHELE 21962 31987091986092090215979.80 9MALLEM +6829SEINE DANIELE 21962111994061993061202810240.23 9MALLEM +7876VIELLA HERVE 11963 619930119920110407 9272.09 9CESP +7396SANAJO BRUNO 11963 91987081991091249910473.60 9LSANS +7380MARINA ANNE JACQUELINE 21963 119910919900910024 8999.61 9CANGL +5941SIFFLETERIE GILLES 11963 519940219910710407 9270.56 9MTECHN +5364BOUSSY GENEVIEVE 21963 519940519920111389 9850.61 9MANGL +9502MONTOLIEU JEAN CLAUDE 11963 41985051994061527112374.72 9MSANS +8964DOUJAT MICHEL 11963 619841119831110791 9503.92 9MSANS +3405AMANDIERS PHILIPPE 11963 81984031992111527112372.90 9MSANS +1868COUPE JEAN 11963 61993031995081381911366.16 9MSANS +2984GOUSTAN JEAN MARC 11963101987111994091693613499.09 9CSANS +7572CHARONNE DANIELLE 21964 41995011994011206910240.19 9MALLEM +9668EDELWEISS JEAN BERNARD 11964 31984071991121288210745.70 9MSANS +3335CANTEPERDRIX MARIE CHRISTINE 21964 41983061982061326611017.52 9MSANS +2509FINO JEAN MICHEL 1196410199311199211 9085 8417.90 9CVENTE +1812LLORCA PIERRE 11964 21986031993091527112374.72 9MTECHN +5943BERGERIE JEAN 11964 31987021995011373711327.16 9MSANS +5136VALERIEN ANDRE PASCAL 11964 71987081986081527112373.86 9MANGL +6432ECUREUILS PATRICK 11964 3199202199102 8656 8147.19 9.SANS +2610DUVERGIER MARC 11964 91984031992031527112374.88 9MTECHN +5455CEZANNE PASCAL LUC 11965 31988091993031450311831.19 9CALLEM +7204PICCINI CAROLINE 21965121992091991091839014314.08 9CSANS +0125HUNTINGTON YVONNE 21965 91994011992011202810240.77 9MSANS +3791BOUISSETTE PHILIPPE 119651119940119950810024 8998.95 9CSANS +2711ROSETTE PHILIPPE 11965 41990101994011288210744.86 9CALLEM +4882LOZERE ERIC 11965 31988021992061450311831.91 9MANGL +4855BELLEVUE PATRICK 11965 11990101989101249910473.69 9MALLEM +3048PIERRE PIERRE 11965 7199110199010 8656 8146.61 9.ANGL +2278LOGT NORBERT 119651019900619890610407 9270.24 9MSANS +5557LAUZADEL GERARD 11965 91992071994072256617145.75 9MSANS +6129ROZ GISELE 2196510198805198510 8656 8145.20 9.ALLEM +3979RIVES YVES 1196511199609199509 9126 8455.98 9MTECHN +8688FASSUN HUGUETTE 21965 4199511199411 7803 7680.23 9MSANS +9402PARMENTIER PATRICK 11966 819880319870310407 9270.16 9MCOMPT +8428BARJAQUETS THIERRY ABEL 119661119920319910310024 8999.07 9CALLEM +8348CLERMONT ANNE MARIE 21966 11989051988051202810241.40 9MVENTE +3723COURCELLE GENEVIEVE 21966 2199506199406 7803 7680.93 9MANGL +3173CHAL ARMAND 11966101986051988061288210745.88 9MSANS +9965VENETES YOLANDE 21966 519930719920711389 9851.21 9MTECHN +6306ANJOU ALINE SIMONE 2196612199004198707 8656 8147.13 9.ANGL +5448FILHOS JEAN CHARLES HERVE 1196612199212199112 7677 7604.70 9MSANS +7571GORRE SYLVIE 21966101988121987121249910472.03 9MSANS +8890LAMORLAYE FREDERIC 11966 41986041992011450311832.68 9MVENTE +2287DORMOY GENEVIEVE 21966 31988111987111450311830.80 9MSANS +0092ALCANAL JEAN LUC 11966 61987041992121249910472.03 9CSANS +2554ROULOTTE OLIVIER 11966 419940219920110024 8999.03 9MANGL +9801GRAPPONS NATHALIE 21966 919940819930411389 9851.57 9MTECHN +1541ALDES JEAN MICHEL 11967121994051992011202810240.26 9MSANS +9290PLOEMEL YVES 11967121991051990051467711986.91 9MSANS +8169CHAUVIN FRANCOIS 11967 21994011994011202810240.53 9MSANS +6269GOLF ROLAND 11967 919940219940710024 8999.47 9MALLEM +2878RICHART ERIC JEAN MARIE 11967 819891219950410407 9271.91 9MSANS +9098OR DANIEL 11967 719880919870910407 9272.01 9CSANS +4331MONIER DIDIER 11967 719881019871010407 9270.12 9CSANS +0261ROUQUET RENE 11967 41989051988051539912452.78 9MSANS +1507FLACHAT PIERRE 11967 41994011993011420611639.09 9CSANS +7887TENDRE CLAUDE ANNE 21967121994051992011202810241.72 9DSANS +0525SERRES LAURENCE MAGALI 21967 11994011992011202810240.50 9MSANS +9421ASNIERES MARIE CHRISTINE 21967 319951119930411389 9852.22 9MSANS +3624LAPEYRE THIERRY 11967 519870119940110407 9270.12 9MSANS +0344GABRIEL JEAN PIERRE 11967 419940119920110024 8999.57 9MINFOR +7208GAZAN ERIC JEAN 11967 219940119950810024 8998.94 9MTECHN +4335GLACIERE KEIKO 21967 21994041992011202810240.89 9MINFOR +9851TOUCANS MICHEL 11968 219910119900110407 9272.01 9MTECHN +9263ROSSINI ALAIN 11968111991011995021330611018.13 9MSANS +9662DEPORT PHILIPPE GEORGES 11968 3199607199507 8656 8145.38 9MANGL +2814ALFRED VERONIQUE 21968 6199202199102 8656 8146.65 9.COMPT +3291LACUEE REMI 11968 91989021988021450311831.34 9MANGL +3557KERHOUET REGIS 119681019930319920310024 8997.86 9MSANS +6204ESCA BRIGITTE 21968 9199404199201 9597 8729.22 9CESP +1678HADRIEN PHILIPPE 11968 819931219921210363 9231.95 9CSANS +0299MONICA DOMINIQUE 21968 51994021992011202810241.70 9MTECHN +6960PRES COLETTE 21968 2199108199008 8656 8147.15 9.SANS +4443BENOIT JOSIANE 21968 81988011992011249910473.05 9MTECHN +5697QUILICHINI ROBERT 11968 31993121992011202810241.92 9MINFOR +9315PAVE LEON 11968 21988111987111539912452.39 9CTECHN +7230BOUCHE FRANCOISE 21969 3199304199204 9126 8457.67 9MSANS +8237DENEB WALTER 11969 419890919910710407 9271.47 9CSANS +3459ALISCAMPS LEONIE 2196912199610199510 8656 8146.02 9MANGL +4247ARISTIDE CHRISTIAN 11969 5199501199401 9894 8921.55 9MSANS +0137VILLEMENT ANNE MARIE 21969 81994051992011202810239.81 9MSANS +9445STREET DANIELLE 21969 7199204199104 8656 8146.74 9MSANS +9019VALLIERES JEAN 11969121990111989111381911366.90 9MALLEM +4031COLVERTS LAURENCE 21969 11993121992011202810240.89 9MSANS +4000CUENANT THEOPHILE 11969 219890619880610024 8998.09 9CSANS +7496GRASS FRANCOIS 11969 81989051992121249910472.43 9CSANS +4671GRASSET ROGER 11969111992061995121330611018.09 9CSANS +0067RESTAURANT MICHEL 11970 7199407199307 9597 8728.26 9MANGL +0824FIGARES JACQUES 11970121993101992101360611210.03 9CESP +0143MACONNERIE MICHEL 1197010199511199411 7803 7679.87 9MSANS +2934FUZELIER SYLVIANE 21970 5198906198806 8656 8146.56 9MSANS +2663TOULOUSE PATRICK 119701219930819920811389 9850.66 9CSANS +0038LANGRUNE FRANCOIS 119711119940619951010024 8998.32 9CANGL +8414VILLE NOEL 11971 41990051989051202810241.49 9CANGL +5333SQUARE JEAN LUC 11971 81995051994071450311832.45 9CSANS +3680LAUTREC CALIXTE 21971 9199602199502 7803 7680.84 9MINFOR +9370CAMELIAS CHRISTIAN 11971 5199307199207 9597 8729.90 9MTECHN +6026NADAILLAC JEAN LOUIS 119711019910219900210024 8998.44 9CANGL +4310VICTORIA ERIC 1197110199607199507 7803 7680.44 9CSANS +2394CLAVIERS MICHELE RENEE 219711019910919900910024 8998.26 9CANGL +4996GUILLAUME FREDERIC HENRI 11971 41993031992031330611016.30 9CSANS +6930ROYAL EVELYNE 219711219940119930110668 9426.26 9MSANS +1006CRAU MARIE CLAIRE 21971 21994051992011202810241.04 9MSANS +0817ATHEE MAITE 21971 81993011992011267210590.11 9MSANS +5245VAL XAVIER 11971 3199306199206 8656 8146.79 9MESP +7249CLARS ALFRED 1197110199306199206 7803 7679.41 9.ALLEM +9895JUVANTE JACQUES 11971 61995051994051450311832.69 9MSANS +4769BORDERIE OLIVIER JEAN 11972 219940719930711389 9852.20 9MTECHN +4620VERDEILLE FRANCIS 11972 619930419940910363 9232.32 9CSANS +3812BLAINS DIDIER 11972 9199302199202 9597 8729.94 9MANGL +9910FORET JEAN CLAUDE 11972 119930719921011389 9851.30 9CSANS +5930CHATEAU SERGE 11972 9199205199105 9597 8728.49 9CMICRO +3132SAGONE EMMANUEL 21972 4199601199501 7803 7679.46 9MSANS +2171BERGERONNETTES STEPHANE 11972121995111994111450311832.22 9MSANS +5929CARRIEREBLANCHE OLIVIER 11973 6199410199310 9597 8728.98 9CINFOR +6111ROCHETTE JACQUES 1197310199307199207 7803 7680.93 9.ANGL +1480CREYSSAC VANESSA 21973 4199511199411 7803 7679.33 9CSANS +9433BIS NICOLE 21973 6199407199307 8359 7951.65 9MALLEM +5673ROLLIN JEAN 11973 6199304199204 9597 8728.28 9CESP +8786MIMOSAS ALAIN 11973 21993031993061420611637.51 9CANGL +3099MAUR ANDRE 11973 41996051995051450311830.65 9CANGL +1278ENTASSI VERONIQUE 21973 7199606199506 7803 7679.67 9CSANS +6956PRIEURE FRANCOISE 21973 819930919920911389 9851.28 9CSANS +7084AVNEUE JACQUELINE 21974 7199606199506 7803 7679.99 9MANGL +9484DOUMER JOEL 11974 519930819940910363 9232.98 9CESP +9483VILLEBON REMY 11974 8199606199506 7803 7679.78 9CSANS +4120SURBAIX FRANCOIS 11974 719940819930810668 9425.81 9CSANS +6136PASSERO JEAN PAUL 11974 4199606199506 7803 7679.78 9CANGL +9119SERVAN VERONIQUE 21975 7199505199405 7803 7680.00 9CANGL +0958RENDEZVOUS BARBARA 21975 6199307199207 7803 7679.87 9.TECHN +0221ANDALUCIA SERGE 11975 1199606199506 4264 5818.98 9CANGL +1770MARIGOT DIDIER 11975 9199407199307 7803 7679.94 9CCOMPT +2889MANE JACQUES 11975 5199606199506 7803 7680.21 9CINFOR +8800CHEZ JEAN 11975 5199408199308 7803 7680.98 9CANGL +6217MURE GREGOIRE ROBERT 11976 5199607199507 7803 7679.28 9CANGL +9488HARMAS JOSE 11976 8199607199507 7803 7680.27 9CANGL +9074MILIERE ELIANE 21976 6199607199507 7803 7681.26 9CSANS +8755BOITRON MICHEL 11976 4199606199506 7803 7679.67 9CSANS +5066LOGES PATRICK 11976 2199401199301 7803 7680.72 9CSANS +7767CAVOK CATHERINE 21976 4199506199406 7803 7679.49 9CANGL +4014DELAMBRE ALAIN 11976 4199507199407 7803 7680.71 9CSANS +7434CHAMPCEVINEL MICHELINE 2197612199606199506 7803 7681.25 9CSANS +3520CATALINA CATHERINE MARIE HELE21976 9199506199406 7803 7681.34 9CVENTE +6859BILLET JEAN LOUIS 11977 7199606199506 7803 7680.36 9CALLEM +3181NADAUDS JEAN MARC 11977 2199506199507 7803 7679.51 9CANGL +0928DELACROIX CATHERINE 21977 6199607199507 7803 7681.13 9CALLEM +5100BREVAINVILLE GERALD 11977 8199607199507 7803 7679.45 9CSANS +2336ROCAMADOUR GILLES RENE 119331219861119901011131 9658.9910MINFOR +3692ALBIZZIAS DOMINIQUE 11935121965031994011557012566.3610MSANS +1060SEDS ANNE MARIE 21935 61970071991071578112722.8210VANGL +1596OPERA JEAN LUC 11935 31971101991041433211714.3910MSANS +2633SOULEYRAS MONIQUE 21935111958071993012470018540.4410MINFOR +0658LOURMEL BERNARD 11936 51967051994011932314934.8010MTECHN +1362LAC YUMIKO 21937 41965061994012137316332.6910MSANS +7201ILE JEAN PASCAL 1193711198810198309 8656 8145.1210.SANS +7674CASTE PIERRE 11937121971061993072547019086.2710MVENTE +9244LIVRY EDITH 21937 1198901198306 8656 8145.3810.INFOR +4790FRANCIS LYSIANE 21937 2199001198903 8656 8146.5210.SANS +7950CHARBONNIERE STEPHAN 11938 61972051991011433211714.5510MSANS +1814IRMA MARIE 21938101967011989091932314935.3810CANGL +0599FAUBOURG BERNARD 11938 71961011986012273717261.9010MSANS +0425PLUVIERS JEAN PIERRE 11939121971071995081557012567.3610MSANS +7312EST THIERRY 11939111971071992011433211715.4510MANGL +2010CAMP LAURENT 11939 319890119931211389 9852.1510CTECHN +3770COSTES ELIANE 21939 91980071992121471512024.9610CSANS +3046CRIMEE JACQUES 11939 719890619880610494 9309.0810MANGL +5231BONNETERIE VERONIQUE 21940 61962021988042273717260.8010VINFOR +1917CENTRE FREDERICK HENRI 11940 31961091990012739020404.0510MALLEM +0890MIEGESOLLES BERNARD 11940 21960041995043200223583.4110MESP +5720SAULX JACQUES 11941 71971071990071663613343.3310MSANS +4881DESFOSSEZ JULIETTE 21941121976051991051684813422.8110MSANS +5085ALBERIC PHILIPPE 11941 919900719950310407 9271.7010MANGL +0632BESSE PASCAL 11941 51966021989071663613343.7310MSANS +5114SHARON MICHEL 11941 21968081984062022115555.3510MSANS +4229TERRASSE BERNARD 11942 11964111993102137316332.4710MSANS +2811BROSSOLETTE GEORGES 11942 11967121990011663613343.0610MSANS +0937TILLEULS BRUNO 11942 81972061992011433211714.9110MANGL +6193ROOSEVELT CHRISTIAN 11942 71972061991011663613344.1510DTECHN +2942PETEL GEORGES 11942 21974051992071369311287.8610MTECHN +9989TASSIGNY JEAN PATRICK 11942 91971071992011403411520.6610MANGL +1548BARBIER RENAUD JEAN 11942 81961081986042273717260.1910VINFOR +9612LAURAGAIS PHILIP 11943111972031995042547019084.9710MCOMPT +0194FOUQUEVILLE BRIGITTE 21943 51963041991072273717261.1310MSANS +2327GAVOTTE JEAN MARC 11943 11974051993011369311287.1010MSANS +9716HENRI JACQUES 11943 31963041993032922321685.2910MANGL +2720LOCMIQUEL BERNARD 11943 6199301199201 8656 8145.4410.SANS +1736OLIVERAIE VERONIQUE MICHELLE 21943111971071991071578112723.5010DANGL +5205PIOCH VERONIQUE 2194412199302199202 8656 8145.2610.SANS +3085TRASTOUR GERARD 11944 61972041990011433211714.0710DSANS +0317MOUETTE THERESE 21944 51972051988101621213032.5110MSANS +5694PIERRELAIS ERIC 11945 81972091976082022115555.4410CANGL +1116BOISSISE ANNE MARIE 21945 1198901198606 8359 7952.1210.ANGL +4722BRIMONT MARTINE 21945 5199007198907 8656 8147.1710.INFOR +3958CRAMCHABAN MICHEL 11945121969011990101433211714.5110MSANS +7673SURESNES JEAN PIERRE 11945 61982011992101249910472.1010DSANS +7687VALET JACQUES 11945 61972071989011621213032.1710MANGL +8152TAILLIS FRANCOIS 21946 91976021991101578112722.6610MCOMPT +0924BONAVENTURE REIKO 21946 91971011993042547019086.4510MVENTE +8336MASSUGAS MICHELLE 21946111968111992091834514274.3910MSANS +8834LEMENC DIDIER 11946 11974031992102334017609.9510MSANS +6052DURAND LAURENT 11946 21972121988061932314934.9910MSANS +8405GAULLE JACQUES FRANCOIS 11946 31969051989012273717261.7510MSANS +7901VIOLAINE JACQUES 11946 419840719900711131 9659.1710MALLEM +9538SUEDE JEAN MICHEL 11946101971021991011433211715.6910MSANS +7317MARMONT ALAIN 11947 91973051991071621213032.1210MSANS +8240ASSOMPTION JACQUES 11947 11973011991072837121100.6710MALLEM +8104FRERE DOMINIQUE 11947 11975041993011369311286.0310MVENTE +6906VILLEFRANQUE FRANCOISE 2194810199107199007 8656 8145.4410.MARKT +4316DOMDES NOELLE 21948 51971011989082022115554.9910MSANS +8058RANGE MARIE CLAUDE 21949111973061991071578112722.2410MSANS +6117WILSON MICHELINE 21949 21970011993111834514274.5310CSANS +2977CERISAIE CAROLE PAULETTE 21949 81972051993111471512025.8210MCOMPT +3294PLOUER MICHEL 11949101969101989042022115555.4110MCOMPT +4908GIRONDE PATRICK 11949 41981091992011249910472.6910MSANS +2440AJAC FRANCOIS 11949121974081990011684813423.2610MSANS +6866MUSTAPHA VALERIE 21949 71970111994071834514275.3810MALLEM +9238CHOISY JACQUES 11950101976081992042022115555.4810MSANS +5421NATIONALE FRANCOISE JEANNE 21950 21971061995121684813422.3610MSANS +7441ROCHE CLAUDE 11950121977051993041369311288.0110MINFOR +2053LOIR MONIQUE 21951121972061990011621213032.0610MANGL +6550BELLEVUE FREDERIC DAVID 11951121970111990122470018540.4210MANGL +0900PAT VICENTE 11952 61977071991011369311287.7710MINFOR +9719BERAL YVON 11952101986101994011433211714.3710MVENTE +8718VIENNO DOMINIQUE 11952121976101991011369311287.8310MSANS +5348CRIKET JEAN 11953121979051995041471512024.2110MSANS +7442DETAILLE JOEL 11953 81973031991012334017608.5310MSANS +7704MARTILLE CATHERINE 21953 21973041991072137316330.5310CANGL +3122MADELEINE CLAUDE 11953 31978061995041471512024.7810MANGL +7454AURAY MARC 11953121972121992122175716601.7510MSANS +2338LAMARTINE DOMINIQUE 11953 81981051992011471512025.4710MSANS +5898ITALIE DENIS 11955 419941119920110791 9502.4110MSANS +2818ENTREPRENEURS BRIGITTE 2195610199506199406 8359 7951.8010MSANS +4736MONTBRIEUX LAURENT 11956 11982051991071471512024.9210MSANS +5607ORBAY GILBERT 11956121976071994011369311288.0110MTECHN +6044BRONZE CHANTAL 21956 31978031990101911114779.0510CESP +2949AIGREFEUILLE HERVE 119561119810119840811389 9851.9210MTECHN +1891POSTALE DIDIER 119561019820319810611131 9658.0110MSANS +6887ESTADOU MARC 1195712199311199211 8656 8146.8810.COMPT +3156FLACQ PHILIPPE 11957 11980081992011608112915.1510MINFOR +0665MIRAGE HERVE 11957 41978031995041249910471.8810MSANS +9619SOLEIL SYLVIE 2195811199406199507 9126 8456.9610MTECHN +7598COTES MARC 11958 41978041995041249910471.9410MINFOR +1289SOUCI ANNE 21958101980071979071194310202.5910MSANS +5278SEYSSUEL ROSELYNE 21958 51979021993071608112917.1010MSANS +5065INDUSTRIE JEAN PIERRE 11958 81978071995041249910473.1510CSANS +6257PLESSIS JEAN YVES 11959 51983041994011433211714.2810MVENTE +5018CHAUX JEAN 11959 91979061993041471512026.1810MTECHN +4009PLEIN ANTHONY 11959 719810119800511389 9850.5610MTECHN +9730PRINCE JEAN JACQUES 11960 31982051991091326611017.5010CSANS +1357TAMNIES FRANCOISE 21960 11980031979031215710279.3810MSANS +8601VALMY PIERRE M 119601019820319810311131 9657.9610MTECHN +5371ARC GILBERT 11960111988101996012773220636.1610.INFOR +0267OLIVIERS DIDIER 11960 7199312199212 9597 8728.6410MSANS +3866FLEURIS JEAN MICHEL 11960 41986021993041288210744.6410MTECHN +4485ALLEMANE PHILIPPE 11960 71983011989041608112915.2410MSANS +1801CAUTEGRIL CORINNE 21961 11981031992061527112372.9010CTECHN +0557BENEFIAT MARTINE 2196111199412199312 7803 7680.7710MSANS +2605MATHURIN PIERRE 119611019830419820411131 9658.4710MINFOR +8035BASSETTE BERTRAND 11961 31987081986081288210743.8610MANGL +4026GAJAC KARIN 21962 81983011982011608112916.3210MSANS +8790TREDREZ LEONIE 21962 71986061985061288210745.2210MSANS +0932BASTIDON MARYLENE MARTHE 21962 7199301199201 8656 8146.4210.SANS +1052MARJOLAINE PHILIPPE 11962 11984111991071868714507.4710MSANS +3917FONSORBES JOEL YVES 11962111982061988051326611016.6210MALLEM +6770ROUBIN FREDERIC MARC 11962 719840419870211131 9658.4110CSANS +9591BAS EDOUARD 11963 319850419841210791 9503.5810MSANS +0126LALA MICHEL 11963 219830619820611131 9658.7410CESP +0547GAUMERIE EDGAR 11963121985011994011433211714.2510MANGL +5064LOISIRS GEORGES 119631019851219860510791 9503.6610MALLEM +6975BOUCHET YANNICK 11964 61985111985112090215981.0610MESP +2365TERNES ERIC 11964 51983081994011433211714.4310VVENTE +1287OIDE MARIE LOUISE 2196412199201198703 8656 8146.9710.SANS +1746MICHELETTE GERARD 11964 619840719830710791 9503.7410MSANS +4496COLONEL MONIQUE 21964 41984091983091288210744.8610CSANS +6420MERCURE MICHEL 11965 61985121993121288210745.0010MSANS +2452FEUDON ANNICK 21965 81989061988061249910471.8910MANGL +3490DION ALEXANDRA YVETTE 21965 6199504199404 7803 7680.5910MVENTE +9441GALLET JEAN CLAUDE 11965 11991021994022256617147.1310MSANS +8588JARRES GERARD 11966 919880319870310407 9271.5610MSANS +1291HERMITAGE XAVIER 11966111991101990101330611016.3310CSANS +6530ETRUN PATRICK 11966 31989111988111539912452.4210MANGL +1352PLAIS JUAN CARLOS 11967 419870719860710407 9270.9110MSANS +7277REY MICHEL 11967 21995081996012559919162.3610CSANS +1793BARBE VALERIE ANNE 21967 5199201199101 7803 7680.5910.INFOR +3158KERIOLET FRANCOIS CHRISTOPHE 11967 41990051992121381911365.8510CSANS +0027DANS JEAN PIERRE 11967 719920119910110024 8999.9910MSANS +6374PUISEAU THUY LAN 11967 61987041991121249910472.2410MESP +9025BEUVRON PATRICK 1196711199606199506 7803 7679.4610CANGL +9820CHARLES CATHERINE 2196710199507199407 8656 8146.4610MALLEM +6484VIGNAUD PATRICK 11969 91990071992031381911365.6710MSANS +1414BRUNE SYLVIE 21969 619890219880211302 9775.1910MSANS +4633MICHELET JOHAN FR 11970 619901219891210024 8999.7210MINFOR +2182PLANTIER PHILIPPE 11971101995091994091450311831.5510CSANS +8157LILAS PIERRE 1197210199207199107 8656 8146.5510.SANS +5454LOIR MARIA 21973 5199406199306 7803 7680.1410CANGL +9209CARREFOUR SERGE 11974 6199505199404 9126 8455.7410MALLEM +3395ADAM JEAN CLAUDE 11974111993091994011202810241.5810CSANS +8662REIGNIER JEAN MICHEL 11975 9199607199507 7803 7681.4710CSANS +8679MOUTONNE MARIANNE 21935 9199408199201 9085 8419.1611DCOMPT +9359RASPAIL ALAIN 11935 91963121994103200223582.5411MTECHN +0977DELBESSOU JEAN CLAUDE 11935 91958051992013844228044.4211MANGL +5628REPUBLIQUE PHILIPPE 11935111967011995041557012567.7211MALLEM +5361CHAUMIERE CHANTAL 21937 91967011992011471512024.5111MANGL +8814KIKOCHI CHRISTINE 21939 819880519870510407 9271.4611MTECHN +3550CONCLUE PAULETTE 21941 21973081991071578112723.7211MTECHN +3525PAU CLAIRE 21942 81965021991122334017609.2411DSANS +6963CEZANNE CAROLE 2194310199411199311 8656 8146.7911MALLEM +1837FRIZAC PETER 11943 81976041995011578112721.6711MINFOR +5658SOLANGIERE JEAN 11944121969121990041433211715.0511MSANS +7261MONTGERMONT SOPHIE JEANNINE 21945111971111995041834514274.5111MANGL +4785LODI PHILIPPE 11945 21980071994011471512024.5611MESP +5841PORT JACQUELINE 21946 41970021969021300910822.2611MANGL +0606BAGEN MARIE JEANNE 21946 11970121993032022115555.6811MSANS +5640GALLIA BENEDICTE 21946101973101993121911114780.1311MINFOR +0298BRETIGNY MICHELINE 21946 5199208199108 8656 8145.8011.TECHN +3925PELLETIER MARTINE 21946111968111993012137316332.0911MSANS +7692BARBIN MARIE NOELLE 21948 21968111990012137316331.0611CINFOR +3739JUIN MARCEL 11948111981091992011249910472.7411MSANS +7300URANIES CHRISTIAN 11948 91973021992011433211714.6011MTECHN +6456TUBLERIE CAROLE 21949 81968111992032470018540.0611MANGL +3324TAMANACO MARTIAL 11949 21974061993011369311288.2211MSANS +8400LOIRE MURIEL 21949 41969031991091834514275.4511MSANS +9140RENAITRIE CLAUDE 11949101980071995041249910473.7211MSANS +5589SITE PATRICIA 21949 7199508199408 7803 7679.4611MVENTE +5386MEDECIN JACKY 11950 21975051992101369311286.8711MSANS +2377VOLTAIRE CHRISTIAN 11951111976101993041471512025.2511MSANS +4340BAUDRIMONT JEAN FRANCOIS 11951 41984071993121326611017.5511MINFOR +0397PAREAGE JEAN YVES 11951 81979071994101249910472.9611MANGL +9259PEYRAS CHANTAL 21951 4199608199508 7803 7679.6411MVENTE +1711ESTAGNOL BRUNO CLAUDE 11951121983051992071578112722.6611MINFOR +4351CHARRON ANNICK DENISE 2195210199408199308 8359 7952.4311MALLEM +2396CHAPELLE JOCELYNE 21952 41976061975061288210745.0911MANGL +3571OBSERVATOIR NICOLE 2195211199610199510 7803 7679.9911MSANS +2219LISA MARIE LOUISE 21952 11973061991041578112722.4211MSANS +7029VIERGE DANIEL 11953 51976091994112547019086.5111MSANS +6315EPSOM LAURENCE SONIA 219531119961019951010668 9425.3111MSANS +8330GUISE VERONIQUE 21954 91975071974071215710279.3211MTECHN +4963GUILLOTIERE ROBERT 11954 21977071992072350617727.3311MSANS +9223MARCHAUX JEAN PATRICK 11955 91975031991071578112722.0711MINFOR +8081JAMBLES BERNARD 11955101980061995041249910472.1211MSANS +2906DOUGLAS ERIC JEAN MARIE 11955 21978051994011369311287.7711MSANS +3749MAGNAN PIERRE 11956 7197910199111 4134 0.8911MESP +8176THENOT DIDIER 11956 71980021982102470018541.8311MSANS +3392SIMON PIERRE 11956 61979021994041249910472.7011MSANS +6393BERGERS LYDIE 2195611198901198604 8656 8146.4111.VENTE +7181CABAUDRAN FREDERIC MICHEL 11957 21978061991102529918969.2211MSANS +6568LANDEDA THIERRY PATRICE 11958 31979071993071471512025.9511MSANS +0333DAPHNE CHRISTOPHE 11958 719820619810611131 9657.6211MSANS +2504TREICH JACQUES 11959 51982051994081638413149.5711MALLEM +3534KHRAIEF CHRISTIAN ANTONIN 11959 61981031995021433211714.7011MSANS +9601PECLET GENEVIEVE 21959 119791019781010024 8999.7411MSANS +2575BELLEVUE FRANCIS 11959101980051991091369311287.1611MSANS +1679GRIGNAN GERALD 11959 71981081993081804514082.7211MANGL +4039GOULAINE EDWIGE MARCELLE 21959 51979081993071471512024.9611MSANS +3106YABBOQ CHRISTINE 21960 119910619900610024 8999.7011MANGL +5771GONDS JACQUES 11960 21983051995011433211713.8911MSANS +3478ATHOS FRANCOIS 11960 21983081989112090215980.7311MSANS +3217MOINES FRANCE 21961 51982111981111326611017.1611MTECHN +3318EPINAY DIDIER 11961 51982111995091450311832.0011MVENTE +0241PROVENCALE CHRISTINE 21961 11984021983021249910472.6111MSANS +7712JANVRY CHRISTIAN 11962 41986081995011373711328.3211MTECHN +8426FILET GLORIA 21962 1199607199507 8656 8146.2911MSANS +2991BOIRARGUES MARC 11962121982061990091326611016.1711CSANS +4250FOREST ANGEL 11962 219830819950911131 9657.3911MINFOR +0642GOGH ANNICK 21962 719960219930410668 9427.0711MSANS +3978FONDETTES YUKIKO 21963 71984081983081527112374.5211MANGL +1989BRANCION MARIE JOSEPHE 21963 51990041993081330611017.2911MSANS +7919CERFS BRIGITTE 2196310199310199210 9597 8729.1711MALLEM +6531DORMELLES PIERRE JACQUES 11963 41983041982041326611016.5111MSANS +0104SALETTES FREDERIC 11963 219860519850511131 9658.8611MMICRO +3391LAURISTON JEAN CLAUDE 11963 41983061991091326611017.6511MINFOR +9918BOULEAUX DANIELLE 21964 8199505199405 8656 8146.1111MSANS +9860MOREAS LOIC 11964 2199303199203 9597 8728.9811MSANS +4629LEMBRAS MARC 11964 31988041989011527112374.8411MSANS +8531SIGNORE CHANTAL 21965 4199607199507 7803 7680.8911MSANS +5775GRANDS LINDA 21965 41988061987061249910473.6311MESP +0548VALERIEN PHILIPPE 11965 71986041995041710713577.0111MSANS +5728MUCHARISTA GILLES 11965 81985071991121288210744.9511MSANS +0495ALIZES JEAN MICHEL 11965 61986071993111288210745.2211CTECHN +3119GAMBETTA JEAN PIERRE 11965 519851119841110791 9502.2311MANGL +7770NOTTET CHANTAL 21966 31985101984101288210744.2611MALLEM +7186ILLIERS FRANCK 119661219921119911210024 8998.3111CANGL +5800COLOMBIERES VERONIQUE 21966 71992081991081202810240.8611MSANS +8549ROMAI PATRICK 11967 81987041993081450311830.5811MANGL +2557CHAI CATHERINE 21967 9199201199101 7803 7680.9811.INFOR +5044ROUSSILLON HIOU SHU 21967 51987111993031381911365.1911CSANS +3101MARECHAL JACQUES 11967 91988071993011839014313.7211MANGL +9282LEOPOLD ALAIN 119671119880519890910407 9271.9711MSANS +1201PEYRERE PASCAL 11968 919881219871210407 9270.4211MALLEM +7061TEICH PAUL 11968111994031993031267210588.7411MSANS +5746HARRIAGUE GERARD 119681119900919890910407 9271.1911MANGL +6486MAR ALAIN 11968 1199404199304 7590 7564.3511MSANS +0773VICTOR JEAN CHRISTOPHE 11968 71994081993082107316096.7111MALLEM +3494VILLARCEAU ISABELLE MARIE 21969 7199609199509 9894 8921.5911MSANS +1068AMOUR DIDIER 11969111991051990051467711987.6711MINFOR +1796ROCQUENCOURT FRANCK 11970121991091990091202810241.7011MANGL +6197WRIGHT ANNE 21971 919930319920311389 9850.7011MSANS +9660CYPRES GERARD 119711019900719890710024 8997.9011MALLEM +8022ARCAY CLAUDE 11971 51992111991111202810240.1311MSANS +3764CHEMIN FABIENNE 21971 219951119941110668 9425.6411MVENTE +2448PINCHINADES JEAN CLAUDE 11972 21995051994051450311831.0111CALLEM +1927VALESCURE PHILIPPE 11972 4199501199304 9597 8728.7711CSANS +2074AZUR DIDIER 11972 51993111992111267210588.5311CTECHN +9842BASTIDE ERIC 11972 5199312199212 9597 8727.9111CSANS +5954SABLES ROCCO 1197212199305199205 9597 8728.1911CSANS +0278PAIXENT JEAN MICHEL 11972121994101993101360611210.6011CSANS +1572DAGNY BRUNO 11972 11993101992101360611210.2811MSANS +4298AIZIER NICOLE 21972 219940719920111389 9852.4211MALLEM +2321DESIRADE EVELYNE 21972 119910719900710024 8998.1311MTECHN +6794CHEUVRY PHILIPPE 11973 9199207199107 9597 8729.9211CSANS +8383ETIOLLES ANNE MARIE 21974 5199607199507 9894 8922.2111CSANS +3562PORSCAVE GEORGES PASCAL 11974 1199508199408 7803 7679.9911CANGL +6773GERANDO NICOLE 21974 51995051994071450311831.9711CANGL +4226APPY BERTRAND GEORGES 11975 2199606199506 9256 8532.5611CTECHN +1343SANS FRANCOIS 1197510199410199310 9126 8456.3911CSANS +6979ANGLAIS NADINE 21975 7199304199302 8656 8145.5711.SANS +5254BERLIOZ DANIELE 2197610199607199507 7803 7680.5011CTECHN +0275FRIARD GERARD 1197610199608199508 7803 7681.4711CSANS +3929CHATEAU VERONIQUE 21935 2199301199201 9085 8417.4612VANGL +2917PASTEUR NICOLE 21935 31967071990011932314933.6012MSANS +4491FALLIERE CATHERINE 21935 7199109199507 7677 7603.7312.ANGL +4190CHRISTOPHE DOMINIQUE AUGUSTE 11935 31977111992101369311287.1912MANGL +3826RAYON BERNARD 11935 319830819820811389 9851.7412DESP +2841SEVERINE PHILIPPE 11936 6199409199309 8656 8146.7412MANGL +6337FREDERIC CATHERINE 2193812199201199101 9085 8417.6312SSANS +7355ANTOVAL JEAN FRANCOIS 11938101961021995043200223582.3212MANGL +8990DETALOUX CLAUDIE 21938 71962071984102273717260.0812CSANS +7576SEBASTIEN BERNARD 11939 51971121991071663613343.3712MCOMPT +3808CABRIES ANNE LOUISE 21939 31973071985041834514275.9512VSANS +3333BOSQUE JEAN YVES 119391219900919920310791 9503.1612CTECHN +0851ORANGERS CHRISTIAN 11939 11973071992011433211715.2212MALLEM +7226ROYA FRANCOISE 21939121962121983122470018541.7912MSANS +4767DOMITIA VINCENT 11939 6198912198504 8656 8145.1112.VENTE +1932LEROY FRANCK 11939101968101991011433211714.2112MTECHN +4220GUERINIERE MICHEL 11940 11971041991011663613343.9712MSANS +5021MONTLANDON RENE 11940 61973041993011369311286.6612MSANS +3088ALTAIR NICOLE 21941101962031994122470018540.1712MSANS +2222MILLET JACQUELINE 21941 21970051992072137316331.7812MALLEM +6726HURONNERIE CHRISTIAN 11941101980031992011403411521.2912MANGL +1951ROSIERE GILBERT 11941 91971031990011433211715.5412MSANS +4436CHAVANNES MARIA LUIZ 21942 51968111991072137316332.6012MSANS +9151CHATONNAY PAUL 11942 21969021990071433211715.6312MTECHN +2643SOUSBOIS DOMINIQUE 21942 31962041988122470018540.2412MSANS +6554SARCELLES JEAN MARIE 11943111963071993083200223584.0712MTECHN +6672RENDEZVOUS FRANCOIS 11943 11969091990101663613343.6012MSANS +3579RUISSEAU DANIEL 11943 31965011994011557012567.1812MANGL +0484PAUL CORINNA 21943 61965121988062470018540.6612MSANS +3880ROUVRES ERIC 11943 819931119950610407 9271.7412MSANS +4665MONTEE JOSETTE 21943111968041991052470018540.5712MSANS +3302VERS JEAN 11944111970061991011433211714.8712MANGL +6749AUCUN JEAN CLAUDE 11945 11974071992041471512025.0212MINFOR +6957RESIDENCE EVELYNE 21945 61971071991101578112723.4212CSANS +1669CHEZY PIERRE 11946111976051993011369311286.0612MSANS +1674AVENIDA SYLVIE 2194611198806198706 9511 8688.4112DINFOR +6741FONDS GEORGES 11948 11977041994011249910472.1012MSANS +4859ZORI CATHERINE 21948 81968111991021834514274.7012MSANS +1314MINES JEAN MARIE 11948 31975061993071369311288.1812MALLEM +5393PROVEN ANNICK 21948 9199309199209 8656 8145.0612.ALLEM +9886FLAUBERT YOLANDE 21948 41968041995111684813422.3612MANGL +8118JUGY JACQUELINE 2194912199504199404 8656 8146.6412MTECHN +3693RETRAITE MARYSE ARMANDE 21949 9199201199101 7803 7681.4712.SANS +7335PETITES MICHELLE 21949 71970101990112043315671.1512MSANS +6896MERIMEE PATRICK 11949 11972031995011834514274.2412MANGL +0173RESIDENCE HARRY 11949 71973061992101369311287.1412MVENTE +7211LAVIGNAC MARIE ANNE 21950 6199307199207 7803 7680.0912.SANS +6258DEAUVILLE SALIM PHILIPPE 11950 61975101993011684813423.4912MSANS +6945BERANGER AGNES 21950 11970011989011621213034.1012MSANS +6072LAZUEL CHANTAL 21951 11971051995041834514274.4412MSANS +3233GRETZ PATRICK 11951 61981041993011608112917.2412MSANS +3090VERTS THERESE 21951 21972101987072334017610.2012CALLEM +4522POISY BRIGITTE 21951 41973051991011578112722.7012MSANS +1211SAINTE PIERRE 11951 219940119940110407 9272.1312MSANS +9697RUE NADINE NICOLE 21951 11977071991051608112915.7412CTECHN +7336GRURY ANTOINE 11951111977051993041369311286.9212MTECHN +4900BENARD JEAN LOUIS 11951 71973081992032470018540.1512MSANS +0543BARETY JACQUES 11951 71977031993011369311286.8012MSANS +4195GRENIER THIERRY HENRI 11951 71979011994111403411522.0912MALLEM +6636BERANGER JEAN PIERRE 11951 619831219821211131 9659.0112MALLEM +1282PALOMBES OLIVIER 11952 81979061995011621213033.3712MESP +7146VENERIE YANN MAR 11952101981031992011249910473.4712MSANS +8503GIRELLES MARTINE 21952 41993111992011202810240.1312MANGL +9767ROUBLOT FREDERIC 11952 71976121991071578112722.3712MSANS +1506BELLES SERGE 11952 1199301199201 8656 8146.7012.SANS +5411MERMOZ BRIGITTE 21953 419910919900910024 8997.8112SSANS +8001PANORAMAS JACQUES 11953111980031992101369311287.3212MALLEM +8972NOGUES JEAN 11953121981091992011249910472.0112MSANS +6536MARX EVELYNE 21953 7199201199101 9511 8688.8912MANGL +3768LAMBRIGOT PHILIPPE 11954 51976071991012022115554.5412MSANS +0662BRACQ GEORGES 11954121975111993121369311286.4712MSANS +5304BETOUILLERE NORIKO 21954 71979061993041433211713.9212MALLEM +4215PARA KARIN 21954 91979071992111608112915.5312DSANS +2037FORGE LUCIEN 11955 21984021992111578112723.2412MSANS +2945ABBEVILLE PASCAL 11955101983101993011471512025.4612MANGL +2849NERTHE MARTINE 21955 21978091993101471512025.9212MSANS +3488REVOL ANNE 21955111977071992011471512024.0612MSANS +4431LAUNAY LOIC 11955101984091993011215710278.6912MSANS +8724CASSIFLORE ROGER 11956 11976071985102397418036.3812MANGL +0629FRANCOIS SANDRINE 21956 91977071995101881314586.0612MSANS +4823RENARDIERE JEAN LOUIS 11956 41977031992111608112915.2912MSANS +8808ENGHIEN MAX 11956 91977061992011471512025.6512MVENTE +2432MICHELE ISABELLE 2195710199611199511 7803 7679.4512CINFOR +7158CAPITAINE DOMINIQUE 21957 91978061993031608112917.0412MSANS +6317COURLIS GUY 11957 21980051992121369311286.7412MSANS +7608DESSUS SABINE NICOLE 21957121979031993041471512025.2812MSANS +3637PEYRIERE FRANCOIS 11957 81979111995101911114778.2412MSANS +9600HAKEIM THIERRY 11957 51981031986092256617146.6812MANGL +1537RESISTANCE SERGE 11958 81986031991101868714506.0112MSANS +3033PIERREDON JEAN LUC 11958 51980041992121471512024.7812MSANS +9058ROYALES ALAIN 11958 31982081994041326611016.6912MSANS +1074PONTILLARD JACQUELINE 21958 51981111980111608112915.8412MALLEM +0339VERNOCE THIERRY 11958 81982041994041471512025.3212MSANS +1325ZOLA CHRISTINE 21958 81978121993041471512024.9312MSANS +6083HAIG MICHELE 21959 419791119781110876 9502.3712MSANS +9351QUIHOU STEPHANE 11959 41988061992091450311831.2512MSANS +9582LAENNEC COLETTE 21959 41983071982071326611016.0812MSANS +5220RECOLLETS YVES 11959 51981011994011471512026.1512MSANS +5140DAILLON DOMINIQUE JEAN 11960 31984071995081527112374.5812MANGL +4446ELPHEGE PIERRE YVES 11960 419840319830811131 9657.2612MANGL +0969BOUNIN PHILIPPE 11960 71983031991111616712995.2012MSANS +2335CAILLOUP CHRISTINE 21960 11980091994071471512025.0212DSANS +8339MER ISABELLE 21960111980101979101684813422.5712MANGL +6061ESCALES JEAN MARIE 11960 51982051995121804514082.6512CSANS +0818GATTIERES PATRICE 11961121983121989031527112373.0812MTECHN +5053LARUE KARINE 21961 8199407199307 8359 7952.0712MSANS +9219OPALINE EVELYNE 21961 61983111982111202810240.8412MALLEM +6160LAURENT ANNICK 21961 51982091981091527112373.7112MANGL +9514GARGAS NICOLE 21961 31981041980041684813421.4912MSANS +2936KIPLING ERIC 11961 419830419830711131 9659.2212MTECHN +3023BOREL PHILIPPE GILLES 11961 51982041981081608112915.8912MSANS +5767BORGHERE PASCAL EMILE 11961 51985061989112090215981.0912MSANS +9519SUISSES PHILIPPE 11961121985031984031608112916.4312MSANS +7271BOUEL JEAN LUC 11962 21982071990101527112374.1612MSANS +1969BIERE SIMONE 21962 3199404199304 8359 7953.2412MESP +1388MOLIERE GERARD 11962 71987081988011527112374.2012MSANS +5714NICOLO DIDIER 11962 11983071984121608112916.8112MCOMPT +1039ATTILL ERIC 11962 91983081984091608112916.6412MALLEM +4474SAUSSAYE MICHEL 11962101989011992121249910471.9712CANGL +0108ORBESSON MIREILLE 21962 81983041989112090215981.4112MSANS +8464DIJON JEAN LUC 119621219860219850210791 9503.7012MINFOR +0217MAGDEBOURG PIERRE 11962 51986071995011373711327.8712MANGL +5259VANOEL SERGE 11963 81984021991011868714507.8512CSANS +6176GOETHE GILLES RAYMOND 11963 41983051993121326611016.5712MSANS +3711SIGNAL KARIN 21963 6199407199307 9126 8456.8212MCOMPT +5792ARCACHON SERGE 11963 519931019910710407 9271.9712MCOMPT +2491OSSOLA ANNIE 21963 51993101992011202810240.2612CSANS +5463PERE JEAN LUC 11963 819860319850310791 9503.8812MSANS +0572ALSACE MICHEL 11963 219830619920111131 9658.0212MANGL +5197LATECOERE BERNADETTE 2196411199201199101 7803 7680.2312.SANS +3820SAUSSES MICHEL LOUIS 11964 31986061985061288210743.8312CINFOR +3831CRESP BRIGITTE 21964 6199109199009 8656 8145.8412.TECHN +7862GUILLEMARD GERARD 11964 619870419880910791 9503.2712MSANS +3863TREMOILLE LAURENT 11965111989011991051249910473.0012MTECHN +2269VERDUN DIDIER 119651019870219910110407 9271.4212MSANS +4817VAUCLUSIENS JEAN PIERRE 11965101986051991091288210743.8612MVENTE +8120BUSSIERE LYNDA 21965101988041994121450311832.2912MSANS +9872ROTTEMBOURG PHILIPPE 11965 71985071991091288210745.6112CALLEM +3157GEORGES MARC 11965 119870219860210791 9502.1412MVENTE +5375GRAFFIANE ROBERT 11965 119870419861210791 9502.8912MSANS +9838SELLE XAVIER 11966101992011991011202810240.9512MSANS +4716BEG PASCAL 11966 61987061992041249910473.4212CANGL +8142FONTENIL MADELEINE 21967 91990051993051723313653.6012VESP +4631ROBINS ISABELLE CAMILLE 21967 61993111992011202810241.8112MSANS +0875RESISTANTE ALAIN 11967 61988041994011249910473.1812MSANS +7618JUANE JOSEPH 11967 919880919910210407 9270.4812MSANS +6297QUINT MARIE CHRISTINE 21967 11989121988121202810240.8412MINFOR +9234SAINTRY FRANCK JEAN 11967 619891019881010791 9502.8912MSANS +0878MERIMEE GUY 11967 81990011989011467711986.9112MSANS +7463VALETTE BERTRAND 11967 91987051994051381911366.9312MSANS +1043RAMBOUILLET JEAN FRANCOIS 11968 81990071989071381911364.8712MANGL +2350PANPYC CLAUDE 11968 91990111989111467711985.8712MSANS +9468GUEPIN EVA 21968 41989051988071949415051.6812MSANS +4690VERLIN YVES 11968101989111994011249910473.4712MINFOR +4832BAYARD CORINNE 21968 21990111989111202810239.8312MSANS +2141CHATAIGNIER CATHERINE 21968 519940919930411389 9852.2212MMANAG +2439AIGUILLE CATHERINE 21968 9199407199307 8359 7952.2512MVENTE +2895PASSAGE PHILIPPE 11968111990031989081381911366.2212CSANS +6720ANTHEOR VINCENT 11968 21988051993041249910472.6412MSANS +4877AUBIN PATRICK 11968 71990011989011202810239.7812CSANS +7975GUITTARD ISABELLE 21968121993121992011202810240.1912MSANS +3884DESMOULINS ANNIE 21969 2199510199410 7803 7680.5012MSANS +4326CASSIOPEE JEAN PIERRE 11969 21989031988031249910473.5612MSANS +9844DAUDET ROBERT 11969121993101992101330611016.3012MALLEM +1235TRANSIT CHRISTINE 21969101992031991031420611639.2212CINFOR +9148CARTIGNY TONY PIERRE 11969 81994091993091450311830.6212CMANAG +1898VEUVE BERNARD 11969 119891019881010407 9270.6912CALLEM +4856BELIER JEROME 11970 11990111992011381911365.6212MSANS +3215BASTILLE GILBERT 11970 219921019911010024 8997.8612CSANS +1681VAUCHAMPS THIERRY 11970 319940419930111389 9852.2412CVENTE +0330GIRAUD DIDIER 11970 319940319920110024 8998.7112MALLEM +2920FONZERI PAUL 11970 81993061992061267210590.0212MTECHN +3390CLANS LOUIS 11970 51989111988111539912451.9712CSANS +7148OISEAUX FRANCE 2197011199004198904 8656 8145.6612.MANAG +2817GAIRANT MONIQUE 21970 319910719900710024 8997.9112CSANS +8162VOLONTAIRES MONIQUE 21970 5199410199310 7590 7564.3812MSANS +9567LEGUMES CHRISTINE 219711119950419940110668 9426.0312MANGL +2435BRESSON SYLVIE 2197112199007199101 8656 8145.9312MSANS +0955BEAUGENCY LAURENCE 21971 1199206199106 9597 8729.9712CSANS +4021VICOMTE ROLAND 11971 119900619890610024 8998.0112MINFOR +7963MONTESQUIEU HENRI 11971 51993081994011249910473.0512MVENTE +9955WAY JEAN MARC 11971 1199305199205 9597 8728.0112CSANS +1833INKERMANN LAURE 21972 919930519920511389 9851.3912MANGL +4630CHEVREUILS CHRISTINE 2197312199306199206 8359 7952.0112.TECHN +3273MIREILLE ALAIN 11973 819931119921111389 9851.5512CMARKT +6842DARONNE ALAIN 1197311199307199503 9597 8729.2212CINFOR +5953BOURGEOIS BRUNO 11973 21993081994011202810241.9212MSANS +3467PONTIER ALAIN 11973 619930919920911389 9850.5612MSANS +6507MAYVILLE CHANTAL 21974 1199208199302 8656 8146.4112MANGL +4060HALLEGUEN MICHEL 11974 11993121994011202810241.7012CSANS +8760RAGUINOT GHISLAINE ROBERTE 21975 1199507199407 7803 7681.4412CSANS +1454NEUF GILLES 11977 9199606199506 7803 7681.3512CSANS +2092BRASSAURIS MICHEL 11931 91956101978013327724477.6013VSANS +8552VIOLET DIDIER 11933 4198810199501 8827 8263.5613.SANS +6589DEVENCON BERNARD 11934111955111993103417325098.4513MSANS +7036PERNETY FREDERIC 11934101961111987102273717260.4013MINFOR +7079CHARDONNERETS LAURIS 11935 31978071992011403411520.5313CINFOR +9868JAURES MICHEL 11935 51970051992011403411521.2013MSANS +8365HELIOTROPES LISE 21935 11963021991072273717259.8613CSANS +7450POISSON CHANTAL 21936 91968111989011621213033.5613MINFOR +9779CONSOLACAO NATHALIE 21937 3199401199201 9085 8417.3613VSANS +8202DIANE JACQUELINE SUZANNE 21937 61972041989101621213032.8713VESP +5521LAZURE RAOUL 11937 31966021995011557012567.6313MTECHN +7843NOM ETIENNE 11938 1199001198510 8656 8145.6213.SANS +7282IRISASCO ERIC STANIS 11938121958081988013844228045.3713MSANS +3124VIVIER GEORGES 11939121967011994011663613342.8513MSANS +1445GAUSSADE FRANCINE 21939 11967121992012137316332.1113MSANS +5399GROSSETI JACQUES 11940111969011990011433211714.7913MSANS +7177MONTSEGUR DOMINIQUE 11940 2199206199106 8656 8146.8313.ALLEM +4475SOLEIL JEAN CHARLES 11940111962041993043417325097.6413MINFOR +6615GRAVELLE CLAUDE 11940 419880319870810407 9270.3013MESP +5880OR LILIANE 21940 8199301199201 8656 8147.0113.ANGL +0756RENARD PATRICK 11941 71960041991013327724477.7213MSANS +9016SIMON JACQUES 11941 81973061992101369311288.1813MANGL +4931AIGNAN SALOMON 11941121972111992011403411520.2913MSANS +7676ROUX DOMINIQUE 11941 81969121990011433211715.5413MSANS +3434NOUVELLE GUILLAUME 11941 31970061991011433211715.4713MSANS +1569MOULINS CATHERINE 21941 31993051993101249910472.9113MSANS +4399SOLDATS ANNE 21941 71963091994011932314934.0013VSANS +4929MANOUCHIAN RICHARD 11943 41979011992011249910473.3213MALLEM +5101CLOT PATRICK 11943101977041995011578112723.1813MSANS +1399PLANTES MEDERIC 11943 61962111991072273717261.5413MTECHN +4835LECHIAGAT MAURICE 11944111963121993082922321683.6013MSANS +2862CASTELROC PHILIPPE 11944 81968091988062947921840.0613MTECHN +5852PUGET JEAN LEO 11944101971011990032022115554.8113MSANS +4369BOUCHER LUCIEN 11944 51976051991012022115555.3913MALLEM +6206VERANE COLETTE 21945 11975101987031684813422.3113MSANS +2842ROND THIERRY PIERRE 11946 11967121993013844228045.1613MANGL +8250JULIEN MARIE PAULE 21947 4199409199309 7803 7680.0013MINFOR +4160ALLUES DANNY 21947101978071993012529918968.6013MSANS +8190BUT CLAUDE 11947 71982041994011471512024.0813MANGL +9979FLORALE STEVEN 11947 21975041992101369311286.7813MANGL +5458BEYNAC PIERRE 11947111972031994011663613343.8813MESP +5735CONDE THIERRY HENRI 11947 51976041995011578112722.5213MSANS +6972BIRAC DANIELLE 21948 41973071991071578112722.1913MSANS +8328MAC LAURENT ROLAND 11948121977031993011369311287.1013MSANS +8020COMMODORE JACKY 11949 21977031993071369311287.0713MSANS +9492BOURGADE FREDERIC NICOLAS 11949 91972081986092470018540.6013MANGL +7494HAM JEAN BAPTISTE 11949111979041993081369311287.1913MSANS +2684LANTERNE JEAN PIERRE 11950121975041991071578112723.1813MSANS +8110LACOUSSIERE MONIQUE 21950 71993101992011202810240.4013MANGL +4050HERBILLON FRANCOIS 11950111971051991012470018540.6113MSANS +0115ACHILLE JACQUES 11951 41976021992091834514274.9313MSANS +6913MADAGASCAR FRANCOISE 21951 81977101993041471512024.8713MANGL +9541FARGE FRANCOIS 11952 91984031994011433211714.8813MANGL +1147VERTES GEORGES 11952111979041991011608112917.2413MANGL +3720FRESNE PASCAL 11952 91973021992082022115554.4213MALLEM +3427LYAUTEY SOPHIE 21952 91973051991011578112723.4213MALLEM +6348TOURELLE BEATRICE 21952 51972061990011621213034.1513MANGL +6291MONTMERY MICHEL 11952111978091995011578112723.5413MSANS +9048VILL YANN 11953 51981021993011369311286.6913MSANS +2556GAGNEUR MARTINE 21954 3199611199511 8359 7952.9113MTECHN +5041GALAND MICHELE 21954121981071995071433211714.0113MSANS +6421OUERRE CHARLEY 11956111982071993011249910473.1113MESP +8090BALISE JOEL 11956 61986011995011373711326.7113MSANS +6312RASPAIL CAROLINE 21956 619940619920111389 9852.5113MSANS +6598RUBENS JEAN MICHEL 11957121976121992011578112721.6513MMARKT +7944MAUBEUGE JEAN ALAIN 11957 11982031981031326611016.2913MMARKT +8793MOREAU BERNARD 11957111985051988031288210745.0413MANGL +8404CHEVERNY OLIVIER 11957 51983081995011578112722.8713MSANS +1860CHAMPIGNY JEAN HUGUES 11957121978031993051608112916.7213MSANS +9938CHARENTON PASCAL 11957 21981061993011471512025.2513MSANS +0001TASSIG ARMELLE 21957 71982031981031288210743.8113MSANS +6966GARE MARIE THERESE 21957 41979101993071471512025.8213MINFOR +5849ELOI FRANCIS 11958 21983051993011215710279.9913MALLEM +0222GERTWILLER ROLF MIC 11958 61983061995061894014661.1213MINFOR +9106MAISON JEAN CLAUDE 11958 11978021992051471512025.5613MSANS +3045BATISSE PHILIPPE 11958 51977121992012175716600.9413MVENTE +6087HUCHA ANNE NATHALIE 21959121981011988112090215981.6313MSANS +7732GENETS JEAN DENIS 11959121986061985061288210745.3913MSANS +8156BRASLES BRUNO ROGER 11959 81984041995071433211714.0613MSANS +4809GENEVOIX ALAIN 11960 219810919810111389 9851.6613MTECHN +2618BOCOUMYAJOUR PHILIPPE 11960 41980061992092090215981.1813MSANS +1786TREVARESSE FRANCIS 11960 21981091994011471512025.5013MSANS +7909CHARITE CATHERINE 21961 11985041984041527112373.8513CESP +7849BUCHES COLETTE 21961121985051984051527112373.8513MSANS +7624JOUVENES CATHERINE 21961 1199504199404 8359 7953.5113MANGL +2428DUCOS FRANCE 21961 1199309199209 8656 8146.1613.ALLEM +4640FINLAY JEAN PAUL 11961 319830419841011131 9658.3413MSANS +0498MONET ANDREE 21961111983081982081608112917.0013MSANS +3902ISTANBUL DENIS 11962 519840619830611131 9657.5313MINFOR +8720LOU ALBERT 119621119880819870810407 9271.3413MALLEM +9086CARNOT HENRI 11962101990111989111450311830.9813MSANS +4105CHAMINY YVES 11962 21982051987041608112917.1013MVENTE +7566SAINS CHRISTIAN 11962 31983091993051527112372.8113MSANS +2552FOCH FRANCK 11962121986061990111288210745.8113MSANS +5248VERONESE PATRICE 11962 219890119880210407 9271.9913MSANS +0127GRENETA BEATRICE GENEVIEVE 21962101984071983071288210743.8613MANGL +6150MAUREL DOMINIQUE 21962 11984071983111608112915.0813MVENTE +7881CHAILLEY ISABELLE 21963101985091984091288210744.4413CSANS +3227POINT COLETTE 21963 31989031988031249910471.5813CANGL +1094FERRAT ANNE LORRAINE 21963 91983061982061326611017.8313MSANS +0209MONTALEAU PASCAL JEAN 11963101983061986111326611017.3413MTECHN +6991COLOMBIER MARCEL 119631119870519880210791 9502.8913MSANS +8764PALMAS MARTINE 21963 81994051993051267210590.2913MTECHN +2275FANGADE ELISABETH 21963 51984021983021288210744.8513MTECHN +0866SECRET MIREILLE 21963 71991111990111249910472.0313MSANS +0133TORREPORTO CHRISTIANE THERESE 21963 6199302199202 7803 7680.4513.SANS +1651VALERE VINCENT 11963101987081991071288210745.9413MANGL +0332FRER CATHERINE 21964 7199407199307 7803 7681.2913MINFOR +1313ARPHY FREDERIC PASCAL 119641019870319860310791 9502.9813MSANS +7694BANNIERE GERARD 11964101987041992111288210745.9913MSANS +2808BOULIE ISABELLE 21964 41985051984051450311832.6913MSANS +9520ERMONT VERONIQUE 21964101993111992011202810241.1313MSANS +7726BUTIN JEAN YVES 11964 6198810198707 8656 8145.0313.COMPT +9487MARECHAUX ERIC JACQUES 11964 21988051987051450311830.9813CSANS +7195ARENE CHRISTINE 21964 71994101993101249910471.7613MINFOR +3536HAIE NATHALIE LUCE 21965 71985121984121249910472.4713MSANS +0845CHARLEMENTINE DOMINIQUE 21965 519940419920111389 9852.7413CTECHN +8486CANADEL SUZANNE 21965 41985121984121288210744.4113MALLEM +5385ROZOY TRISTAN 11965 31987071992031450311830.8313MANGL +7086BEAUME ALAIN 119651019860619850610791 9502.5313MSANS +2621LOTISSEMENT STANISLAW 11965 51986051990111616712995.9313MSANS +9449POSTE MARIE CLAUDE 21965111989031988031202810241.5713MSANS +1109PERRAULT CHRISTIAN 11966 81986041994041450311831.3713MSANS +4280BEGUDE MARTINE 21966 91986041985041288210744.1913MSANS +1973ESPRAT JEAN BAPTISTE 11966 919900119900510024 8997.9113MTECHN +6164UNIVERSITE VERONIQUE 21966 41985121984121288210744.1313MSANS +9407THIERRY GUENAELL 21966 91990091989091638413150.7913CALLEM +6809PERCEY PHILIPPE 11967 519930819920811389 9850.5313MTECHN +9633GILANDIERE ANDRE 11968 61993081994082256617146.7213CSANS +7128PERSPECTIVE PHILIPPE 11968101991101990101467711987.3613MSANS +0709AMYOT ISABELLE 2196810199603199503 7803 7680.2113MSANS +9931CIVADE PIERRE 11969 51991111990111467711986.6213MSANS +1496FERME STEPHANE 11969 519890919880910407 9271.7913CTECHN +4802JAURES MARIE CLAUDE 21969 21994011992011202810240.8213MALLEM +5721VIEUX ERIC 11969 41989061991021249910473.5413MSANS +4763PINTA ALAIN GEORGES 11969 919921019930210407 9270.6513MSANS +9618PASTOUR CHRISTINE 21969 11994081993081206910240.4613CSANS +3207PAQUERETTES MARIE CHRISTINE 21969 619940619930410668 9426.0813CSANS +0667FOURCHES SYLVIE 21969 719920719930411389 9850.6213MSANS +8437ORANGERI DANIEL 11969 31989041992121249910473.1513CSANS +4233LEBLANC CHRISTIAN 11970 419910119900110024 8999.3113MANGL +2043RAVEL FRANCOISE 2197010199301199201 9597 8728.8913MSANS +4748REDONDO CHRISTINE 21970111994081993081206910241.3013CINFOR +6379ROUGE CATHERINE 21970 11994011992011202810241.7213MALLEM +4507ALBAN CATHERINE 21970 91993011991011202810240.9813MSANS +8424FRANCE JEAN PIERRE 11970111992081991081202810240.9913CANGL +3409FLEURUS BRIGITTE 21970 9199009198909 8656 8146.6813.ALLEM +8040ROY PATRICK 11970 41991111990111839014313.7013MSANS +4985CUTTE MICHELE 21970 419940519920111389 9852.6013CANGL +0589MARTIN FABRICE 11971 11990091992021202810241.9013CANGL +2531ROI MICHEL 11971 41994011992011202810240.4413LSANS +0686RENAUDIN JEAN FRANCOIS 11971 51990091993121202810241.1213CSANS +1223ROUDIL CECILE MARIE 219711019921019911011389 9852.5913MVENTE +0603THORETON GUY 11971 7199605199505 7803 7681.0813MSANS +4480WAGNER YVES 11972 31991091994011249910473.6313CSANS +7873VALERY NORBERT 11972 319921019911011389 9852.0613MSANS +0068LAC CATHERINE 21972 419940519920111389 9852.2713MSANS +6496BEL CATHERINE EMILIENNE 219721119920219910211389 9851.3413MESP +4096XAVIER THIERRY 11973 31995121995101288210745.8513CSANS +0302FRANCH WILLIAM 11973 8199502199402 9894 8922.8613CSANS +1195GUILBERT ELISABETH 21973 819930319920311389 9851.4113CSANS +8888LEGER BERNADETTE 21973 7199409199309 9126 8455.9813CSANS +9415FONTANEY MARIE PAULE 21973 4199404199304 9894 8922.4113MSANS +8921ROSA SUZANNE 219741019940819930810668 9426.3413CVENTE +1867BASSE JOCELYNE 21974 6199404199304 9894 8923.1713MSANS +1798RUSSE THIERRY 11974 4199401199301 9894 8923.3113CANGL +8684CHEM BERTRAND 11975 6199407199307 7803 7680.3913CSANS +3841UTRILLO JACQUES 1197611199506199406 7803 7681.1613CSANS +6399ABEILLES RENE 11934 7199207199107 9511 8687.5114MSANS +1983PETUNIAS MICHELLE 21935 1199208199501 7803 7680.2614.SANS +0006DOMONT YVES 1193511198810198509 8656 8145.3914.ALLEM +6326JATELIER CHRISTIAN 1193511199107198509 8656 8146.0914.ANGL +5224MAGNOLIAS MICHELE 21936 31962111991072273717260.2614MSANS +1839ANSELME REMY 11937 21963121994011557012567.7714MSANS +6250ASPREMONT JEAN LUC 11937 91968081990071433211715.6514MALLEM +2328AGE MARIE HELENE 21937 81966071995102017815518.0914MSANS +1178NAPOLEON HELENE 21938 61967071990071578112723.2714CANGL +9417SOUTRANO MICHELE 21938 11963021963051288210744.3714MVENTE +9022GATINES CHRISTIAN 11938 11973071992011403411520.0814MINFOR +6359LANCHY SOPHIE 21938 8198811198511 8656 8146.3414.ALLEM +4141JASMINS PIERRE 11938 81976071992041403411521.0714MANGL +7981NOUVELLES PHILIPPE 11939111968011993011557012566.8214MTECHN +1626VEUR LOIC 11939 11982011993011215710279.2314MANGL +4677ORMEAUX CHRISTIAN 11939 91963121994011557012567.6614MSANS +0263ASPHODELE STEPHANIE 2194010198807198707 8656 8146.5514.ANGL +8254CONNETABLE JOELLE 21940 8199509199409 8656 8147.1714MINFOR +9870RESISTANCE PHILIPPE 11940 61967071993061834514274.5714MSANS +4388ORBAY PATRICK 11941 41965051994011557012568.1314MINFOR +0023ROUVIGNARGUES CATHERINE 21941101963011994042666519900.9114MMARKT +9628BROOKE ROGER 11942 11962021991072273717261.4714MMARKT +4240NUMANCE ANNIE 21942 71963031992012273717261.0014MANGL +3342ROMPU FRANCIS 11942 61962031994113200223583.9014MSANS +4773HA DIDIER 11942101961091994033200223583.1214MANGL +2795ECHO BRIGITTE 21944 419941019930411389 9852.4114MSANS +4188VISONNIERE MARIE CHANTAL 21945121972101971101249910473.7414MINFOR +0739VALLES JEAN FRANCOIS 11945 71966081995042666519900.3614MSANS +4899COURBANIERE DIDIER PIERRE 11945 31972061991011663613343.1614MESP +7972FORET MARC 11947 41971071991011433211714.9114MESP +1272CIGALES JEAN DOMINIQUE 11947101976101991011369311286.2114MTECHN +6191HUGO MARLENE 21948 91973101991071578112722.6114MSANS +1802CAVALIER PHILIPPE 11949111972021992092256617145.2914MALLEM +3695JEANNE CHRISTOPHE 11949121977081992101471512024.1514MESP +9900ANTOUNE FRANCE DOMINIQUE 21949 31972121992012017815516.8314MSANS +0012MAUREILLAS RAPHAELE 21951 51971071988052334017609.1514DSANS +9378VERDIERS CLAUDE 11951 41980031992061369311287.0114MSANS +8265POUSSIEU DOMINIQUE 21951 81980061988052090215979.7614CSANS +3423MORIGNY LUC 11952111979061992011608112916.7214MSANS +7925FOURNIER JEAN PIERRE 11952 21976021995061608112916.2814MSANS +2966ANTIBES JOEL 11952 41975101994041894014661.7814MANGL +7905BOISSONADE FRANCOIS 11952 51990031989031288210744.1914MINFOR +2700LERINS MURIEL 21953 91974011973011288210745.5214MTECHN +6213TOISON JACQUELINE 21954 21974081982041527112373.3514MSANS +1204TRIANON ANNICK 21954 3198801198511 8656 8146.6514.SANS +7183CABRIER MARIE FRANCE 21954111974071979112470018541.1114MSANS +0005BOILEAU FRANCOIS 11954 61974051990052175716601.9514MSANS +7845LARGADES NOELLE FRANCOISE 21955101977021992011471512024.8714MSANS +3059BLEUETS MAURICE 11956 81980071995011471512025.7014MSANS +3868IORANA PATRICIA 21957 2199201199101 7803 7680.0314.SANS +4327MARTILLE CATHERINE 21957101984091983091288210744.6414CSANS +3448FAREL MICHELINE 2195712198805198603 8656 8145.9314.SANS +6045AIGUELONGUE MICHEL 11958 71983081992061527112374.8114MANGL +3104GAIRAUT JACQUES 11959121987021989051288210743.9914MSANS +6864SCHMITT DENISE 21959 3199201199101 7803 7680.3414.ALLEM +3805OUEN GERARD 11959 91980061994011471512024.5714MANGL +7188SOL FRANCOIS 11960101981051991011868714507.4514MTECHN +7952CABRO MARIE CLAUDE 21960 4199504199304 9126 8456.3314MTECHN +3834JEANPIERRE FRANCK 11960 21981091987011684813421.4614MSANS +2909BLERE PHILIPPE 11960 31983041993121326611017.6114MSANS +8259VALOIS NATHALIE THERESE 21961 2198810198603 8656 8147.0114.SANS +9506FORESTIERE ANTOINE REMI 11961 719821119811111131 9658.0714MSANS +5269BIZET JEROME 11961111985041993021433211714.1514MESP +5031CORBIERES PASCAL 11961 21982121993041326611016.6214MSANS +0735MONTAIGUET ANNE MARIE 21962 819960619940111389 9850.5614MANGL +0633BULLY LOUISE 21962 91991121994061202810241.5214MANGL +7250SERMET XAVIER 11962 41985061986011527112373.0414MANGL +9656SARRAMEA ANDRE 11962101983081994091868714507.1614MALLEM +8263MAISONNEUVE MURIEL SOPHIE 2196212199404199301 9597 8727.8714MSANS +8851BERGES MARTINE 21964 2199406199306 8359 7952.5514MSANS +7351NUNGESSER PHILIPPE 11964 71988111987112188616680.9314MSANS +3681LOOZE BRITTA 21964 21993121992011202810240.9114MESP +1581VALLAGON MURIEL 21964 31986041987091527112374.1214MANGL +0821BRANLY YVES MARIE 11965 51986011993041288210743.8714CVENTE +3591MANNA CATHERINE MARGUERITE21965 7199407199307 8359 7952.4314MSANS +7792INSTIT PHILIPPE 11965 619870719870410407 9271.4114MSANS +5791RADEGONDE MARIE LOUISE 21966101986041985041168610048.4714MSANS +0301ESTERELLA ANTOINE PAUL 11967121989021988021450311832.0014CSANS +1872TOUL FRANCIS 11967 919900419900910407 9271.3814MTECHN +5651MURIERS CHRISTOPHE 11967 31989101995071249910472.7414CANGL +0527REMPART DENIS 11967111992071991071330611016.9614MALLEM +8590TOURNEFORT CHRISTIAN 11968 6199410199508 9126 8456.6614MANGL +5968PRESBYTERE DOMINIQUE 21968 21992011991011202810241.8414MSANS +8374AUMALE JACQUES 11968 819890419880410407 9270.6614MSANS +7416BREGUET DANIEL 11968 21987061993051381911365.2614MSANS +0198MARINES MARTINE 219691119920419910411389 9852.0214MANGL +8772GORGE MARC VITTORIO 11969121989091994011249910472.7814MSANS +9157LEON JEAN CLAUDE 11969 81989061995101249910472.6114MSANS +3588LUCIEN DANIEL 1196912199403199303 9597 8727.9914MSANS +5266COUTANT DOMINIQUE 21969 2199502199402 7803 7680.0914MINFOR +6967CONTI GILLES 11969 9199612199512 7803 7680.6614CSANS +4277COLLONGES MARTINE 21969 2199112199012 8656 8146.3814.ALLEM +6780ERIK SABINE 21970 819910619910411389 9850.6214MSANS +9400LONGCHAMPS MARIE CLAUDE 21970 71990041989041202810241.6714MSANS +0861ROUMEGONS GERARD 11973 81996101995101288210744.8514CANGL +1149MOULIN MYRIAM ELISABETH 21974 9199501199401 7803 7681.2514CINFOR +8134AJOUPA PHILIPPE 11974 3199508199408 7803 7680.5314CANGL +5009LEVIS FRANCOISE 21974 6199506199406 7803 7679.6914CCOMPT +5993FROBERT ARN 11975 7199503199403 8359 7951.9414CANGL +7536ORNE BEATRICE 21976 3199602199511 7803 7680.3214CSANS +0584LISON PATRICK 1197611199610199510 7803 7679.2814CSANS +9645TESTE ALAIN YVES 11935 31964091994011557012567.6215MANGL +4415CROIX GUY 11936 61966081981072022115555.5015MANGL +2212BAC JEAN PHILIPPE ANDRE 11937 41972051992011433211715.3215MSANS +9432ULYSSE JEAN MARC 11938 91960121988062947921840.2015MINFOR +8124CHAMIGNY STEPHANE 11938 2199001198604 8656 8145.1215.SANS +7324MOLITOR ROMAIN 11938 41962111992032572519240.6415MTECHN +8862CONDAMINES NICOLE 21938 41960111976012470018540.4715MSANS +2089ALLEN DIDIER 11939 81972041990011403411520.5715MSANS +3194COUTURIER DENIS 11939 11963101994011557012568.2615MVENTE +0835VALMANTE DENIS 11939 21959051991113327724475.7015MINFOR +8646MESNAY ANNE GENEVIEVE 21939 51967011994091834514275.5215MANGL +3426GAMBETTA ISABELLE CECILE 21940 7198912198603 8656 8146.0515.COMPT +0422VAUGAILLERES CHRISTIAN 11940101963111988011663613343.0315MSANS +0838ORVANNE PATRICK 11940 31962061993082922321683.8515MSANS +4067OUTREMONT PATRICK 11940 31962031987012022115555.6215MSANS +0744GRANAGHIU DIDIER 11940 81972021995041834514276.1015MVENTE +9034TREILLE MARIE JOSE 21940 11962051984062470018540.8215CSANS +5214BART MICHEL 11940 21964071991072273717261.7615MALLEM +3460SERENA MARTINE 2194011198810198604 8656 8146.0515.ANGL +3601MONTJEAN DOMINIQUE 21941 6198805198610 8656 8146.2015.SANS +9277ELNE LAURENCE COLETTE 21941 31968071990011621213033.3215MSANS +0325PLATANES CHRISTINE 21942121966081995091834514275.8315DSANS +9878GAUTIER MARYVONNE 21942121972101989011621213033.2915VCOMPT +9699GERVAIS JACQUES 11942 11966101992011663613343.4715CSANS +6148GATINAIS FRANCIS 11943101969101992082470018541.2815MSANS +4347MONTFRAY CLAUDE 21943 71962121991072273717260.0115MANGL +4710VIRY GUY 11943 51970051991011433211714.3715MALLEM +0354BENIGUET MARIE PASCALE 21944 41965021993111471512024.3315MINFOR +6561LEBAS HELENE 21944 21964071994011932314934.2715SSANS +1882BARBES JEAN MARC 11945 9199309199209 8656 8145.8915.SANS +0226FERRIE CLAIRE 21945 4199207199107 8656 8146.7315.SANS +6166BARGUE FRANCOIS 11946 61972071991101433211715.4515MESP +9007CLAYE PHILIPPE GERARD 11946 21970041991011433211715.0915MALLEM +9314GRILLONS MARTINE MONIQUE 21947121969031981122470018542.1015MSANS +2474RODIN ERIC JACQUES 11947121972121991071621213034.1315MSANS +0379ARGENSON BERNARD 11947 61971121991082470018541.2915MSANS +1358SEILLE JEAN PAUL 11947 31971021993061834514274.8915MTECHN +0628GOURGAUD PHILIPPE 11948 11969051993082666519901.0015MTECHN +1939DISQUE ERIC 11948 41977031991011578112723.4215CTECHN +1605FRESNES ALAIN 11948 51975061991011684813422.8115MSANS +9214CHAMPS BRUNO 11948111973081991013417325098.6515MSANS +5666NOVEMBRE JEAN PHILIPPE 11949 41971101994013417325097.9315MSANS +0720MOINES GUY 11950121978011994031471512025.3415MSANS +8674IMPERIAL JEAN CHRISTIAS 11950 21970041989111932314935.4315MINFOR +8739HUGO MICHEL 11950 21974041992011578112721.8015MSANS +9090CYR CATHERINE 21950 7198908198808 8656 8145.3915.SANS +8528EMERAUDES BERTRAND 11951 61979061992011249910472.0615MSANS +0912ALBERES MARTHE 21951 41974051991072137316331.3315MTECHN +1664BENASY DOMINIQUE 2195210197206197106 7252 7486.2815MSANS +5853ROI CHANTAL 2195210199112199012 8656 8147.0615.SANS +6634DUMAS BRIGITTE 2195210199509199409 7590 7562.6315MESP +9376LOUVRE SABINE MARIE 21952 51975051995021433211713.5315MSANS +8735BYRON MARTINE 21952 51973071991071578112722.0715MALLEM +1663PLANESTEL CATHERINE 21953 11974101993042017815517.2015CANGL +5646ALEXANDRE MARIE CLAUDE 21953 11975071991091578112723.4215VSANS +6614GLYCINES PIERRE 11953 71978101994031471512025.7215MSANS +8773CLEMENCEAU ROLAND 11953 81974031991012334017609.3715CTECHN +2191HEBERT PIERRE 11953 21972081992072043315669.2915MSANS +7378THOMAS PATRICK 11954111982051994011433211715.6315MSANS +6161HASTIGNAN ANNICK 21954 31980071994041471512025.0115VVENTE +6895VALETTES ANORE 11955 31979061993121369311288.2415MALLEM +8499ATHIS JEAN PAUL 11955 11977081976081834514274.8015MSANS +8271SPORTS PAQUITA 2195612199112199012 8656 8147.0115.ANGL +3980RAPHAEL MARLENE 21957 61980041979041684813421.6715MINFOR +9964MUGEL PATRICK 119571119821219820311131 9658.4715MSANS +0593GRACE JEAN MARC 11957 41977121992021471512024.5615CSANS +2905EXEMPT PATRICIA 21957 3199201199101 7803 7680.5915.ANGL +5492PERRIERE PASCAL LUC 11957 11983121994041894014662.7215MSANS +7685SURMELIN JACQUES 11957 5198109198812 4864 2.1915MSANS +3608ROOSEVELT FLORENCE 21957121980111994071471512024.5315MTECHN +5451TULEU JEAN LOUIS 11957111977121994011621213033.1015CSANS +4681VERIGNON JACQUES 11957 51984051995071433211714.1615CSANS +1478RESIDENCE CLAUDE GUSTAVE 11958101982091995011433211715.7415MSANS +0355ROSAIS MICHELINE 21958 81978061992051471512024.1515MANGL +4981CHRISTOL BRUNO 11958 11978061995041249910473.5415MSANS +6921MATRA FERNAND 11958 11978051993011471512024.4215MESP +2956LAPEYRERE PHILIPPE 11958 11977071985102397418037.4715MANGL +8126CYPRES JACQUES 11958 41983081982081608112917.1515CALLEM +5587BERENGUIER JEAN PASCAL ROGER 11959 81981061993031894014662.0615MSANS +2962CAYES CAROLINE 21959 61981051995041433211713.9215MESP +5994GRASSE PHILIPPE 11959 819820419811211389 9851.6915MALLEM +0767SOUCHET MARTINE 21959 91983011982011249910471.9215MTECHN +1353AGEN JEAN MARC 11960 319810319800311131 9657.6515MANGL +9232GROULLES ANTOINE JEAN 11961 31993101992011249910472.5715MALLEM +3855BAUMES JEAN LUC 11961 41982111994031527112373.1015MANGL +9369HELBRONNER VERONIQUE 21961111994031993031202810241.5715MINFOR +4341OLIVIER CHANTAL 21961 31981101980101684813422.3515MSANS +5305DAME ANNIE 21961 51981071995071433211715.5915MSANS +6569GAULLE JEAN CLAUDE 11962 91989041992121249910472.3015MSANS +6715SEINE KARL 11962 719840219830211131 9657.1215MSANS +3136GOBELINS JEAN PIERRE 11962 21993091992011249910472.3015MSANS +5291LAMBERTIANAS MARIE CLAUDE 21962 7199506199406 9126 8457.5615DSANS +6342MISSECLE DIDIER 11963 41989111988111539912453.6015MSANS +3447VIAL GEORGES 11963 51985041984111527112374.3415MALLEM +5045GRAZAILLES LAURE 21963 8199108199008 8656 8146.9715.INFOR +7974CHAUSSEE PAUL 11963 61985071991121288210743.9215MSANS +2189PEYBERT DIDIER 11963 81983081988112090215980.4615MSANS +7262JOZE PATRICK JEAN 11963 91983111982111326611017.4115MSANS +8222ETANG LIONEL 11963 71985011993031693613497.9015MSANS +6881OUEST OLIVIER 119631219840419840210791 9502.0815MSANS +8121MADELEINE JEAN 11964101984071983121288210745.1815CESP +6828CONCY JEAN MICHEL 11964 91988041994091693613499.2215MALLEM +3939CHURCHILL BRIGITTE 21964101992021991021330611016.6015MSANS +5116PEREIRE DIDIER PAUL 11964 21986071992121288210745.9915MSANS +2174TEISSEIRE ELFRIEDE 21964 4199212199112 8656 8145.5615.ANGL +0585CRETS LAURENCE 21965 3199306199209 9597 8728.8415MSANS +7988DOMAINE PASCAL 11965 61984051993071527112372.8715MSANS +1646PERDRIX MARCELINE 21965 51985101984101288210745.7015MSANS +7090KERAVEL GILBERT 11965 11988041994091693613498.2215MSANS +3100BARILLERIE BRUNO 11965121988111987112188616679.7215MALLEM +8075ESCALE YOKO 21965 61991061990061381911365.3215MSANS +1009CHARRIERE SYLVAIN 11965101993021993121249910473.1115MSANS +8542MOLIERE PIERRE 11965 51987111995021450311830.6215MSANS +8729ROSTAND PIERRE 119661219860419850410791 9503.7015MANGL +8802DOUMER JEAN LOUIS 11966 619860319930110791 9502.8415MINFOR +8596ABEBERRY PATRICK 11966 619891119910910407 9270.2415MALLEM +6485CHALEUTRE GILBERT 119661219870719860710407 9271.9715MTECHN +9054FAURE FRANCIS 11966 519860719890710791 9503.7915MALLEM +6168CHENEAUX COLETTE 21966 61994021992011202810240.1915MSANS +9809PESSOT JEAN JACQUES 11966 11992011991011202810241.3015CALLEM +8041BIGUE THIERRY ALAIN 11966 619860419850410791 9503.8515CCOMPT +7730CALIANES STEPHANE JEAN 11967 3199404199304 9894 8921.6315CSANS +2161TOUCH MICHELE 21967 11989111988111949415052.4015MSANS +1999LISLE GILLES 11967111990021989021539912451.6115MMICRO +2038GRANDES ROGER 11968 2199312199212 9597 8728.0115CSANS +4888BELMONTET ANN 21968 619960419950410668 9426.5315MSANS +5809ROUSSIER DENIS 11968111990011989011467711987.1615CSANS +0146ROSESCERNY MIREILLE 21968 5199602199502 8656 8145.5715MANGL +3432GARCIA PHILIPPE 11968 51990121992041249910471.8915CSANS +3058SANGRIA CAROLINE 219691119910519900510024 8998.6815MANGL +7679BLEU CHRISTIANE 2196911199207199107 8656 8146.3815.SANS +0602VAUGINES GILBERT CHRISTIAN 11969 91991061994011249910471.7615CCOMPT +5226BOULEE PHILIPPE 11969 819900419890410407 9271.7215CSANS +5904ORANGERIE MARIE CHRISTINE 21969 1199001198712 8656 8146.0115.ALLEM +8131NICE CHANTAL 21969 41989031990011450311831.6615CTECHN +8570SOULAGE MICHEL 11969 41989091994031330611016.4415MVENTE +5857ALLEE JACQUES 11969 7199304199206 9597 8728.9515MANGL +6920LOTI YVES 11969 919911219901210024 8999.3115CVENTE +3599PLANA JEAN PIERRE 11970 61991051990051467711987.6115MALLEM +7579BERGUEROLLES MARIE CLAIRE 219701219910919900911389 9852.4115MSANS +0494DESBORDES BERNARD 1197012199101199001 8656 8145.1215.SANS +9496MONTBAURON ERIC 11970 61991051990051467711986.2215MSANS +8603DESCENTE FRANCOISE 21971 5199607199507 7803 7680.9915MSANS +2449TAHITIAA MIE 21971 619940919930810668 9425.5515MSANS +7786LOUP ISABELLE 21971 61991121993041202810240.8915MANGL +6100MARNE JOEL 119711219940719940111389 9851.4615MSANS +8569ASPIRAN ANDRE 11971 61991121994011249910472.8415MSANS +0626ODET PAULE 21971 2199611199511 7803 7681.0415MSANS +7006ARGENCE PHILIPPE 1197212199308199208 9597 8728.2215CANGL +2516MAILHEAUX LAURENT 11972 41991121991061202810241.5215CSANS +4928COLLEDEBOEUF ANNE MARIE THERESE 21973 51994071993071206910240.6415MANGL +1718HACHETTE ERIC 11974 7199606199506 7803 7679.4615CALLEM +5240MUSES JEAN BERNARD 11974 9199507199407 9894 8922.4415CANGL +3654MAIRIE MARIE 2197412199507199407 7803 7680.6315CSANS +3017BAUCHAT MICHELE 21975 8199505199405 8359 7952.4615MSANS +1395BROSSOLETTE MARIANNE 21975 4199609199509 7803 7679.7615CESP +9154REYNARDE FREDERIC JEAN 11975 8199406199306 7803 7680.3415CANGL +3041BOYER ERIC 11975 3199406199306 7803 7679.3315CSANS +8817FILOURIE FRANCOISE RENEE 21976 8199506199406 7803 7679.3615CANGL +3408BRIE BRUNO 1197611199508199408 7803 7679.4515CSANS +6446WYLLIE PATRICK 11976 1199507199407 7803 7679.4915CSANS +7476SOMME BEATRICE 21976 4199606199506 7803 7680.8615CSANS +8951BARNIER MARTINE 2197612199506199406 7803 7679.4915CTECHN +5707FOCH DENIS 11977 7199607199507 7803 7679.3615CCOMPT +9331PEYPIN MICHEL 11977 3199506199406 7803 7681.2015CALLEM +2044RENAN BERNARD 11977 7199607199507 7803 7679.9915CSANS +0991GUTENBERG BERNADETTE MARCELLE 21930 6199207199107 9894 8922.1616MANGL +4650NORD PASCALE 21930 6199001199506 8827 8262.8016.SANS +7670BOURG ERIC 11935 11967071994011433211713.8816MCOMPT +1067ITALIE SVETLANA 11935 81973071991011433211713.6116MSANS +7446BELMONT MARIE JEANNE 21936 4199010198910 8656 8145.0316.ANGL +4567VICTORET DOMINIQUE 11936 2198812198511 8656 8146.6116.ALLEM +1382ARIES DOMINIQUE 11936 11970081991041433211713.8816MANGL +7727TERRASSES BERNARD JACQUES 11936 91957051994123417325096.9816MALLEM +2304MERCUES JACQUES ANDRE 11936101955061992113327724476.7316MSANS +1717FEUILLETS EDITH 21936 51971091992021932314935.3116MSANS +5274VALLEES PASCALE 21937 8198901198511 8656 8145.6216.INFOR +1751BESSE WILLIAM 11937101959021994065760041273.7516MSANS +7544TRAIL PATRICK 11938 41971081991101433211714.7916MINFOR +0247VIARD CHRISTIAN 11938 11962121984073200223583.9016MTECHN +9383CHALONNIERE MARIA 21938 4199009198909 8656 8147.1916.SANS +1762EMERAUDE BRIGITTE 21938 11975051995011369311288.0616VESP +8379MAGNIOUX NADINE CHRISTINE 21938 81966071990071578112723.4716CTECHN +4635CYTHERE CORINNE CHARLINE 21939 4199201199101 9085 8418.3916MANGL +2414PILATTE MARIE JEANNE 21939 11962051983032470018540.4716CSANS +9003MOULIN DIDIER PAUL 11939 51980021995121471512025.3716MINFOR +6102MARINVILLE ERIC ANDRE 11939 21971031991101433211714.6416VANGL +9945ELANCOURT AGNES 219401119841019810111131 9658.0916CVENTE +5615THORELLE FRANCOIS BERNARD 11940 219840119840311131 9658.6416MALLEM +9231HERBILLON MADELEINE 21941 11968071990071578112722.1216MSANS +9547REMY CATHERINE 21941 31965121990012273717261.0916MTECHN +8538DAMPMART THIERRY 11941 41964071994013200223582.7616MSANS +4432ECOLE CLAUDE 11941121966071995041557012566.5416MALLEM +7122SORRIERES JACKY 11941111975031992011403411520.6216MSANS +5855CESARI PHILIPPE 11941 41972081992011433211715.6916MSANS +4569BELTCAGUY JEAN PIERRE 11941 31974041991011369311288.0016MSANS +0119BAUMETTES VONICK 21942 7199309199209 8656 8146.7316.SANS +5799ICARD JACQUELINE 21942 31968071994031834514275.4316VTECHN +3230NIBELLE PHILIPPE 11942101963011990042273717261.8816MTECHN +1160PLAY JEAN DANIEL 11942 81975091993041369311287.9716MSANS +8701ORRIANES DIDIER 11942 81964101989122470018540.0616MTECHN +9211ANJOU JEAN CLAUDE 11943 81969101991011433211715.4716MSANS +2069CHURCHILL ANDREA 11943 61970061995042201216756.8916MINFOR +4457ARBAUD JEAN CLAUDE 11944 61971011992102137316332.3116MSANS +9480SABLONNIERES CAROLINE 21944 11962121991072273717261.7616MALLEM +1573HOCHET HELENE 2194410199208199108 8656 8145.3416.ESP +8504ANDRE FRANCOISE 2194510199301199201 8656 8145.4216.SANS +2608THIRD ALFRED 11945 91971041990012137316331.6616CSANS +0698CEDRES BRUNEL 11945 91968061990071433211714.3916MSANS +8224CLOSERIE MARTINE 21945 61971061991101932314935.2616VTECHN +6798MONTESPAN JEAN NOEL 11946 21983121993011215710278.5716MTECHN +4449TRAW ALAIN 11946 21976091993041369311287.8216MSANS +1458BOIZEAU PHILIPPE 11947 11973071993041518612334.9216MANGL +8853OUF HENRIETTE 21948 91970011994062201216756.8016MALLEM +0743GEORGE BERNARD ALAIN 11948111973021991011433211714.9316DALLEM +2218GEMEAUX GUILLAUME 11949 51970101992072739020404.5916MSANS +3154MONTAGNE SERGE 11949 31973061992011403411522.1316MSANS +2871VILLERMONT EVELYNE 21949111970061993102175716601.0116MINFOR +8174SARDAN PATRICK 11950 61978051990091966515206.0716MANGL +5180LONE ALAIN 11950 31978021994011369311287.4616MANGL +7155COSSON DOMINIQUE 11950 41970101991012990722150.5216MANGL +7616QUAI FRANCOISE 21951 51973101991071578112723.5116MSANS +1943VAUGIRARD DANIELLE 21951 7198810198709 8656 8145.3916.SANS +8270LOUPS CHRISTIAN 11951111979031993011471512024.3816MALLEM +2654PRESSENS ANNE MARIE 21951 31973011976011288210745.5416MINFOR +8175COUDOURON LUC 11952 21978061995011249910472.6616MSANS +9368DOLMENS CLAUDE 11953 81977081991071578112723.3816MSANS +3828ESTIENNE PATRICK XUAN VINH 11953 71984071992041326611016.1116MINFOR +8961APPART JEAN LUC 11953101973021992102017815516.1216MSANS +9113PERIGUEUX JOELLE 21953 21973101991071578112723.0616MINFOR +7735FLEZ PIERRE 11953 11978071994011403411521.0216MINFOR +4018FONTMERLE MICHELINE 21953 8199311199211 8656 8146.9516.SANS +5157GREZ FRANCIS 11953111974051992082350617725.9216MTECHN +5311SUFFREN MARIA 21953 41973021990101578112722.9116MANGL +7764BRON CLAUDE 11953 91979081994011249910472.9216MINFOR +0120POSTAL CHRISTIAN 11954 31976071994011369311288.1516MSANS +5265HUGO JEAN 11954 51975021993092256617146.9116MSANS +5590SOPHIE SUZEL 219541119960119940110668 9425.3116VSANS +5401LARREY MONIQUE 21954 31975041995101881314585.7316MSANS +6562LANTERNE CLAUDE 11955121980061995041471512024.3516MANGL +1519GOURDON SYLVAIN 11955 51980051995011249910472.9716MVENTE +3963RUISSATEL MICHEL 11955 51979051994011249910473.2216MSANS +3870COMMANDERIE BERNARD 119561219850419870910791 9503.3616MANGL +6506SUPERIEUR JEAN CLAUDE 11956 31979011994011249910472.3016MINFOR +0863FIGUIERES JEAN PIERRE 119561219890919881210407 9270.6216MSANS +1566GROS ANDRE 11956 419950119950110363 9232.9816MSANS +2124CHASSEURS AUDE 21957 219920619930110024 8997.9516MINFOR +5594VAAGGASSE CLAUDE 11958 71978051992011471512024.3916MALLEM +7033TITAN ERIC 11958 41978011992021471512025.2516MSANS +5186CEYRESTE JEAN 11958 91980091993041471512024.7116MSANS +7174SEPTEMBRE PIERRE 11958121978081995071369311286.1516MSANS +4207REGARD GINA 21958 1199107199007 8656 8146.5216.SANS +0723GARDONNE SIMONE 21958 21989081991101249910473.2416MALLEM +3190MONTAUROUX FRANCINE 21959 61989011991071249910473.4116MINFOR +7379SUD PHILIPPE 11959 81982051992011527112374.2216MALLEM +0598FERBER GUILLAUME 11959101981051995082256617146.9116MINFOR +6321CEZANNE ALAIN 11960 41984041993041326611016.0616MSANS +6273FONVERT MARC 11961 619901019891010407 9271.5916MSANS +6867GENEVE ANNE MARIE 21961 31983011982011608112916.2516MSANS +7828PUISEAUX BERNARD 11961 5199403199303 9597 8728.1416MSANS +7252CHEM MARC 11962 41986091992041949415052.0616MSANS +0052TEMPLIERS CATHERINE 21962 61982021989041608112916.9716MSANS +4660HAROUSTA PHILIPPE 119621119900119890110024 8998.9516MVENTE +3619MURAT PIERRE 1196212199406199306 9126 8455.9716MINFOR +1366REINE GEORGES 11962 5199606199506 9126 8456.6416LSANS +6020YVART ELISABETH 21962121994051992011202810241.1616MANGL +9740SEJOUR DANIEL 11962 81982121992041326611017.0516MSANS +3790BEAURONNE PAUL 11963 419840619830610791 9502.6816DSANS +0831VICTOR MICHELE 21963 11985121984121288210744.4116MSANS +5171NEIGE DANY 21963 21985051984051527112372.9916CSANS +4834CROIX CLAUDINE 2196310199101198807 8656 8145.0616.SANS +9575HILL DOMINIQUE 21963 319951219941211389 9852.5416MSANS +1494FECAMP DANIEL 11963 31991041990041381911366.6116MSANS +2944MONCET THIERRY 11963 91991081992051249910471.9416MCOMPT +8018DRAGON XAVIER 119631019830519820510791 9503.5216CCOMPT +7258CASTELLAS LAURENT MARC 11964 31984091992121288210745.9316MSANS +3956CORDIERS PHILIP 11964 219861019851010791 9503.0416MSANS +1434TRESPOEY HENRI NICOLA 11964101987041991091450311831.5216MTECHN +7725MASSANE LAURENT ALEXANDRE 11964 819850919840910791 9503.9916MALLEM +5509FLAMANTS OLIVIER 11964 219890519880510407 9271.8216CSANS +9732VENT THIERRY 11964 91987071988121288210744.9116MALLEM +8053CAUSSINIERO ANNY 21965 8199610199510 7803 7680.3216MANGL +8933CHOPIN VERONIQUE 21965101986061994091288210744.0816MANGL +4294GRAVIER PHILIPPE ARTHUR 11965 61994041992011202810240.0416MTECHN +7996LOUPIATS CATHERINE 21965 3199312199212 9597 8728.5816CSANS +5751DIMANCHES JEAN FRANCOIS ROLAND1196511199404199201 9597 8727.9916CSANS +3314COPERNIC NATHALIE 11965 91993111992011202810239.8316MALLEM +8095MALIKA ESMERALDA 21966111994051992011202810241.6116MINFOR +2514CANGINA MARIE CLAUDE 21966 519951219941210668 9426.3416MANGL +8137BARBE SOPHIE 21966 61985061984061202810241.6116MSANS +2086FELIBIEN GILBERT PIERRE 11966 619860919850910407 9270.8916MINFOR +5743FOUESNAN PHILIPPE 11966101987021991071288210745.4316MANGL +7755ALGLAIS BERNARD 11966 81989031988031249910473.3616MVENTE +4183NEUVICQ MARIE CLAUDE 219661119950119930411389 9851.0116MSANS +5854BINEAU BRUNO DANIEL 11967 51991081990082107316097.0316MSANS +1015HUSSON MICHEL 11967 31990041989041467711985.8116MINFOR +8894VEGA YANNICK 11967 1199311199211 9597 8729.4016CSANS +2165POMONE EVELYNE 21967111989031993071381911366.4716CSANS +3736LYS DIDIER 11968 919950119950110363 9232.6616CSANS +9047PUITS VINCENT 11968 21990081989081539912453.7216CSANS +6745COMMANDANT DOMINIQUE 21968 6199403199303 8656 8146.3216MANGL +2664JAMES CHANTAL 21968 719940419920111389 9851.5216CSANS +2387LECLERC BERNARD 11968 819950119950110363 9233.9016MSANS +8096PAROISSE DOMINIQUE 21969 61991091991021330611016.5116MTECHN +8708BOISSY BERNADETTE 21969 7199006198708 8656 8145.2116.SANS +7358CUQUERON MARTINE 21969121994031992011202810240.4616CSANS +5192BESSOU ROSINE 21969101991111990111839014314.0816MSANS +1422LAVAUX DOMINIQUE 21969 11992061991061202810240.9816CSANS +4798IDOLE MARIE CHRISTINE 21969 219930419920411389 9852.1516MSANS +7101NOGENTAIS CHRISTINE 21969 91989111988111202810240.5916MSANS +3573MIRBEL ANTONIO 119691019900519890510024 8999.4916CSANS +8187NORD ROBERT 11969101991101990101467711987.9716MVENTE +2888CASTELS YVONNE 21970 419960619940110668 9426.8916MSANS +5902GARRIGUE MICHELE 21970 21994021992011202810241.7616MSANS +7139BRUANT ISABELLE 21970 919940619920111389 9852.0916MSANS +8561FREGATE DOMINIQUE 11970 81993041995091267210590.1516LSANS +8391ESCOURADIERES CHRISTOPHE 11970111991111990111467711986.0816CSANS +7113FLAVIEN MICHEL 11970 91992121991121467711987.9416MSANS +1139CHAMPIGNY LIONEL 11970 11995031993041202810241.7416MANGL +3774FAHNESTOCK MAX 11970 11992101991101467711987.9016MSANS +3115MAGATIS PIERRE 11971 119960219950211389 9851.0316CSANS +7606ITALIE JACQUES 11971 4199407199307 7803 7679.4516CVENTE +2804JOYEUX FRANCIS 11971 21990061992121202810241.0416CSANS +5659HOULE PATRICK 11971 21993121992121420611637.3316MESP +9687LANCIERS DANIEL PHILIPPE 11971 8199311199211 9597 8727.9016CANGL +5871LACOURTADE PHILIPPE 11972 11991121994011249910472.6116CVENTE +4676LUPINO ATSUKO 21972 6199501199401 8656 8146.1416MTECHN +2981VIREBELLE FRANCOISE 21972 219940819930810668 9426.5716CSANS +1979LOMBARDS JEAN DIDIE 11973 6199309199209 9597 8729.0716CSANS +7372BOIS MONIQUE 21973 1199407199307 7803 7681.1116CSANS +3844PERIGORD NICOLE 21973 319930919920911389 9850.5616CSANS +0819THOBIE DANIELLE 21974 1199409199309 8359 7952.6116CALLEM +8257SEVIN CLAUDINE 21974 4199409199309 8359 7951.8816CSANS +5832DELAGRANGE MICHELE 21974 3199309199209 9597 8728.8216MSANS +6357MORTARIEU MARIE JEANNE 21974 8199607199507 9894 8921.8516CSANS +7800TOURNELLES FLORENCE JACQUELINE 21974 519950119940110668 9426.0016MSANS +1978CENIS ALAIN 11974 71994091994011202810240.8616CSANS +4208BEAU OLIVIER 11975 8199510199502 8359 7951.6616CTECHN +2472TOWERS CORINNE 2197511199410199310 8359 7953.1116CTECHN +8054QUINTA PASCAL 11975 4199606199506 7803 7680.5016CSANS +5910JARRY CLAIRE 21976 1199608199508 7803 7680.6616CVENTE +9513GENISSIEUX HERVE 1197612199607199507 7803 7680.0016CSANS +6334MUSSET MARIE PIERRE 21977 3199607199507 7803 7681.4716CSANS +3177VILLEFRANCHE NICOLE 21977 7199607199507 7803 7680.4416CESP +3707PREVOST CLAUDIA 11934 81963071994011663613343.7817MANGL +7266OUCHE JEAN LOUIS 119351019930919910110407 9272.2217CSANS +5677VIRGINIE JEAN PHILIPPE 11938 51963111989071663613342.9817MESP +0564PEYREBELLE JOELLE 21939 11967011989091932314934.5317MSANS +6752SILLERY PIERRE 11941 41962061985072273717260.5917MSANS +7389BILLOUX NATHALIE 21941 3199012198912 8656 8145.3317.SANS +0440MALASSIS EVELYNE 21942 11993101992011202810240.7217DSANS +6527CURSON JEAN LOUIS 11946 71974121991011369311287.1017MANGL +4166EVIAN FRANCOIS 11946 31969101986012470018540.6117MSANS +6635ROSAY FABRICE EUGENE 11946 71970031989122334017609.4317MANGL +3999MUSARDIERE CLAIRE 21946 81968111983042470018540.9317VALLEM +9845YVETTE MARTINE 21947 71972101990071621213032.1717MANGL +1439FIEF EVELYNE 21947 91974071991071578112723.1817MSANS +2404ROME BRUNO 11947 91988031995011433211715.0917CSANS +8776ROME THIERRY 11948 61974011995031911114779.7717MSANS +5946TERRA MARIE CHRISTINE 21950 91970011991071578112723.6817MSANS +5232DEBUSSY CATHERINE 21951 81973051991021684813421.7217MTECHN +0869CARAMEL ELIANE 2195211199207199107 8656 8146.0917.SANS +1911PLASSAN THIERRY 11954 41980031992031608112916.5917MTECHN +1670LORETOHOHE MARIE EDITH 21954 11974071993101911114780.0617MANGL +9187BINGER DOMINIQUE 21955121986091991041249910471.9217DESP +2614COLLONGUE MARCEL 119561019810319820611389 9852.2917MANGL +9658BEAUREPAIRE MICHELE 21957 81977071992011471512025.4717MSANS +1305HOPITAL DOMINIQUE 21957121979071980041684813421.6717CSANS +2762PELUT PIERRE YVES 11958 119881219871210407 9271.4117MALLEM +4217ALEXANDRA JEAN MICHEL 11958 71983031993081326611017.7417CTECHN +8469CRETES PAULETTE 21959 619910719900710024 8999.3117MANGL +1495RIBAUTE PIERRE LAURENT 11959 119801019820611389 9850.8817MINFOR +1650BRIAND SYLVIE 21959 91980041992121608112915.9217MSANS +8360JOUY CLAUDIE MARIE 21959 319940419920111389 9852.7417MSANS +5653ROLL ROBERT 11959111988061991091450311830.5617MINFOR +4042TANE PHILIPPE 119591019870719890410791 9503.7017MANGL +0940YVETTE MICHEL 11959 31978071991032022115555.5017CTECHN +9875DANREMONT THIERRY 11961 41982091995041433211714.5117MTECHN +9667CASITA JEAN LUC 11961 81982081995121638413150.9717MSANS +1371ROME MAURICE 11962 21984051995081710713577.9317MSANS +6755AUBAIS BRIGITTE 21962121983011993051527112374.0017MTECHN +2907BRETEUIL FREDERIC VALERY 11962 41993021993081202810241.7217MSANS +4530MICHAUDES CHRISTINE 21963 11982071981071326611017.7417CSANS +9935TAZARKA BERNARD 11963 91992111991111330611016.2617MSANS +1813PLOUGUIE DANIEL 11964 21985081989051288210745.8117MTECHN +2666DAUX JACQUES ANTOINE 119641219840119830110791 9503.3917CANGL +4498LOUVEAUCOURT MICHEL 11965 81985061988061288210744.9117MSANS +6274BRIE PIERRE 11965 21984071983071288210745.4317MANGL +8475PATHE LOUIS 11966 91987111993091839014314.3417MSANS +2923LACLOTTE NADINE 2196610199501199304 9597 8728.7217CTECHN +5049CROZES CAROLE 21966 71987021992011450311832.6817CMANAG +9666RABINES MICHEL 11966 81986071995121450311832.3617MTECHN +1503LESTRADE GILLES 11967 119870119860110407 9272.1917MINFOR +2577JONCQUIERES MARCUS 11967 61987041990091249910471.6517MANGL +6372VILLARS LYDIE 21967 3199411199311 7803 7680.5917MANGL +8399HAMEAUX BERNARD 11968 61990071991081249910473.2417MSANS +0624BLOY MICHELINE 219681219940619930610668 9427.0217MANGL +0069ARTHUR CLAUDE 11968 71989021993041249910472.5717MTECHN +9429MATIN FRANCOIS 11969 919890419890410407 9271.0217MANGL +6364LEONIE SERGE 11969 919900319890310024 8998.4117MSANS +3990SALANGANE CATHERINE 21970 619950919940110668 9426.0017CALLEM +9447AYGULF CHANTAL 21970 419950219930411389 9851.1617MSANS +5807CIMES ODILE 21970 1199404199304 9126 8457.6317MINFOR +6551FOUCHER CHRISTIAN 11970 81990081989081202810240.2617MSANS +9323SAUVAGERIE MARCEL 11970 7199512199412 9126 8457.5917MSANS +0265PEYRIERE YVES 11970 91990111989111381911366.7217CTECHN +8683BRUSE VERONIQUE MARIE PAUL21971 119960119950111389 9851.9717CCOMPT +4051CHANTILLY PATRICK 11971 8199602199502 7803 7681.2017CINFOR +5145ETHORRI BERNARD 11971 9199309199209 9597 8729.2517MSANS +2756CADDESI THIERRY SERGE 11971 919910719900710024 8998.0117MSANS +5810HAUT CAROLE 2197212199610199510 8656 8146.9517MESP +1266GAUTIER VIRGINIE SOPHIE 21972 1199603199503 9894 8923.0217MSANS +8948CLOUD RICHARD 11972 81991071992041202810239.8317CSANS +4395DELIBES ERIC 11972 619940219930211389 9852.6917MESP +9450DAMMARTIN YVES 11972 6199404199304 9597 8729.4517MSANS +4403MORTIERS BERNARD 11972 219910919900910024 8999.0917MANGL +1227ROSSAT MICHEL RENE 1197212199407199201 9597 8728.3517CINFOR +8746VERGER JACQUES 11972 519940219930211389 9851.0117MCOMPT +9344ECHEZ CLAUDE 11973 9199505199405 9126 8456.2417CSANS +4420CASA ALAIN JEAN CLAUDE 11973 319930719941111389 9851.8417CSANS +2752BEAUTE PATRICK 119731219930419920411389 9851.7417MSANS +0850MULON GERARD 11974 619940919940110668 9425.6717MCOMPT +2641ESCURIAL JEAN FRANCOIS 11974 3199606199506 7803 7679.5117CTECHN +2955MALETACHE GENEVIEVE 21974 9199508199408 7803 7680.9817MSANS +5801COSTES NOEL 11975 8199609199509 9894 8921.3117CSANS +2146DAUMIER IGINIO 11975 4199310199210 8359 7951.7917.ALLEM +3984OR GISELE 21975 9199607199507 7803 7679.6717CANGL +9050GIRAULT LILIANE 21975 5199406199306 8359 7952.9617MSANS +3948SEIN FREDERIC 1197511199410199310 8359 7953.3217CSANS +4265MIGNET BERNARD 11976 5199507199407 7803 7679.7817CANGL +0351RIMBAUD JEAN PAUL 11976 619961219951211389 9852.3617CSANS +1931BERGERAC DIDIER 11933 3198810199501 8656 8146.3218.SANS +9698SCHUMAN DOMINIQUE JEAN 11935 71968101995041557012568.3518MANGL +2020JOLY PIERRE 11935 119870719900710791 9503.6618CSANS +7058BARGE REMI 11935121955021980013327724475.6718MTECHN +3747MARIES RENE 11935 51955021988013844228044.8418MSANS +3141VALLONGUE GUY 11936101976071991011433211715.2418MINFOR +1098CACTU CATHERINE 21936 41962111991072273717261.7218MINFOR +9199PLOUHARNEL BERNADETTE 21936 21967011989102273717261.0418DINFOR +9270ABBE SOPHIE 21937 71968061991041932314934.4118MSANS +2969BEDOYERE GUY 11937 7199001198412 8656 8146.6418.TECHN +1219HOCHE JEAN MAURICE 11938 51969051990011433211714.1218MANGL +1887TOURNON GILLES 11938 51967051990011433211714.1918MANGL +5417AMBREVILLE FRANCE 21938 51973071990071578112721.7618VSANS +1954SOPROCOM PATRICK 11938 71973101992011403411522.1318MSANS +0028ROLE PHILIPPE 11939 81963111994011557012567.1418MSANS +6857KERPADIRAC EMMANUEL CLAUDE 11939 71965051990011433211714.6418MANGL +3697PEYRUIS BRIGITTE 21939 81962061991021834514276.0918MSANS +5636SAVE RENE 11940 21969061991101433211714.1918MSANS +5290VIALE PHILIPPE 11940 11974071991011369311286.8418CINFOR +2591COLLE FLORENCE 21940 3199207199107 8656 8146.5218.SANS +7651GOZLAN XAVIER JEAN 11940 41960031993033200223582.7318MSANS +8388MONTROUGE LOIK 11940121974071992011403411520.2018MTECHN +3384LIVRON FRANCOISE 21940 71964071992072273717261.1818VSANS +7291MARLY MARTINE 2194010199206199106 8656 8145.8318.INFOR +2644EAU FRANCIS 11941 11968121990011433211713.5818MSANS +0515WRIGHT PHILIPPE 11941 21973061992041403411520.2118MSANS +1243SEMAPHORE ANDRE 11941 71969111986072470018540.5618MTECHN +1791PASTEUR BRIGITTE 21941 61974101992011578112722.8818MTECHN +1226SAUD JEAN PIERRE 11941 91973081995011621213034.1018MANGL +3874PASSERINES DOMINIQUE 21941 61966021992042273717260.5318MANGL +5394QUAY YVES 11941 91973041990101684813421.4518MANGL +0308BELLIVIER MICHEL 11941 21963091988043417325098.6318MSANS +8445HEROS SYLVIE 21942121963091991082470018540.5318MSANS +7703CERF NICOLE 21942 51978071992121471512025.6118MSANS +3807REBAIS FRANCOISE MICHELE 21942 31972041989011621213032.7018CSANS +5173TARCO MARC 11943 51973051993011369311286.4718MSANS +3544RESTANQUES SERGE 11943111971121990011433211713.8018MVENTE +7289FRAMBOISIERE DANIELE 21943 51969071991011578112721.6718CALLEM +2761WYLLIE ANNIE 21944 41963121985051932314935.2918MSANS +7593AMPHORE BERNARD 11944 71964101989062922321684.7218MANGL +7373PAMPERIGOUSTE MICHEL 11944 21972101992011403411521.3418MSANS +1159PATIOS ELISABETH 21944 91970101991101932314935.2618MSANS +6999BEL ALAIN 11945121969101990011433211714.7918MSANS +7962VIGIE MICHEL 11945 91971071994122295317300.3718MTECHN +3123GAULLE ERIC NOEL 11945 51973121991082470018540.6918MMARKT +9943DOUMER PATRICK 11945 51968041990071433211715.1118MSANS +3765IMPERATORS GHALIA 21945 61965021993102137316332.1118MSANS +6688COULOUNIEIX HERVE JEAN MARIE 11945 61971031991062273717260.7718MSANS +0965JUDITH BERNARD 11945 51966051987122470018542.2418MINFOR +3763MERMOLLOD DANIEL 11945 21972071992011433211713.5318MSANS +0042POUTGE PHILIPPE 11945 81968081990101433211715.7218MSANS +2250JACQUIN JOEL 11946 41971071991102022115556.3818MSANS +7112REDOURTIERE VERONIQUE 21947 3199303199203 7677 7603.7718.ANGL +5217SARRAZINIERE MICHELE 21947 51968111991102137316330.6718MINFOR +1448MAUPASSANT PHILIPPE 11947111968121988102273717260.8118MSANS +7506CLAP JEAN JACQUES 11947101968061986042470018540.8918MSANS +5237JAS MICHEL 11948 21975101993121369311287.1918MSANS +0341MAKILA NICOLE 21948 2198901198510 8656 8145.1118.ESP +3475REMISE MARIE CLAUDE 21948 41968041989042273717260.3218CSANS +3575DONAT JEAN MARC 11948 51972121991011621213033.6418MINFOR +0433CAROUBIER PHILIPPE GABRIEL 11948 5198801198306 8656 8146.1618.ANGL +9184PINEUILH CATHERINE JEANNE 21948 11968091967091493112142.5618MSANS +1377KERCOLIN ALAIN 11948 91972061992112137316331.4718MSANS +7248MERCIER FRANCOIS 21948 71970071993121834514275.1418MSANS +9014FELOUQUE JEAN LOUP 11948101972121994011621213032.9718MCOMPT +1756FREMICOURT DOMINIQUE 11949 81969121989111932314933.9918MANGL +7383BLAISON FRANCOISE MARIE 21949111970071994031834514275.1618MALLEM +6290TILLEULS BERNARD 11949 61971041990123417325098.1518MINFOR +2226VIVO DOMINIQUE 21949 41971101995041834514275.6118MTECHN +8441SARGIS CLAUDE 21949 11973061993082175716601.4318MINFOR +1520PIC JEAN JACQUES 11949 11975041992041403411521.8618MSANS +5696DRUGEON PATRICE 11949 81980071995041249910473.1818MANGL +1048MORIZET ANNE 21950 11970121994051834514274.8318MSANS +4058FRANCE ALAIN 11950101974091991071578112722.6118MMANAG +0512MARBO JOSIANE 21950 71972011992102017815517.3818MANGL +2797GUY LIONEL GILLES 11951 51976051993071894014662.5918MSANS +9267SAUSSIERE MARC 11951111972041992102017815516.2418MSANS +6865EMMANUELLA ALAIN 11951 51982041993011369311287.7418MSANS +0116GALICIE FRANCOISE GEORGETTE 21951 41971101992011471512024.0618MANGL +6144ROSERAIE DOMINIQUE THIERRY 11951 91972081992112739020404.7018MANGL +9941JULIETTE CHRISTIANE 21952 71976091992011578112721.6518MANGL +1879CLAIRVAUX JEAN SYLVAIN 11952 31976041993011369311287.4318MALLEM +9577PECHEURS DOMINIQUE 11953 31978031995011578112723.3318MSANS +4352BAR REGIS 11953 71979061994011249910473.4518CSANS +2194EVIAN DANIEL 11953 81977061992011608112915.1218MANGL +0566PARADISIER DIDIER 11953 11983111993011215710278.3018MANGL +8627CHARRIERES PHILIPPE 11954 61974111982102470018540.8018MSANS +5729BRECHET PHILIPPE EMMANUEL 11954 41974081991012137316331.2818MINFOR +3643RONSARD PATRICIA 21954121976011982052256617146.4518MSANS +1486AGEN CAROLE 21954 91977071984112256617147.1818MANGL +4779CALIFORNIE PATRICE 11955 31975051991101578112723.3318MSANS +0975BIEVRES ALAIN 11955 61978101993011471512024.4718MSANS +8614DUSENBACH ALAIN 11956 61979031992011471512024.3918MSANS +4428SAUZON ISABELLE 21956111977051992011471512024.2618MSANS +1720EOLE PATRICK 11956 41987111986112090215980.5518MALLEM +8905JANVIER MARLENE 21957 11979071993041471512024.3018MSANS +7774GAL PHILIPPE 11957 81977061982041834514275.7218MESP +3204SAGINAW EDITH 21957 319790719780711302 9774.2018MANGL +5409LEUN CLAUDE 119581019800719821011389 9852.4518MANGL +4971CHANTEGRELET FRANCOIS NICOLAS 11958101978061987112256617146.9518CSANS +5691ALTIPORT ANNE 21958121979101993111471512024.9618DTECHN +1005FLEURS PIERRE 11958 81981041985041684813421.4218MSANS +6295WINTER JACQUES 11959 81982081988052090215980.7318MINFOR +3634CELY JOELLE 21959 31979101995021433211713.6518MSANS +8425SOPITENIA BERNARD 11959 919790619831111389 9851.2118MANGL +2714AGNEAUX VINCENT 11959 21980091979091684813422.7218MSANS +3908SAN CATHERINE 21959111980031989112090215980.7318MSANS +9522ALLERAY EUSEBE 11959 81982041989052090215979.8918MANGL +4818CARNOT GENEVIEVE 21960 61981031995021433211714.8218MSANS +2809VAUCRISES FLORENCE 21960 1199205199105 8656 8146.4618.SANS +6703LAFONT CAROLE 21960 31993081992011249910472.3918MSANS +4781RUSSIE FRANCK 11960 1199006198906 8656 8146.2818.ESP +0025OYANA AYALA 21960 31981011980011202810241.2518MANGL +4606GARNET CHRISTOPHE HUBERT 11960 41983011993041326611017.3218MSANS +3285CASTAGNIERS BRIGITTE 21960 61980061986101684813422.5318SSANS +9855HEBERT GABRIEL 11960 11988091992041249910472.9618MALLEM +7538RUSTICANA JACQUELINE 21960111981011980011326611017.7018MANGL +7245HAVRE ALESSANDRA 11961121985031984031608112917.1018MSANS +2845ROSNE ANNE NOELLE 21961 6199507199407 7803 7681.3818MESP +4993NOIR GUY 11961 81982031995101638413149.8318MINFOR +0352NOTAIRES PHILIPPE SERGE 11961121986111993072397418036.8018MSANS +6114LAMPAUL ROSELYNE 21961 61994021992011202810240.8618CSANS +8947GUE JEAN PIERRE 11961 41981071995071433211713.7018MSANS +6115NICOLAS DOMINIQUE 21961121983011982011608112916.0218MSANS +0276ESQUIERE YVES 11961 81988081992061450311832.1518MSANS +5271BARGEMON SERGE MAURICE 11962 51992111991011249910471.6518MSANS +3485SOURCES MARTINE 21962 1199201199101 7803 7680.9818.SANS +1542BOCAGE MARYVONNE 21962 5199203199103 9597 8728.5818CSANS +8004CARDINAL MARIE JOSEE 21962 21983051982051527112373.2318MSANS +7577VIE KAVERIO 11962121982061987111608112917.1318MSANS +1474RABIAC CLAUDINE 21962 81984061983061249910472.0718MSANS +7742CAZILHAC DOMINIQUE 21962 51983011982011608112915.6518MALLEM +1316BRIAND FRANCOISE 21963 21983041982041608112915.7518MCOMPT +5967MASCREE YVES 11963 91983071988011608112915.3918MSANS +8262PENSEES FRANCOIS 11963 71985081991091288210745.3018CALLEM +9624JOFFRE FRANCOISE 21964 71988041987041202810240.7718DALLEM +1583MONTGOLFIER BERNARD 11964 11984071993041288210745.2718MSANS +8539GILBERTIN MOISE 11964 11985041986081288210745.4318MSANS +9414YVELINES JEAN PIERRE 11964111985071984071288210745.6618CANGL +2500PROVOST DANUTA HALINA 21964 51985051984051381911365.9518MESP +4860AUBEPINES THIERRY 11964 31993081993082401918075.8118MANGL +1591CALADE ALAIN 11964 21984071990091288210745.7518MSANS +8611DUGUESCLIN MARIE NOELLE 219651219880619870610876 9503.9018MANGL +1890DUC PATRICK 11965 21985091989111527112373.2218MANGL +8780ANTANANARIVO JEAN PIERRE 11965 219860619931210791 9502.9918MINFOR +9489CALMETTE JOEL 11965 31991121992122401918075.5718MANGL +0389VICTORET YOLANDE 21965 1198810198707 8656 8146.2818.SANS +8865VERDIE CHRISTINE 21965 51990111989111949415051.6818MSANS +3552LOGEM ISABELLE 21965 3199408199308 8359 7951.8018MSANS +2210MANCHOULAS PHILIPPE 11965 31994021993021420611638.9518MTECHN +6427LAUTIN JEAN DANIEL 11966 719890619880610791 9502.0518MINFOR +9413KERAVILOU HUBERT 11966 51989061993111249910472.6918MANGL +0446CHENEUSE JACQUES 11967 419931119950910363 9232.5318MVENTE +8752ALPILLES PATRICE 11967 6199105199005 8656 8146.2318.ALLEM +8347AICARD BERNARD 11968 219880619880110407 9271.1118MANGL +2090ALICE JEAN MICHEL 11968 61993041992041202810240.9118MSANS +8583EPINETTES DENIS 11968 31988041994101249910472.6618CINFOR +2122SEE PHILIPPE 11968 9199205199105 9597 8728.6418CANGL +2399ROQUEPAVA PAUL 11968 81988071993111249910472.9118MSANS +8130FRATERNITE JEAN FRANCOIS 11969 91992061994011288210745.7218MSANS +7498CARROUGES JEAN MARC 11969 31989041993121249910473.0618MANGL +3505CHEVREUL JEAN JACQUES 11969 61990091989091467711987.2218MSANS +2473MAJOR THIERRY 11969 3199406199306 7677 7604.8418CSANS +7707AYGOSI CORINNE 2197010199502199402 8359 7953.4218MSANS +6442BERGER NATHALIE 21970 5199607199507 7803 7679.4518MANGL +5162CHANDELIERS JOEL 11970 7199501199301 9085 8419.1118CSANS +1417BILLETS WADY 11971 119931019921011389 9851.2118MANGL +1522PARAME COLETTE 21971 3199606199506 8359 7952.5518MSANS +2322BARRE JACQUELINE 21971 91991011990011202810239.7818MANGL +8136TASSIGNY JEAN PAUL 11972 31992061991061249910472.4618MSANS +2240LOUP VERONIQUE 21973 21994031993031267210589.1018MSANS +2489VELLEDER MARC 11974 7199506199406 7803 7679.7818CTECHN +8166GUERRIAS CLAUDE 1197710199610199510 7803 7680.5718CSANS +6073ALLENDE DOMINIQUE 11977 1199606199506 7803 7680.9018CSANS +6606FROIDEVAUX FRANCOIS JEAN 11934111958051993013844228045.6538MESP +5822DITTE NAGUIBA 11937 61966091991072273717260.5038MSANS +1148KERVENNEC JEAN JACQUES 11938 31971051991011663613342.7438MANGL +8491ROCHEBRUN MAURICE 11939 51967011992021932314935.2938MCOMPT +5749GILBERT JACQUES 11939 61968031992102334017610.6938MTECHN +3667PERGOLETTE JACQUES 11939 31963051988011663613344.6938CSANS +6409PLACE JOSYANE 21940 71984011991091288210745.1338MSANS +2498GASNIER CLAUDE 11940 119810719890511131 9657.9738MSANS +2100BRASSIOUX BRUNO 11942 41973061991011621213032.2438MSANS +1118HOUMEAU ANDRE 11943 51962111991072273717260.3538MSANS +4519CAGOU JEAN CLAUDE 11943 41972071991011663613343.2038MSANS +6013REMO JEAN MARC 11943 91966121990011663613343.0138MANGL +8050YAN BERNARD 11944111963121992042273717261.8138MSANS +3614EGUILLON SERGE 11944 31978041992011471512025.5638MSANS +5430CHARPENTIER JEAN PIERRE 11944 91966061994072137316332.5038MSANS +8523PARIS PHILIPPE LOUIS 11945101969071992062334017610.6538MANGL +2111TOUL ROLAND 11947 51972021992012017815518.0638MINFOR +0683GEORGES RICHARD EMILE 11948 91976091994012000715439.1738MANGL +7517GRAND PHILIPPE 11950111971041995072470018540.9738MSANS +4909AIX JACQUES 11950 11970041993121834514276.0138DCOMPT +3400NOUAN PIERRE 11951 41971041992122739020403.8938MSANS +7319BERGERONNERIE MICHEL 11951 21979031993011578112723.3338CSANS +2615PATURES DANIEL 11952 91972081993122547019085.9538MALLEM +1673MIRAMAR PHILIPPE 11952121973071983112470018541.3438MSANS +4747LOLIVE FREDERIC 11953 81978111993011608112915.9738MSANS +9613BORD JEAN MARC 11953 41978051995041249910473.2038MSANS +9161CHANTE PATRICK 1195311199603199505 8656 8147.0938MTECHN +1511COLBERT PIERRE MARIE HENRI 11953121973031993042017815517.9138MSANS +0700BRAGELOGNE ALAIN 11954 91974021989052256617146.1638CSANS +4590BERRY CHRISTINE 21954 5199302199201 9085 8419.4938DMANAG +7017LASPLANES DOMINIQUE 11955 41984061993041326611016.6238MCOMPT +4869ROUMANILLE CLAUDE 1195512199306199206 9126 8457.4938CTECHN +2931PYRAMIDE ANDRE 11956 61979031992011471512026.0638MSANS +0636COTEAUX MICHEL 11956 31976011992011608112915.2138MANGL +9829EUROPE JACK 11957 11980061985011684813422.6838DSANS +7001FORET MARC 11957 41977011994011249910471.5638MTECHN +7136OCEAN HENRI 11957121977061992011471512024.5338CSANS +3955VIGNES PATRICK 11959 51981011993031608112916.1438MANGL +9568ARNOCHE GERARD 11959 71981061993121471512025.8338CTECHN +4979AIMEE PASCAL 11959 519860219880110791 9503.5238MSANS +2891SCHLOSSER BRUNO 11960 51982111995071433211713.6738MSANS +8194CABIRAUX JEAN LUC 11960 219930119910110407 9272.1338SANGL +2865LEIGNE ANNE MARIE 21960 71980091993051527112374.8538MSANS +4343GERMIGNY YVES 11961121983041982041326611017.7438MSANS +2039ROUTE JEAN CHARLES 11961 21982031981031326611017.8838MANGL +8887CUTTE HUBERT 119611019820619810611131 9657.5738CANGL +5692LAC FREDERIC 11961121981051994011433211715.2438MTECHN +9404COMBES HUBERT 11961 9199308199208 9597 8729.7438MCOMPT +7675CHEVRIER JEAN HERVE 11962 41984021991071527112374.2538MINFOR +8147PROMENADE CHRISTIAN 11962 3199405199201 9597 8729.7238MANGL +8550RASCAS JEAN 11963 119850219900610791 9503.9738MSANS +8387JEROME PIERRE 11963111985041992011949415051.6838MALLEM +7757FAVIERE PATRICK ANDRE 11963 51984081991021527112373.3138MSANS +2903GLADIATEURS MICHEL 11963 31984121983121326611016.0338MSANS +5686BEDFORDALE THIERRY 11963 819831219821210791 9502.0438CINFOR +5983TANNERON JEAN FRANCOIS 11964 61987111995042256617147.2238MTECHN +5469CIGALIERE JEAN FRANCOIS LOUIS 11964 31988081988021450311832.6838MSANS +2425BOUVREUILS MICHEL 11964 11988011995121381911366.9938MMANAG +7826EAU ARNAUD 11964 81987021986021249910473.4938LSANS +4783TESSIER MICHEL 11964 61990011991011249910472.1238MALLEM +4053ARPENTS PHILIPPE 11965 219901019891010407 9271.1138CESP +5354COMBELONGE PHILIPPE 11965 41985041984041288210745.9338CESP +0915TUILLIERE JEAN LOUIS 11965 51989031991011249910471.5838MCOMPT +3732MALABRY FREDERIC 11965 219940119910110407 9271.7938CSANS +8032VIRO PASCAL 11966 319921119911110024 8998.3738MSANS +0237TORRICELLI ERIC 11966 61988101986051288210744.7638.SANS +9815LAPLACE PHILIPPE 11966 5198912198812 8656 8146.1438.SANS +0253TALLOIRES ERIC 11966 61989121993071381911366.0338CSANS +7893BOURBOTTES JOEL 11966 8199404199201 9597 8729.0338MANGL +2674SET OLIVIER 11966 619891119881110407 9270.5638MSANS +8321LONGS FREDERIC 11966 219950319940110668 9427.0238CSANS +6369DOURBIES PATRICE 11966 319920319910310024 8999.3438CSANS +1563TURBINE JACQUES 11966 91987031994091693613498.1438MTECHN +6038COLLINE RICHARD 11966 5198912198812 8656 8147.2238.ANGL +8370BONSON THIERRY 11967 5199011198911 8656 8145.3838.MANAG +1538FAUVETTES HUGUES 11967 6199609199509 7803 7681.3138MANGL +5092DJINNS MICHEL 11967 1199111199011 9597 8728.9938CSANS +3468GARDES FARID 11967 119880319870310407 9270.4238MSANS +7303DENY JEAN CLAUDE 11967 51993021992021202810240.7738CESP +1319PLOUGONVELIN JEAN FRANCOIS 11967 919880919870910407 9270.1638MTECHN +7182BEAUMARCHAIS ALAIN 11967 11990111993071381911365.9838MSANS +5432ROMAIN JEAN PIERRE 11968 519940519920110024 8998.1738CANGL +8756PEGUIERE PHILIPPE 11968 919940319930310668 9426.6338MTECHN +0590MONTROSIER DIDIER 11968 419940419920111389 9851.6438MSANS +3773FIORI MICHEL 11968 61990051990051381911364.9938MSANS +9060CHAMBORD AGOSTINI 11968 9199406199306 7803 7679.9138CSANS +7693DIZIER THIERRY 11968 319920519911111389 9851.7338CSANS +7838CECILE PATRICK 11968101988071991011249910473.6738CSANS +6964GOYRANS GABRIELLE 21969 91990031992011202810239.9638MSANS +0784COSQUER COLIN 11969 719940619930611389 9851.9638MINFOR +8622COURTAIS JOSE 11970 619960719950710668 9426.6238MSANS +2794BERGERET CHRISTOPHE 11970 61992051993041202810240.5938MINFOR +4688RABELAIS FREDERIC 119701219940619930411389 9850.7138MANGL +9681POUSSEAUX RICHARD 11970 61991041990041202810241.4538MINFOR +0530BRANCOLAR PIERRE 11970 619900619890610024 8998.3538CANGL +9957LENTILLY LAHOUARI 11971 7199607199507 7803 7680.6638CSANS +7210CHAMPERRET ANDRE JEAN 1197111199406199201 9597 8728.6838CTECHN +7549BRAMO JEAN 11971 2199612199401 9597 8727.9638CSANS +1719TELEMLY JEAN 1197110199612199512 9894 8922.8038CINFOR +7574MOUQUET PIERRE 11971 3199304199204 9597 8728.7738CANGL +1471ETOILE PHILIPPE 11971 3199501199304 9597 8729.9038MANGL +1536MAISTRE LOUIS 11971 51990121989121202810241.5238MINFOR +7328BLAMONT BRUNO 11971 31991021990021202810240.4038CSANS +4093TOLOSANE JEAN 11971 51991071990071202810240.7638CANGL +8648RAPHAEL GERARD 1197210199408199201 9597 8728.4938CMICRO +2769GOULET ERIC 11972 119950419940111389 9852.5938MSANS +9108CRETEIL MICHEL 11972 4199606199506 8656 8145.6638CSANS +5284POMPONNE ALEXIS 119721219920519911211389 9851.7938CTECHN +8876LAIGNEAU ALAIN 11972 3199202199102 8656 8146.4138.ANGL +6070REVOULUN CONOR 11972 2199608199508 7803 7681.4038CMARKT +8083CLEYRAC JACQUES 11972 5199403199201 9597 8727.9138CANGL +8314PARIS GERARD 119731119940819930810668 9426.0338MANGL +4108SEGURET GUY 11973 9199207199107 9597 8728.4638CSANS +4139PRESSENSE PATRICK 11973 9199608199508 8656 8145.6938CALLEM +2465CHATEAUDOUBLE DIDIER 119731019950219940210668 9426.4838CSANS +5213MARTINIERE GERARD 11973 8199608199508 7803 7679.2838CSANS +0769POUR PHILIPPE 11973 719940919930910668 9425.8538CSANS +2580BESON MARC 11973 7199307199207 9126 8457.0238CALLEM +4770LIEUTENANT JEAN OLIVIER 11973 8199607199507 8656 8145.6638CINFOR +1963SENGA CLAUDE 11973 6199412199201 9126 8457.2238MCOMPT +2932SOULT CAMILLE 11974 5199604199504 8656 8145.8338CESP +5177CLOS GILLES 11974 4199506199406 9126 8456.6138CALLEM +0619MEUR BRUNO 11974 2199607199507 9894 8921.6938CANGL +3202RUBEU DOMINIQUE 1197411199610199511 9894 8922.0838CINFOR +1263PONTILLOU DIDIER ERNEST 11974 1199309199209 9597 8728.1738CSANS +3833NEUVE JACQUES 11974 2199508199408 9894 8921.6438CANGL +6528NIMES ROBERT 11974 1199410199310 9597 8729.3638MSANS +9312CHAT ANDRE 11974 7199307199207 9597 8729.6338CANGL +0437SAUVAGEONNE RICHARD 11974 4199301199201 9597 8728.8238MSANS +5387PLEHEDEL JEAN RENAUD 11974 8199309199209 9597 8728.9938CVENTE +5835MAROLLES DENIS 11974 7199609199509 7803 7679.9438CSANS +5277BURON STEPHANE 11975 4199410199310 9126 8457.5938CALLEM +0147URSULES PATRICK 1197510199512199412 8656 8147.1738CSANS +6637DEVANT PATRICK 11975 7199610199510 8656 8146.2938CSANS +7462BARBICAJA STEPHANE 11975 9199609199509 7803 7679.3138CSANS +9096HELENA PHILIPPE 11975 81994111994011202810241.8538CINFOR +7777ENGOULEVANT JEAN CLAUDE 1197511199612199512 9894 8922.0838CSANS +7823BRENNUS JEAN PIERRE 11975 2199606199506 7803 7681.2038CINFOR +7353LOOVAS FREDERIC 11976 6199612199512 9894 8922.8938CANGL +5381BRIAND JACQUES 11976 1199507199506 7803 7681.4038CSANS +8880LECLERC FRANCOIS 11977 2199506199406 7803 7679.8738CMICRO +1576MONTMELIAN CLAUDE 11977 9199607199507 7803 7679.3138CANGL +6203GUECH RENE 11977 1199507199407 7803 7680.2638CCOMPT +2768MERIBEL RICHARD 11977 7199607199507 7803 7681.2938CSANS +7366FERNANDEZ OLIVIER 1197712199607199507 7803 7681.0238CANGL +7525LONJUEUIL SYLVIE 2193011198901199511 8656 8145.9141.INFOR +8410CAIXA JEAN PIERRE 11935 31956051979013327724476.3741MSANS +4687FURSTENBERG NADIA 21936 31972041994101881314585.6641MSANS +9030AMIRAL JEAN RENE 11936 61961081993011663613343.8441MSANS +0747SURREY TOMOE 2193611199201199101 7803 7680.6241.INFOR +6230LIGURES JEAN PAUL 11937 81962021994042666519900.8141MALLEM +5598FONTENELLES CLAUDIE 21937 31962031995102666519899.2941MANGL +7964AUMONT JOSE 11938 31968121991011433211715.7241CSANS +1865HUBERT CHRISTIAN 11938121962111982112470018542.1041MSANS +0974ROMAINE JEAN MARIE 11939 91962111989071663613342.9741MALLEM +8959BILLEHOU DENIS 11940 41962011993011663613343.2041MSANS +3134RESISTANCE CHRISTIAN 11941 61970051987012022115555.5741MANGL +2829MARCIGNY ANNETTE 21941 8198901198711 8656 8146.6141.SANS +9621AIR MONIQUE 21941111968071990071578112723.4141MTECHN +2532MIMOSE JEAN 11941 31979031994011369311287.2541CANGL +6822BERLIOZ MICHELE 21942 81965021992051932314934.6841MSANS +8381REGRATTIER FRANCOISE 21942 41963101991072273717261.0341MSANS +1877GASTON APOLLINA 11943 41972061995011663613343.5241MANGL +9764NORTH CATHERINE 21943101992051995121330611017.8841MVENTE +0051FABRON GILLES 11943111972121992041403411522.2441MSANS +2826DESTEY RICHARD 11943101965121990011433211713.6541MSANS +4901GANDHI FRANCOISE 21943 31969031991011932314935.1641MSANS +2788ENSOLEILLADE CHRISTIAN 11943 81966011991043844228044.1541MINFOR +2725SAROIS CORINNE 21943 71972081994051804514081.9541MANGL +4033GRIVES PHILIPPE 11944 31966101990011433211714.0341MSANS +0306LUTECE CATHERINE 21944 91977061992011471512026.2241VSANS +6413TURALURE LOUIS 11945 11967121990041433211715.1541MALLEM +6065BUARD JEAN JACQUES 11945111969061991011433211714.6441MTECHN +0713CLAUVEL MARIE CHRISTINE 21945121993101992011202810241.7441MSANS +2016BENGALIS HENRIETTE 2194510199103199003 7677 7603.0141.SANS +5741SAUVAGERE ALAIN 11945 91972021989011621213034.1541MSANS +5896GAILLARD ERIC 11946 31973021995011663613344.4541MANGL +4390PAROUQUINE MARTINE 21946 81973041995101911114778.4441MESP +4358MAYE CHRISTOPHE 11946 81970111994051834514276.1841MSANS +3228PERRET JEAN PIERRE 11946 419800719790711389 9852.6741MESP +2070COMMERCE MARTINE 21946 11965101995042739020405.2241MMARKT +2112COT CHANTAL 21947 5199104199004 8656 8147.0141.ANGL +5488MONTAIGNE ERNEST 11947 81972061989041621213032.6541MTECHN +4615JAURES PASCAL 11947 319850219840211389 9852.1441MSANS +3975BENAT MARTINE 21947 9197204197104 8103 7796.4541MTECHN +5422LAUGIER FREDERIQUE 21948 719850419880110791 9502.2841CANGL +7269TORTE DENIS 11948 71969081994083916628548.6641MSANS +9916MARNES JEAN CLAUDE 11948 719931019910710407 9270.0341MCOMPT +7840GRIGNON CHRISTIAN 11949 51969121989122470018541.4341CVENTE +5255VERNY ARLETTE 21949 81971061990071621213033.7041MALLEM +4729SALONINA PATRICK 11949 91974041992011608112916.6141MCOMPT +5121KISS THIERRY 11949101976041994011369311288.2241MTECHN +3042FERIC MARIE CLAIRE 21949 51984071994031288210744.1741VTECHN +3660PLAINES FLORENCE 2194912199303199306 9597 8728.0841MANGL +6514EPINIERE JANY 21950101972011990102175716601.3041MSANS +4692HUNTZIGER BERNADETTE 21951 71992101991101202810241.0741MSANS +6747CHAMPERRET LAURENT 11951 819870719870810407 9270.9741MSANS +5984JAMET DANIELLE 21952 9199203199103 7677 7603.0441.SANS +8680SERRALONGUE ANDRE 11952 31977071981102470018541.9541MSANS +1345LENTILLAC ALAIN 11952 919940119920110407 9272.0141CALLEM +9942AUSSEL MURIELLE 21953 4199406199306 9597 8729.5841MINFOR +6512SCIPION CLAIRE 21953121974081992032175716602.2441MSANS +2634FOCH JOCELYNE 21953 31996011995011249910473.0941MINFOR +5957CYPRIERE CHARLES 11953 81977091993071369311288.1041MANGL +7817EMILE SYLVIE 21953121973041994011527112373.0441MSANS +8678HUNG HUGUES 11954 819810519850611389 9852.6041MSANS +7968LUBONIS MICHEL 11955 71980041992021471512025.5241MSANS +3688EBAT ANNE MARIE 21955 31977071995071433211714.0341LSANS +0140GIRARD CLAUDE 11955 71978111991041578112722.8741MTECHN +6583EUGENE CHRISTINE 21955 71978051992111608112916.2541MINFOR +3771CUQUES ELISABETH 21955 11993101992011202810241.6641MSANS +9329CARRIERO JOSE 11955 719830419820411131 9658.8341MSANS +6210MACHIEL ROGER 11956 71977031993041471512024.0841MSANS +7407QUENU PATRICK 11956 71980051995041249910473.3241MALLEM +7722CARNOT GENEVIEVE 21956 51977051993031608112915.4241MALLEM +7051PALMIERS EVELYNE 21957 41980041994011471512025.1141MSANS +6978JACARANDAS ALAIN 11957 11985081993041288210744.7741MANGL +5352VANTAGE GERALD 11957 91978071992091471512024.5341MTECHN +9337CHALONS MICHELE 21958 3199609199509 4342 5820.2441MSANS +6534HERRET VIVIEN 11958 919861119860710791 9502.8041MSANS +3402RUVEI LINDA 21958 71981051995041433211713.6241MSANS +5959SERLIANE HERVE 119581119851219841210791 9503.3141CANGL +2613ROSIERS RICHARD 11958 3199601199507 9894 8921.8141MSANS +3289ALLEGRES GERARD 11959121981071994011471512025.9141MSANS +6523ROCCA GUY 119591219850119860411131 9659.1541MMARKT +8881CHATEAUBRIAND GILLES 11959 51981011993071471512025.3241MSANS +5781HELSINKI DANIELLE 21959 81981011995011433211715.7441MANGL +4147SIAGNE CORINNE 21960 61981041980041450311832.2441MSANS +1606POIL MARIE THERESE 21960 919941119920110024 8999.5241CANGL +1752ROUGUIERE GUY 11960 319940819951011389 9851.1041CSANS +5961CHALAIS MICHEL 11960 919930819910110407 9271.4641MSANS +1601DURUY ANNE MARIE 21960 21989071988071249910473.2741MALLEM +3631ESPARIAT MIREILLE 21960 4199511199411 9126 8457.4941MESP +2747TENSE MARCEL 11960 11982021995042256617145.7841MSANS +6989JACQU YANNICK JEAN LOUIS 119601219831119850111131 9657.0641CSANS +4612BOURNET LAURENT LOUIS 11960 119900519891110407 9271.2441MSANS +3236PIOL DOMINIQUE 11960 51984051991011326611017.7741MSANS +6475VILLETTE PHILIPPE 11961 21984081983081608112915.6641CANGL +8207MESNIL REGIS 11961 21982101990112090215979.7941MSANS +0526AGUESSEAU DARA STEFANE 21961 91986041985041288210745.7541MSANS +3092MONTFLEURY JACQUES 11961 11983041994011433211713.9441MSANS +7762BUCHERIE ANNIE 21961 91986101985101288210744.6741MSANS +9535MADONA CHRISTIAN 11961 719931019910110407 9270.8041CSANS +4953GARE HIROMI 21961121984031994011527112374.4941DSANS +6431CORNEBARRIEU JEAN PIERRE 11962121985101991021527112373.6241MANGL +3878ANLHIAC MICHEL 11962 7199602199502 8656 8145.9641MSANS +6464ESTEREL GASTON 11962 619860319880310791 9503.7641MANGL +2255MAUVALLAT ANNE 21962 71982081981081326611016.1541VANGL +8438CHANTACO MARIE NOELLE 2196211199307199207 8656 8147.1541.SANS +4202FENOUA MARC 11962 3199212199112 9597 8728.5041MTECHN +3836PAUL PHILIPPE 11962 31982011993041326611016.2141MSANS +0418CHANET NICOLE 21962121982041981041608112917.1541MSANS +2005ROCHES MARIE HELENE 21963 31984071983071608112915.2141MINFOR +7305RASPAIL YANN 11963 719850919840910791 9501.7841MSANS +4264SCHOENFELD PHILIPPE 11963 619830419841111131 9658.4241MANGL +4951LAUVE JEAN PIERRE 119631119840319860610791 9502.5941MSANS +7632VALLOIS FREDERIC 11963101986011990111288210744.6741MSANS +6021ANTOINE JACQUES 11963 4199406199306 9597 8729.3441LANGL +1193SAUT YANNICK 11963 51987061992121450311830.7941MSANS +5840VIRARD JEAN PAUL XAVIER 11963121995011994011206910241.4941MTECHN +0346CASATORRA BERNARD 11963 419910619900610024 8998.1741MSANS +0082BAURECH HENRI 11963 41991101990101381911365.5041CSANS +3466TULIPES ANNEE 21963121984111983111450311830.8541MTECHN +3635FUSTEL BRIGITTE 21963101983041991091527112373.6441MALLEM +3776THUITSIGNOL ANDRE 11963 91983071986081326611016.7441MSANS +7941PINS MICHEL HENRI 11963 81983081993041288210745.4341CSANS +8903CHARTRES MARIE ODILE 2196412199412199312 8656 8147.2441MANGL +6455GIANOTTI FRANCOIS 11964 219870119860110791 9501.8341MSANS +3178PABU PATRICE 1196412199606199506 8656 8145.9641MANGL +1683TOKI GILBERT 11964101994051993051267210589.2541CTECHN +1069COUTURES ERWIN 11964 6199504199404 8359 7952.6641CSANS +7668PALISSY ALAIN 11964 2199310199210 9597 8729.2741MSANS +4934AIGUES JEAN MARIE 119651019860719860310791 9503.9741MTECHN +5099LARRALDIA REMY 11965 11987021993091949415052.3541CANGL +8301BOUCHAREL FABIENNE 21965 81993091992091839014312.4041CSANS +7214VOUTE CHRISTIAN 11965 419870719870610407 9270.9741CTECHN +7913MOULINS YVES 119651219890519880510407 9271.8641DCOMPT +1180REPENTANCE MICHEL 11965101993111992011249910472.8741MALLEM +1457SAUVETTE GERARD 1196512199301199201 9597 8729.3041MSANS +4206LONGERE ISABELLE MARIE ALICE21965 8199610199510 8656 8146.1141CANGL +2030TONELIER MARC 11965 719860419880510791 9502.5541CSANS +2828DERRIEN JEAN JACQUES 11966 71991011990041202810241.6141MSANS +5283COULLET OLIVIER 11966 519880619870610407 9272.1341MANGL +8198COUPANCES CHRISTINE 2196610199403199303 9126 8456.3041CSANS +4478NOSTRADAMUS GREGOIRE 11966 719860419900210791 9503.9741MSANS +7215HILAIRE FRANCOIS 119661019860319850310791 9503.9741CSANS +8745MONTREUIL GUY ROBERT 119661019910419900410024 8999.0741CTECHN +3647DELESTRAINT JEAN CLAUDE 11966 11989061994011381911366.2741MSANS +7458LISERB JEAN LUC 11966121991061992031381911366.0941MALLEM +6758BIGOCHETS FREDERIC 11966 119911119901210407 9270.8341MSANS +0098JARDINIERS MYRIAM 21966 51986061993071450311830.9441MVENTE +0882BRUXELLES CAROLINE 219661019940319920111389 9851.8241MALLEM +5390VEYRE NATHALIE 21966 419941119930411389 9851.9741MALLEM +4046CHAMBERTE BERNARD 11966 31987091988071949415052.4441CSANS +4837BONNAMOUR MICHELE 21966 21994031993011723313654.5941MSANS +0532MORE LOUIS 11967 919870819930410407 9270.2441MTECHN +4906LELIWA DANIEL 11967 219870619860610407 9271.2041MSANS +5362MAGNOLIAS JACQUES 11967 6199609199511 7464 7525.6141CSANS +8779SORQUES GUY 11967 61988041990011249910472.9741MANGL +1022ETANG GERARD 11967 3199506199304 9597 8729.5841LANGL +8535DELACROIX JEAN PAUL 11967 619940519930511389 9851.5141MSANS +4910ARANDELYS HERVE 11967 71990101989101202810241.0941MANGL +4304EURE ALAIN GEORGES 11967 51991101990101330611017.7941CESP +0132DJILLALI ALAIN 119671119931119920110407 9271.1941MSANS +9907BON THIERRY 11967 91987091992111450311830.6141MSANS +5376REGNAULT DANIEL 11968 51990111991021381911366.7941MALLEM +0903SUR BRUNO 11968121992051994121330611017.0541CSANS +7066RENAN FRANCOIS 119681219890619910510024 8999.7441CVENTE +9334ALL ADELE 21968 9199310199210 9597 8728.9841MSANS +1100MONTFORT ANNE MARIE 21968 519950219930411389 9851.7441MSANS +7153PINSON GENEVIEVE 21968 31989111993071381911366.3041MSANS +4338MABO MICHELE 21968 7199602199502 8656 8147.1541MSANS +2568GODEAUX GEORGES 11968 61994051993051267210590.4141MSANS +9355MEUNIER MARIE HELENE 219681219940919930411389 9851.1041MINFOR +4462CACTUS MICHEL 11968 51993091992091839014312.7641CTECHN +2155REINOTS DENIS 11968 1199406199201 9597 8729.6641CMARKT +1708QUEUILLES ALAIN 11968 91991111991111723313654.7041MANGL +9411MANDRAGORE ALAIN JEAN 11968 81995041994041206910241.6641CSANS +4930ELVIRE PATRICE 11968 41995121993041202810241.7441CALLEM +8112PAVOIS LUC 11969121992021991021381911366.7941CSANS +8181UNIVERSITE OLIVIER 1196912199408199308 9126 8456.6941LVENTE +6245CAIRE ANNICK 2196911199405199301 9085 8419.1641CSANS +2166PRETY CORINNE 21969 7199612199512 9894 8922.5341.SANS +4325COTTAGES YVAN 1196911199407199307 9126 8456.9741MCOMPT +0898SYLCO ALAIN JACQUES 11969 91989091988091249910472.9641MSANS +4572DARTHE DIDIER GEORGES 11969 4199503199304 9126 8456.5541CSANS +9418AUREVILLE PHILIPPE 11969 519900719890710024 8998.2841CSANS +7504MAROT ALAIN 11969 119910319951110024 8997.8341CANGL +4672TRUCQUES JACQUES 11969 2199606199506 8656 8145.6041MANGL +5588POUTILS ALAIN 1197012199405199305 9597 8728.2241MALLEM +8965SAUCES JEAN PAUL 11970 71992021991021381911366.2541CSANS +1934PRESSES LUCIEN 11970 11991091990091467711987.9041CSANS +5600LAROIN LAURENT 11970 91991061990061202810240.6841CTECHN +8935REINE JEAN PAUL 11970 119920819910810024 8998.7141CSANS +9304MARCQ MARCEL 11970 719940119930111389 9851.4341CANGL +5444CHEM LOUISIANE ALAIN 11970 11991021990021202810240.2241MSANS +7850HUBERT BERTRAND 119701219920619920410024 8998.1441CSANS +0638FLEUZY PHILIPPE 119701119900419890410024 8998.7141MVENTE +0729MUETTE CLAUDINE 21970 5199204199104 9597 8729.8541MALLEM +5723MARCHE LAURENCE YVONNE 21970 919940619930411389 9852.3641CANGL +1904CHENE JEAN GABRIEL 1197010199501199304 9597 8729.2141MSANS +1861CREOUNE MARIE THERESE 21970111991101990101330611018.1541MSANS +5885LONGUET MICHELINE 21970 619950319940110668 9426.5941MSANS +9271SEINE LIONEL 11971 81993121992121267210589.8241MSANS +6056CHE FREDERIC 11971 219901019891010024 8999.8541MSANS +8822BOUSSOLE ERIC 11971 819910419900410024 8998.7641CSANS +1433COMBE ALAIN 11971 5199308199208 9597 8729.3941CSANS +5251GRELLOU DOMINIQUE 11971 91992091991091330611018.2441MESP +6795EMMANUEL MARYSE 219711119920719920811389 9851.3041MANGL +6104AUDE CATHERINE JOELLE 21971 7199309199209 9126 8456.4741MSANS +3946PLEUMER CATHERINE 21971 6199301199201 9597 8728.1941MANGL +9614BOUE FRANCOISE 21971 519921219951011389 9850.7641CSANS +5568TASSY DANIELLE 2197111199605199505 8656 8146.4141SSANS +5159CHATEAU GUY 11971 619910419900410024 8998.9541CSANS +3722VERE ALAIN 119711219930919920911389 9852.6941CVENTE +8496ORANGINI PATRICK 11971 31994051993051267210590.4241CSANS +4662CANTE WINNI 21971 9199206199106 9597 8728.7141MSANS +5032CHATAIGNIER MARIE LOUISE 21971 81991121991091330611017.6441MSANS +1771PICHOLINES JOELLE 21971101991121990121202810240.9441MALLEM +8900BOULAINVILLIERS MARTINE 21971 719940619920111389 9852.0041MSANS +8306GUERRE FRANCOIS 1197112199103199003 8656 8146.2941.ALLEM +9088LAROQUE MARIE FRANCE 21971121993091992091723313654.6141CALLEM +6520LIEU JEAN PIERRE 1197112199201199101 9597 8728.2341CESP +2579HERANDIERE PIERRE 11971 6199606199506 8656 8146.4641CTECHN +8999JARDINS PIERRE 11971 819910119900110024 8999.3041MSANS +8513PERRIERES PHILIPPE 1197211199205199412 9597 8728.0941CTECHN +5836GIRARDON SYLVIANE 21972 119911019901010024 8998.5041MTECHN +9465DAN FRANCOIS 11972 31994031993031267210590.0541CALLEM +3970BREGUI GERARD 11972 5199311199210 9597 8729.5241CALLEM +8911RIVIERE MARTINE 21972 5199310199210 9597 8728.8441CANGL +8506RIBOT JEAN PIERRE 11972 3199403199303 9597 8728.1341CANGL +4988CHATILLON DIMITRY 1197210199303199203 9597 8729.2541MANGL +3678GRES CLAUDE 21972 8199608199508 7803 7680.6241CSANS +9757CADENELLE PAUL 11972 219951219940110668 9425.8141MINFOR +8910RENAISSANCE RENAUD 119721019931119921111389 9851.5541CSANS +4973SAL EMMANUELLE 21972 719920119910111389 9851.3941MANGL +8099TURENNE MARTINE 21972 8199407199407 9126 8457.5641DANGL +6683HIRONDELLES MARGUETITE 219721219930919920910668 9425.4541MANGL +3610BERTRAND DIDIER 11972 8199403199201 9597 8727.9941CSANS +7709MORINERIE YVES 11972 7199206199409 9597 8729.5241CSANS +6549BOISSERAIE HERVE 11972 41995041994041206910240.7641CTECHN +8170MALHEUREUX PATRICK 11972 21991111990111202810241.4041CSANS +0105CRONSTADT CHRISTOPHE 11972 6199209199109 9597 8729.1741CALLEM +3953CHARBERYS NICOLE 219721019930819920811389 9850.9841CALLEM +7071BARBINIERE PHILIPPE 11972 71993031992031267210590.4741CSANS +4851LETRIMAN CLAUDE 11973 5199602199502 9894 8921.9641CANGL +0165VAUGRENIER JACQUES 11973 119930919920911389 9852.3841CINFOR +7080BANCHE ANTOINE 11973 3199306199206 9597 8729.6741CSANS +1252VINCENNES ANDRE 11973 6199410199310 9126 8457.3641CSANS +1299SERIGNE LOUIS 11973 4199310199210 9597 8728.2641MSANS +7759WILDERTON LUC 1197311199410199310 9126 8457.3241CSANS +8844LORGUE SYLVIE 21973 119930319920311389 9852.3841MSANS +8332BRANLY BRIGITTE 21973 7199509199409 7803 7680.7241CSANS +8767DEMOISELLES LUC JACQUES 1197310199301199201 9597 8729.7441CANGL +6481MANCEY RENE PAU 1197311199411199506 9597 8727.8341CSANS +9685HERRIOT MARIE CHRISTINE 21973 6199408199308 9126 8456.8241CESP +5412JANVIER KATY 21973 6199210199110 8359 7953.4241.VENTE +3049VICOMTAL ANNE FRANCE 21973 2199305199205 9597 8728.1741MANGL +8606DIDIER MARC 11973 3199308199508 9597 8728.5041MSANS +5438MOREL JEAN JACQUES 11973 91994031993031267210589.0641MSANS +1333CERET ISABELLE 21973 3199608199508 9894 8922.4141CALLEM +8656COUBARD FREDERIC 11973 9199305199205 9597 8729.6641CTECHN +7939MONOD SYLVAIN 11973 5199301199201 9597 8729.2541CSANS +2807BOTTERO PATRICK 11973 4199403199303 9597 8728.5341CSANS +1950VAROISES ELISABETH 21973 619930919920911389 9850.8341MSANS +0981MARCILLY JEAN RENE 11973111992101994011249910472.1941CTECHN +7067ROSES PASCALE ISABELLE 21974 3199406199306 8359 7952.7941CSANS +5670DEVLOO RICHARD 11974 5199512199304 9126 8456.9141MALLEM +0896CHEVAL CHANTAL 2197411199603199503 7803 7681.1141CVENTE +7374BAUX MARTINE 21974 6199607199507 7803 7679.6441CALLEM +2343PANSEROT BRIGITTE 21974 7199406199306 9126 8456.5741CSANS +8458ARMANDY CLARA 21974 419940719930810668 9427.4041CTECHN +5573TAKAOA MARTINE 2197412199306199206 8359 7953.1141.ANGL +1351ROYAN MICHEL 11974 8199606199506 8656 8145.8741CSANS +2308COAT MARIELLE 21974 21994091993091206910240.3741CANGL +1077BARBY HERVE 11974 3199609199509 8656 8146.8341MSANS +8863JUNOT JEAN GILLES 11974 7199610199510 8656 8145.4441CSANS +3894CIEL JACQUES 11974 119940919930910668 9425.6741CINFOR +5086FABRE GEORGES 11974 7199407199307 7803 7680.7141CSANS +3050CROISON RICHARD 11974 9199409199309 9126 8457.3341CSANS +9319CHAT DIDIER 119751119941219931210668 9426.9341CINFOR +2636MONTJUSTIN BERNADETTE 21975 8199609199509 7803 7680.8141CSANS +1156MER JEAN MARIE 1197512199603199503 8656 8145.2141CSANS +2790RAGEUL SERGE REYNALD 11975 5199603199503 8656 8146.7941CSANS +4387BRETEUIL ERIC 11975 1199606199506 8656 8146.2941CALLEM +7191COCHET HUGUES 1197511199609199509 7803 7680.7541CSANS +7798LARGE DOMINIQUE 21975 8199609199509 7803 7680.8641CSANS +1442CANDEOU ARMAND 11975 3199603199503 8656 8147.1041CSANS +6969CHAIGNEAU CHRISTOPHE 1197512199610199510 8656 8146.0241MALLEM +5660HOULET MARIE ELISE 21975 5199603199503 8656 8147.0441MANGL +9225TOURNON MARIE ELISABETH 2197612199607199507 7803 7680.8641CSANS +3312GURGY FRANCK KLEBER 11976 6199606199506 7803 7679.6741CESP +2078CEDRES JACQUES 1197612199509199409 7803 7681.4941CSANS +1381ALPHONSE MARIA ISABELLE 21976 3199607199507 7803 7679.6341CSANS +2376POMPADOUR HELENE 21976 7199606199506 7803 7681.2941CINFOR +2713RUILLE PATRICK 1197612199507199509 7803 7680.1241CALLEM +2134FRANCOEUR ELISABETH 21977 6199610199510 7803 7680.3241CINFOR +7879EGLISE LAURA 21977 8199608199508 7803 7680.6241CCOMPT +6841GEAUNE GILLES 11978 2199507199407 7803 7680.3041CANGL +8261LOC PHILIPPE 11935 11955021990084330331421.1942MSANS +0031DEFEND JEAN YVES 11935 51961081987042273717261.5642MINFOR +7162PIOT YUMIKO 21935 41969041991051932314933.5575CSANS +6005DESIDERATO ASSUNTA 21935111962101994012137316332.6342MSANS +1346NIZON JEAN LOUIS 11936 51971021994011663613343.9542MSANS +6423CHARTIF ANNIE 21937111962081987082572519241.9042MANGL +3151EUBAS DIDIER 11938 81963021981053327724476.0342MSANS +0345KOCK CLAUDINE 21939 91968051995041834514275.4142MSANS +4204POSTILLON NICOLE 21939 31963121992102137316332.0042MSANS +1286BERTIN BERNADETTE 21939101967011990011932314935.1342CTECHN +0588ONZE BERNADETTE 21939 41962101990072273717260.7142MTECHN +0552ARENE PASCAL JACQUES 11939 21963071988101663613342.9742MSANS +8335DRAGON BERNARD 11939111963031987012022115555.3642MSANS +5819CORNEYRETTE MICHEL 11939 41963041983123200223583.0542MSANS +6812MONADE ANNIE 21940 11961121994072137316330.5642MSANS +5797PLATEAU ROGER 11941 71964041993113844228045.2942MSANS +0254FONTAINE DOMINIQUE 11941 41963071992041557012567.5042MANGL +8521PRELLAVICA JEAN 11941101966061989071663613344.4542MSANS +1509MOINE JEAN PIERRE 11941 21960031984102273717260.4542MTECHN +9780LETELLIER JEAN CLAUDE 11941111975071991011369311286.0842SALLEM +0995HECTOR MICHELINE 21941 91971011991071578112722.3742MALLEM +0917PUISAGE JANNIE 21941 81962041992042273717260.7242MSANS +0311LIEVRES ELISABETH 21941111968031990011932314934.1442CTECHN +2094NOTRE JEROME MARIE AUGUSTE11942101970061993071557012567.0042MSANS +3489EGALITE SYLVIE 21942 81962041981112470018541.3642DSANS +2303BUSSY PASCALE 21942101968121991011932314933.8242MMICRO +2502MEAUX JOSEPHINE 21943 41966061994102137316332.2942MSANS +9316DANTON ANNE HELENE 21943 91969091991051932314933.6942MSANS +0398ABREUVOIR JEAN LUC 11943 41962111986012470018540.7542MSANS +6448FORCET VALERIE SYLVIANE 21944 81964091994072137316331.2842MANGL +9339TOULON DENIS 11944 91970121994011663613343.1042MSANS +1107OUZOUER ANNE 21945 11966061992021932314935.2242DTECHN +1368ALIVOU MICHELE 21945101971101989102273717260.0542CSANS +9954LANFRIERE JOSIANE 21945 41996011994011202810240.4142DANGL +1709LUXEMBOURG FABIENNE 21945111972071991101578112721.5342MSANS +5979DESNOUETTES PASCAL ROBERT 11945 31975061990011684813422.8442MSANS +3473AULX OLIVIER 11945 61971081991012334017610.4742MSANS +3451MANEBIT MARIE MADELEINE 21947101972041993121471512025.3442MSANS +7163GIGNAC MYRIAM 21947 11969081989042334017610.2042MSANS +8839CORINA DOUGLAS 11947101967041995042137316332.5642MSANS +7647COCTEAU YVAN 11947 21973051995072547019086.4742CSANS +9097APARTADO BRIGITTE 21948111974101994011621213033.6142CANGL +9822VERONIQUES PATRICIA 21949 419791119920111389 9851.0342MSANS +5016SYLVAFLOR BRIGITTE 21949 51970021994032334017609.4642MSANS +5933BROUILLARD SYLVIE 21949 31969011991072137316331.1542MSANS +1734PLAGE LUDWIKA 21950 61971081991012137316331.0742DSANS +8533LIBERTE PATRICIA 21950121970011995041834514276.1042DANGL +7399FONTVERT ISABELLE 21950 41970121994051834514275.5542MTECHN +7055MONTGIVRAY PIERRE 11951 41972081994062547019085.7942MVENTE +4158CHARTON DANIEL 11951 91980041993041608112915.2642MANGL +7325NIEL RICHARD 11951 71973081989053417325098.0042MANGL +7367BRIAND MICHELE 21951 41973061991011578112722.0142MSANS +0279HEURES PHILIPPE 11951111980041993011527112373.3542MSANS +5487TOURAINE CLAUDE 21951 41972081991012137316332.7242MALLEM +1239JALMOUTIERS CLAUDE 11952 31983031991031693613499.3442CINFOR +4152CHEMST ELISABETH 21952 91972031971031258210512.6242MANGL +7961ABBE KATIA 21952 51986071991041249910472.5942MANGL +9227LEPELLETIER MARIE FRANCE 21952 81973051992102017815518.1942CSANS +2603ESCALE DANIELE 21952101972071990011621213034.0142MANGL +9280SISLEY BRIGITTE 21953 319740719730711515 9931.0742MESP +6356ROZIER MONIQUE 21953 51972081990041621213032.3542MSANS +6175CHENNEVIERES MARIE THERESE 21953111980101991011249910473.1542DSANS +0679FONT EMMANUEL 11953 81984081993081326611018.0942MESP +2032VIALA DANIEL 11954 71973061991011578112723.0642MSANS +7857MASSEL GILLES MARCEL 11954 81976011995072256617145.4842MTECHN +4251CLINCHAMPS ANITA 21954111977101976101279810668.5342MALLEM +4945COURS ERIC 11955 71988101992044121428006.7742.SANS +1834FUBLAINES BRUNO 11956 91976041995042000715438.5042MSANS +3825KRIMAHER JEAN CLAUDE 11956 91984081992061326611017.8242MSANS +9642MORILLOT CATHERINE 21956 319950419940411389 9851.7942MINFOR +7414DUVEEM FRANCOIS 11956 51988041992011168610047.2742MSANS +8488BOUGAINVILLIERS PATRICIA 21957 31978071977071224010317.3642MSANS +3611COURSEGOUL DOMINIQUE 11957 21984081993011215710278.5342MSANS +5494LABROUSTE AINA 21958 81980011993111471512025.4142MTECHN +9526FLEURY MARIE CLAUDE 21958 319880719890710407 9270.6042MSANS +2858LABBE FRANCK 11958121980111994051450311831.3442MMANAG +3479NOISETIERS MONIQUE 21959 31989011991101249910473.6742MCOMPT +0868ODET CORINNE 21959111989031988031249910471.6542MSANS +3022TORSE PATRICK 11959 31978121993012022115555.8642MSANS +3375ORLAMONDE MICHELE 21959121986091993051450311832.4142MTECHN +5711PASTEUR CHARLOTTE 21959 71980051994011471512024.9242MSANS +1466PERRIERE MAUD 21959101979081993071471512025.7442CSANS +9464ROS ANDRE 119601019900419940110024 8998.4042MSANS +9586TRAVERSIERE ALAIN 11960 11984121993041527112373.3742MINFOR +4466GATTIERE BRUNO 11960 41982081992081215710280.1042MSANS +4368GALIGNES GENEVIEVE 21960 61982091988031326611016.2442MSANS +2690CHERBOURG HENRI 11960 91983111992091326611017.5542MSANS +2470LEPLESSIS JEAN FRANCOIS 11961 31984041994011578112722.3742MSANS +7595GLOIRE MARIE LAURE 21961 519940219920111389 9850.6542MTECHN +1338SCAMARONI PATRICIA 21961111981111980111608112916.9742MANGL +2208PLAINES MICHELLE 21961 21982021981021326611017.4742MSANS +2517REMENIER MARTINE 21961 7199409199309 9126 8457.3642CTECHN +9410BARRELET GENEVIEVE 21961 41983021982021326611016.3542CSANS +2551POLIENAS MARCEL 11962 419870319860310791 9502.4942CCOMPT +7760DANG YVES 11962121982011993091949415051.2742MSANS +2116CEZEROU PHILIPPE 11962 71983051992022529918968.4642CMICRO +8052PECH CHRISTIAN 11962 31986021993091839014314.4942MSANS +0931SALSIBURY ANNE MARIE 21962 31982071981071326611018.0142MSANS +8826SAUCERRE ELODIE 21962 81986041985041288210743.9942CSANS +0716BEAU IRMGARD 21962 5198607198507 9085 8417.9142MANGL +1742VERSEAU MICHELINE 21962 71982111981111527112373.3542MALLEM +8835EXPERT FRANCOISE 21962 11983041982041608112917.0042MALLEM +4580TIGNES GHISLAINE 21962 619921019920711389 9851.6442MINFOR +7561SCIEZ MICHEL 11963 71991111990111467711986.1942MANGL +4437OEILLETS JEAN FRANCOIS 11963 619930219920210024 8999.8142CTECHN +9877LIEUDIT RICHARD 11963 51984101993071527112374.6742MSANS +9511KERNEVEL VINCENT 11963 91985051995101450311831.2142MALLEM +7509TARN ERIC 11963 619890219930110407 9271.8242MANGL +1089BERE CHRISTOPHE ALEXANDRE11963 51985071992011288210745.8442CSANS +7426MONTIGNY CHANTAL 21964 11985021984021527112373.3742MSANS +6738BLOC FRANCOIS 11964 61989071993071381911365.6242MANGL +4323RIAS CHRISTIAN PAUL 11964 91985091990111949415051.8942MALLEM +1244CAMBEIRON JEAN RICHARD 11964 41985051993011693613498.3742MSANS +5905CHISSEAUX HUGUES 11964 119910719920710024 8998.6442MSANS +5258LAMBROSCHINI OLIVIER MAURICE 11964121989051995082256617145.0642MSANS +1452IMAM CHRISTIAN 11964 51993111993011723313653.5142CSANS +6093DEVAUX FARID 11964 91988061994011249910473.0242CSANS +3662MIDI JEAN MICHEL 11964 71985021992091616712994.0842MANGL +6965PENNE ERIC 11964 619850419840410791 9503.7242MSANS +0024FLEURS VALERIE 21965 81986101992121450311832.2042CSANS +3927PARC CORINNE 21965 81993111992011202810240.9542MALLEM +9121NAUSSANNES JEAN FRANCIS 11965 81988051992071616712994.4542MANGL +6670GENIE PIERRE 11965101994051993051420611638.9242MESP +9153DESMOULINS PATRICE 11965 11989111994092401918074.6042MSANS +2680CHOUETTES JEAN LOUIS 11965 519891219921211302 9776.1742CANGL +5006ESPERANCE CORINNE 21966 619940919930411389 9852.3842MCOMPT +9852ADOUE DIDIER 1196611199401199301 7590 7564.3542CSANS +4760MURAT CHRISTOPHE BERNARD 11966 81991041992061381911365.1342MALLEM +4744LESCAR ERIC CLAUDE 11966 31989021988021450311830.8542MSANS +9188HULOT MAURICE 11966 11990021991101249910472.7942MANGL +3718SOU ANDRE 11966111991111994011249910472.9642MANGL +1189GROSSO XAVIER 11966111995081994081868714506.1342CSANS +7659METRA MARYSE 21966 91989051988051450311832.4142MALLEM +1281CRIPE GISELE 21966 91987021986021527112374.7042MSANS +7796AMIRAL ELIANE 21966 21994011992011202810239.9642CSANS +6977NOHANT MONIQUE 21966 91986061990111949415051.2242MSANS +7731VERGERS MARIE GENEVIEVE 21966 219941219930411389 9851.6442CSANS +4652LAFAYETTE MICHELINE 21967 31987061988031450311831.8742MSANS +7993CHILPERIC BRIGITTE 21967 619940519920111389 9851.0742CTECHN +2195VELASQUEZ DENISE 219671219940519920111389 9852.2042MSANS +5536TIFFANY CATHERINE 21967 81988051987051450311832.2042MSANS +9529CLAIREFONTAINE CLAUDINE 21967 81991081992061267210588.8542MSANS +1639VILLENEUVE GUY 11967 41994101993041202810241.8542CANGL +1238BOURBESNEUR DIDIER 11967 41991091990092611219510.6742CSANS +9384CORALLINES PATRICK 11967 31990011993031249910471.9242CSANS +4464PICHI PIERRE 11967 2199507199407 7464 7525.8642CANGL +6931VOL MICHEL 11967 61994051993041360611211.0642CANGL +0488DOREE DOMINIQUE 21967 21991111990111723313653.8442MSANS +0529RELUYEN JOELLE 21967101987101988051467711986.0142MSANS +9178PART CHRISTIAN 11967101993061993091267210588.8942CANGL +8565KENNEDY JOCELYNE 21968 11991011990011381911366.3442CSANS +2088ROUSSEL LILIANE 21968 719930819920811389 9850.8342CSANS +6684BRUN CHRISTIAN 11968 11987051992091839014313.2142CANGL +7111VENIZY JACQUES 11968 519940319930310363 9232.9842MANGL +9217POUTIS ALAIN 11968 21989041995071249910473.5942DMICRO +4714MARINA FREDERIQUE 21968 21988121992011249910471.8942MSANS +8715AULDE BRIGITTE 21968 71994051992011202810240.9142CSANS +9713ESCUDIER PIERRE 11968 61988121993041467711986.5342MTECHN +6341SELLEBIED MICHEL 11968 81988011994011249910473.4242MSANS +8663JASSERON ANDRE 11968 21995081994081450311832.7242CESP +5734ODENAS SYLVIE 21969 81991041990041381911366.0742CESP +2288CENSIER MARTINE DANIELLE 21969 4199408199308 8359 7952.9642CINFOR +4540PERS RENE 11969 71991111990111949415051.9742MANGL +5166VERAN BRUNO 11969 319930719920711389 9852.3642CINFOR +3740CLOSEAUX PHILIPPE 11969 6199312199212 9597 8729.9742CESP +5076BELLONTE JOSIANE 2196910199312199212 7590 7562.4942.SANS +6280MAGENTA LAURENCE ANNE 219691019930519920511389 9852.2442MSANS +4916MONTMERLE NELLY 21969121991101992061330611017.1642MESP +1013SEILLAN MIREILLE 21970101994021993021360611211.0942CALLEM +3949GRUN PATRICK 11970 41993111992111330611017.1942MANGL +0280RICHELIEU ROLAND 11970121991111992061202810241.0942MSANS +7899FRERES CHRISTIANE 21970 71994031992011202810239.8342MESP +5404VIARMES ROBERT 11970 41993051994011202810240.0842MINFOR +6508CALEU FREDERIC 11970101992111991111420611637.7842CSANS +6706VILLEMER GERARD YVES 11970 91992051991051202810240.0142CSANS +9352WAUTHIER CHRISTIANE 21970 919921019911010668 9426.2742MSANS +7483ARAGO REGINE 21970 11993061992101420611637.1242CTECHN +8430BRUEYS ROSELYNE 21970 5199302199202 8359 7952.7942MSANS +2207CAMBEFERRIS MARIE ODILE 21970 919940719930411389 9852.0642MANGL +7014CATHERINE ANNE MARIE 21970 519930519920511389 9851.3442CSANS +2499MONTALEMBERT FRANCOISE 219701119921219911211389 9852.4742MANGL +0607CORBERES ISABELLE REGINE 2197011199511199411 9894 8922.7742MSANS +8631MOUSTERIAN MICHEL 11970 519940619930511389 9852.7242CVENTE +4299PAIX MICHEL 11970 31994011993011420611637.1142MSANS +1722ALBERT GEORGES 11970 71990061992091202810240.8242MSANS +7839LORRAINE DANIEL 11970 81993121992121420611639.2242MTECHN +2390VENISE JEROME 11970 6199406199306 9597 8728.5342CSANS +4622BOUTON SERGE 11970 71992111991111420611638.5042MALLEM +8468MONTALEIGNE FRANCK 11970 61993031992031420611637.8042CSANS +4926LEZARDIERE JEAN CHRISTIAN 11970 819930119920111389 9852.3842MSANS +0318MISSIONNAI FRANCOIS 11970101994021993021420611639.2442MSANS +2478CENAC ANNE MARIE 21971 11992071991071420611637.4442MESP +9531FLEURIES PATRICIA ODILE 21971 6199612199512 9894 8921.9442CSANS +2370ARTOIS MARIE MADELEINE 21971 919930219920211389 9851.2442CSANS +9824CLAOU JANINE 219711019941019931010668 9425.7342CANGL +0436BUISSON JOELLE 21971 519950119940110668 9426.4142CSANS +6968RABELAIS CHANTAL 21971 619951219940110668 9426.3242CSANS +6232CASE CHRISTIANE 21971 61994051993051267210588.8542MANGL +5473GERANIUMS JEAN 11971 11990051994011249910472.9242CSANS +1033ISLE JEAN PIERRE 11971 51992081994011249910473.6342CTECHN +6691MONTAGN PIERRE 11971 91991091994011249910472.5942CSANS +3613TRONGET FREDERIC 11971 219940419940110363 9232.4642MSANS +5033GENELLES PASCAL 11971 81991121993061330611018.0142CSANS +5241KENNEDY PHILIPPE ANDRE 11971 219930619920611389 9850.5642CSANS +2276MESANGES JEAN PIERRE 11971 11991081991091202810241.0342MCOMPT +4273HOLLYWOOD THOMAS 11971 41993021992021420611639.1042MANGL +9172PITCHOUM JEAN CLAUDE 11971 119921019930410876 9502.9942CSANS +2512GACHE JEAN CLAUDE 11971 81994091994011202810240.6442CSANS +4896CHILHAC GUY 11971 219930119920111389 9850.7642CANGL +3539MAS JEAN FRANCOIS 11971101992071991071420611637.6042CSANS +4359GAULLE LOIC 11971 419930219920211389 9852.0542CSANS +0794SOCLATE ALAIN 11972101994051993041360611211.0542CSANS +6685CONSOLAT JEAN PAUL 1197211199503199304 9597 8729.5842CSANS +3658BACON STEPHEN 119721119930219920210363 9231.8642MSANS +5829RAINIER YVES HENRI 119721219930119920110363 9231.9642MTECHN +5038ROSE JOCELYN 11972 41994011993011420611638.5042CTECHN +1479NOEL JEAN PIERRE 11972 219931119921111389 9850.8342CSANS +3997RICARD SYLVAIN 11972 61992051991051420611637.5642CANGL +6600LOUP KAZUKO 21972 519931019920811389 9852.2042CSANS +9876VOUZON CHRISTINE 21972 11993101992101723313654.7242CINFOR +2373RAPAILLOU THIERRY 11972101992121994011202810240.0542CSANS +1153RIBERA FRANCOIS 11972 3199406199306 7590 7563.9942CANGL +0976AIR FREDERIC 119721119940219930211389 9850.6242MSANS +1075COLOMBIER JACK 11972 6199401199301 7590 7562.5442CINFOR +3036SOISSONS THIERRY 11972 71992021991091420611637.7442CSANS +7541HIER MONIQUE 21972 11993101994111288210743.9942CSANS +8819RHIN JOSIANNE 2197212199407199307 7803 7679.9442CANGL +4699LENTISQUES FLORENCE 21972 6199501199401 9894 8923.2942CSANS +5011CIGOGNES MARIE FRANCOISE 21972 3199605199505 7803 7681.0242CSANS +7216FARRERE CHRISTIANE 2197212199408199308 8359 7953.2942CSANS +9971SALVADOR REMY 119731219951219941210668 9425.9942CSANS +6878BIGUET YVES 119731219940219930210668 9425.5842CANGL +9980LACHAMP CHANTAL 2197312199306199206 8359 7953.7242MSANS +3279ROITELET CHRISTINE 21973 819941219930411389 9851.8742CESP +9903PROVENCE VINCIANNE 21973 2199411199311 8359 7953.6342CVENTE +6941MAT SYLVIE 21973 919930719920711389 9850.7042CMARKT +2424PLAINE ELIZABETH 21973 419950419940110668 9427.4942MANGL +4221SOLOGNE ERIC 11973 619940619930610668 9427.2442CTECHN +8519ERABLES DANIELLE 21973 419931019921011389 9852.6742MANGL +7323SAUME ISABELLE ANNE 21973 919950319940310668 9426.6242CANGL +2143CUQUES HELENE 21973 6199612199512 9894 8922.0042MESP +5163SOULELHAT CORINNE THERESE 21973 9199407199307 8359 7953.0642CANGL +9032PETILLAT PIERRE 11973 41992091994011249910471.7442CSANS +9059DARONNE JACQUES 11973 419940619930610668 9426.4142CANGL +6626DEVESSOUS JEAN CHARLES 11973 91994071993071206910241.5842CSANS +7108BUISSONNETS HENRI 11973 419930419920711389 9851.6142CSANS +0443FONTAINE YAN 11973 9199406199306 7464 7524.2142CESP +3078CHARBONNIERE JEAN PIERRE 119741019931019920711389 9852.2942CSANS +5301REYNAL JEAN LUC 11974 6199401199212 9597 8729.6742MINFOR +7425RAFFAELLI PHILIPPE 11974 319940719940111389 9851.8842MINFOR +9638SYLPHES PAUL 1197410199407199307 9894 8922.5742CMICRO +9287ROSSAYS MARIE CHRISTINE 219741019960419950411389 9851.3443MANGL +9554PILGRIMS JEAN PIERRE 11974 219931219921111389 9852.0242MSANS +0960BOCAGE JACQUES 11974121993091994011202810240.9442CSANS +7246PEYRIERE MARIE CARMEN 21974 419940719930710668 9426.2242CANGL +3039COMBRAY MARC 11975 4199607199507 7803 7680.7542CSANS +5779SAENS ANNIE 2197510199608199508 7803 7680.8942CANGL +8044FERRY ROSINE 21975 9199507199407 7803 7679.8742CCOMPT +0191KER MARIE HELENE 21975 3199611199511 9256 8533.0242MSANS +6974MANCINI JEANNINE 2197511199408199308 7803 7679.7642CANGL +0518VICTOIRE PATRICIA 21975 3199608199508 7803 7680.8042CSANS +1262TRAUD JACQUES 11975 819940519930510668 9425.9642CMARKT +7772MOZART SOLANGE THERESE 2197610199608199508 7803 7679.4142CALLEM +9670GRESSETS LAUREEN 21977 8199607199507 7803 7681.0442CSANS +8996ADRET CELINE 21977 3199608199508 7803 7680.6242CANGL +3676MENEZ MARC MAXIMILIEN 11933 91966071994011932314935.3843MALLEM +9549BOURGOGNE ANNICK 21936 41968051991102137316331.4643MSANS +9677BROQUERIE CLAUDY 219381219780719910611131 9658.3743VSANS +4456LAC PATRICIA 21938 81962041985062470018542.2243MANGL +6693FENELON VALERIE 21939 61959121986012273717261.0743MTECHN +0887NASTRINGUES BERNARD 11939 81962091992032137316331.2443MESP +7338AMBROISE RENE 11940 91968041995011557012566.9943MSANS +0858TURNEGOUET DIDIER 11942 71982011993011249910473.0043MSANS +8537VERT PATRICK 11942 61976121993011578112722.9343MSANS +3521HOUEL PATRICK 11942111970091995011557012568.2243MSANS +2105ROCAL JEANINE 21944 51970071991071578112723.3343MANGL +6696PLAIDEURS JEAN PIERRE 11945 91972121990011403411520.4243MANGL +1309BELLE MARIE MARTINE 21945 31965011988042470018541.9743MSANS +9127PENFOULIC EMMANUEL 11946 5198901198801 9894 8921.9943MESP +2831CHAMAS MIREILLE 21947 21969031993031834514274.8443MINFOR +1888BONJOUR GUY 11947 91980101993101471512024.6243MANGL +1642POURTEL FRANCOISE 21948121974111994041471512026.1543MANGL +5118QUINTANA NADINE 21948 6199406199304 9126 8457.3343MSANS +7220LANDON JACQUELINE 21948 91970071994092529918967.9843CSANS +5846ROI PATRICIA 21948 11971051991102043315669.5743MINFOR +6443JUIN DAVID 11948 11975061991012137316331.7043MSANS +1072BELLY THIERRY 11949 91979041992011249910472.6143MANGL +3513GAMA VALERIA 21949121969021990071578112722.3343MANGL +8936MARGUERITE MICHELE 21951 41973021993012017815516.0843MSANS +9731GILLES NICOLE 21951 319961119951110668 9426.2743MSANS +3374ROBESPIERRE CORINE 21952121973021991012781920675.1943MSANS +9500EDELWEISS GERARD 11952 21978011992111684813422.4443MANGL +9602PARADOU MICHELE 21952 51975051981091684813422.6843MSANS +4313BERNEDE AGNES 21954111975041991071578112723.7243MANGL +9347LAUZES MICHELE FRANCOISE 21956 91978061992051471512025.7043MANGL +9922BELLA MARIE THERESE 21956 61982041981041326611018.1043MINFOR +9508ROBERT PATRICIA 21957121979071994121911114778.0643MSANS +9342GALLERANDS PAULETTE 21957 419950219930411389 9850.7043MTECHN +8765ELANCOURT BERNARD 11957 71980081993061369311286.1743MSANS +8497RIBOT JOELLE JACQUELINE 21957 21977071992121527112373.0443MSANS +6373RENE CLAUDINE 21958121978041992021471512024.3543MANGL +1513FRANLAINE BLANDINE 21958 91984101985041527112373.9543MSANS +1684CHALEIL MICHELINE 21958 31978061993101471512025.3243MANGL +2983LAVIE JACQUES 11959111988031994011249910471.9743LALLEM +3412CORTIJO AGNES 21959 31983011982011608112915.7843MSANS +4467VADEL JEAN MARIE 11959 51991041994011202810241.3943MSANS +9453CAVILLON MAURICE 11960 61985111992071288210744.4643MALLEM +7623MALESHERBES BRUNO 11961 81984081991061326611016.7443MTECHN +1600BLANCHES MARIE CHARLOTTE 21961121990031993061249910472.0143MALLEM +7714POMMIERS VALERIE 21962 41993081992011249910471.6143MESP +7193CAMBARRAS PHILIPPE 119621119930119920110876 9503.2743MALLEM +0639TANQUEUX FREDERIQUE 21962 61982081989112090215980.8243CSANS +8276LACROIX DIDIER 11962 61991101993041467711986.8943MSANS +5057CINO GERARD 11963 61983111995091693613498.3143MINFOR +0238SARRAZINE MARC 11963 619941119931010363 9233.5743MSANS +7129NIVERT THIERRY MICHEL 11963 519910419940111302 9775.7943MSANS +8602PYRENEES DANIELLE 21964121993091992011202810240.5943DESP +6662PUERTO SYLVIE 21964121985101984101249910473.5643MSANS +7625SCHWEITZER LAURENCE 21964111991091990091202810240.4643DANGL +7052CARREAUX SYLVIE 21964 61985021984021288210744.6743MALLEM +9218SALIS ARMELLE 21965 3198801198601 8656 8146.6143.SANS +3260JABLINES JEAN JACQUES 11965 41990091995092256617145.3043MSANS +9721LAVOIR YVES 11965 619930119921011389 9852.1443DALLEM +3429CAM BERNARD 11965 61987021993051839014313.5743MSANS +1856FLAUBERT PASCAL 11965101985061994111693613498.5543MSANS +0790JARDIN SERGE 11966101987091992101539912453.0643MSANS +2445VIESCAMPS YANNICK 11966 11991111991101381911365.5343MSANS +5684SARRASIN PATRICK 11966 51994101993101267210589.3943CSANS +4794DIAZ PHILIPPE PIERRE 11966 21987111993111693613499.4543MSANS +5479THIREUIL GILLES 11966 31992041992011202810241.0343CSANS +6199HELEN MARTIAL 11967 91987081995011373711326.7043MSANS +9298FOUQUET RAYMOND 11967 419960619950611389 9852.2943DINFOR +7535COURTELINE PHILIPPE 11967 11991021994011249910471.6143MTECHN +4595PANSEROT JEAN JACQUES 11967121989091989061539912452.5143MINFOR +4584SANGUI PHILIPPE 11968 219950119950110363 9231.9543MSANS +1356BERTIN MARYVONNE 21968 41993061992061267210589.6943MMICRO +3761GARD HENRI 11968101989071993091723313654.6543MSANS +6649GUILLAUMET LAURENCE 21968 71994021992011202810240.3543CSANS +2548LYCEE ALAIN 11968 51993121994011202810240.1743CSANS +0307ABBAYE ANNICK 21968 919920919910911389 9850.7443MSANS +0524PEYRILLES YOLANDE 21969 119940719930411389 9852.5943MSANS +3086FABRE JEAN YVES 11969 71989121994041249910473.2443MSANS +2273BREUIL SERGE 11970 719891119920811302 9774.3843MALLEM +5532NIRVANA FRANCIS 11970 419920219920810876 9502.1443MTECHN +0282TOURISSE BERNARD 11970 41994081993081360611211.4743CANGL +8554BOUVIER OLIVIER 11970 81993061992061267210590.5443CANGL +3126PONTAROUX JOCELYNE 21970 619930619930411389 9851.1943MSANS +0208ENCLOS DIDIER 11970 219941019950110363 9233.5443CSANS +5629VENEUX JEAN 11970 319930919920911389 9851.7443CINFOR +9569CASCADES MARYVONNE 21970 91991101990101202810239.7843CSANS +4663DAUBERIE DOMINIQUE 21970 919941019930411389 9851.1543MSANS +3912FOURNAS MARIE 21970 119930819920711389 9850.8343CTECHN +2317CALDANA ODILE 219711019940519920111389 9850.7943MANGL +4841MARIDOR CLAUDIA 21971 4198907199101 8656 8146.1643.SANS +3038FERRARI FRANCOISE 21971 2199206199106 7803 7681.2543.ANGL +3547KERA MICHEL 11971101994101993101360611209.9243CSANS +8801ORRES JEAN JACQUES 11972 91994061993061420611638.1043CINFOR +8995CRUCITA PHILIPPE 11972 11993041994011249910472.5743CINFOR +1636NORVIL BERNARD 119721119930919920911389 9850.9243CSANS +7758AURES JACK 11972 5199309199209 9597 8728.6443CSANS +9063SATIE OLIVIER 11972111994061993061420611639.0643CSANS +9116BREVIAIRES LAURENCE 21972 119930419920411389 9852.3343CINFOR +3743SORALY ALAIN 11972 4199407199307 9126 8455.8443CANGL +9641ASTARAC CATHERINE MONIQUE 219721019940619920111389 9851.6943CALLEM +1350RAMBUTEAU RENEE 21972 61993091992091360611209.6543CSANS +0615ROBERT REMI 11973 51994011993071267210589.9343CTECHN +2872KERPETIT ALAIN 11973121994041993041420611637.8043CSANS +9594BENEDICTINES JACQUES 119731219931119921111389 9851.1543LSANS +5147TERRESROUGES DIDIER 119731119930319930311389 9852.2443CSANS +3464CASTERAN EVELYNE 21973 519950219940210668 9426.1843MSANS +1330INFERIEUR CHRISTIAN 1197411199607199507 7803 7680.0543CSANS +0129DEGANNE WILLIAM 11974 91994071993071206910241.9743CMARKT +9626STENDHAL CLAUDE 11974 51994081994121202810240.0543CSANS +8520COUPERIN JEAN 119741119940519930510668 9425.5843CSANS +7404PERGOLESE RICHARD 11974 31994051993041360611211.5143CANGL +2352ECLUSE BEATRICE 2197411199608199508 7803 7680.6243CCOMPT +6779PERRONET PASCAL 11974 91994061993061360611210.9143CANGL +9456REVOIRS MARC 1197512199507199407 7803 7680.9943CINFOR +9467CONCORDE CLAUDE 11975 919941019931010668 9427.4443CSANS +7348GENOUILLY FREDERIQUE 21975 7199407199307 7803 7680.4443CANGL +8390CEILA DOMINIQUE 11975 9199409199309 9894 8922.7243CSANS +3308BOULANGER RENE 11975 6199410199310 9894 8922.0043CALLEM +8061DENFERT VALERIE FRANCOISE 21975 11995041994041206910241.1243MSANS +9867ROCHOPT MARIE PIERRE 21976 8199609199509 7803 7680.2343CCOMPT +0466MIMOSAS CHRISTIAN 11976 1199408199308 7803 7679.3143CSANS +6069BATIGNOLLES MARTINE 2197710199608199508 7803 7679.2843CSANS +7049CRENON DANIEL 11947 81973041994011621213032.3044MSANS +1304PERI VERONIQUE 2194912199310199210 9597 8729.0944MSANS +3258DARMONT VERONIQUE 21961 21986061992021168610047.0344MSANS +1840COQUART LUCILE 21964 41984101993051381911365.0544MANGL +2897PERCHE ALAIN 11967101990061995011318010939.1344LSANS +6181BIZET MIYUKI 21968 2199302199202 9597 8727.9944MSANS +6750EDGAR HERVE 11971 21992011991011202810240.5844LSANS +0175MARQUIS COLETTE 21974 5199606199506 7803 7680.2744CSANS +1275FRIGOULET YVES 1197410199506199406 9894 8921.6944CSANS +8305BEZENAC FRANCOISE 21953 2199404199304 9126 8455.7045MSANS +4858DUPLEIX MARC RENE 11954111978121982102470018541.8845MANGL +6314ABERDEN EVELYNE 21958 61979111978111684813423.0845MSANS +0464PETIGNONS DOMINIQUE 11961 91984061993031527112374.9745MSANS +3847GUICHARD PHILIPPE 11961 11983081988112090215980.9745MTECHN +8173HOPITAL ANSENIA 21964 319950419940110668 9425.3645MSANS +4339VILLE DOMINIQUE 11971 91994111993111267210589.1245CSANS +1142SPITALIERI FREDERIC 11933111953121993014121428007.2246MALLEM +6086SOEUR JEAN JACQUES 11935 91955061991053417325097.9646MSANS +0246OREE PATRICK 11937 71965101986012470018541.1946MANGL +7398MOUNET CLAUDE 11937 919960119950510024 8999.3946MSANS +2438VISITATION CLAUDE 11938 31964111986012470018542.2446MSANS +3413ETIENNE JEAN MARIE 11940121969051986072470018541.1146MSANS +9044GUEN PAUL 11941 11973051993011518612335.2846MINFOR +4544MONEGLIA ABDELKAD 11941121965101989072947921838.8046MINFOR +5661BELLON PHILIPPE 11943 91965111994013200223584.4346MSANS +4296VENDARGUES YVES 11943 31964111991012273717260.1446MSANS +2281TRIMARAN OLIVIER 11944 81973051990011403411521.4646MINFOR +9015IRIS YVES 11945121973011990011403411522.1346MESP +7856BELLEVILLE GERARD 11946 31965101986012470018540.2946MSANS +9041SADI PIERRE 11946 61977121995062000715437.9146CINFOR +2976BLANQUI GIANCARLO 11946 51968091986072273717261.9446DSANS +4370GROUPE PHILIPPE 11947 21974071990011403411522.0946MTECHN +7697SEYSSINS BERNARD 11948 51968071991012470018541.8646MALLEM +9305SEINE GUY 11949 91970041987012273717259.9046MANGL +5926BOILEAU BERNARD 11951 61972051989012273717261.9046MALLEM +3592PETIT GILLES 11951101974011995032547019085.7046MANGL +7590PLAYA JEAN YVES 11954101977091982102470018541.4746MSANS +8144DARIE JEAN PIERRE 11954 21995011994011420611638.9246MSANS +8637GUILDFORD PHILIPPE 11955 21974061995082547019085.8646MINFOR +7809CEYRESTE FRANCIS 11955 31975021993081608112916.2546MSANS +9226MONDONVILLE MICHEL 11956 51979011992011471512025.1146MTECHN +8675BLANCHISSEURS ANNIE 21958 11979071993041471512024.3346MSANS +0338BARBUSSE ROSELYNE 21958 1198902199209 9597 8729.2546MSANS +4849SANZILLON MARIE NOELLE 21958 81979101978101288210743.8346MSANS +7791PRA BRIGITTE 21958 81981041980041684813422.0846MSANS +3255LENOTRE BERTRAND MARIE 11959 81980111991012022115555.6246MESP +3148EOLIENNE GUILLAUME 11959 11983031991011868714507.9446MSANS +1942CAUSSES MICHEL 11960121987081991061288210745.4746MSANS +8983RAYMOND JEAN LOUIS 11961 11985031991011868714506.7246MSANS +5296BRETAGNE PHILIPPE 11961 41983081991011868714507.7246MSANS +0323QUONIAM GILLES 11961121983051993091450311831.5746MSANS +3231MOULIN HUGUES MARIE 11961111985091995011373711328.2246CSANS +9926PIN PATRICIA 21962 41984051983051288210745.7546MSANS +0400HARAS PHILIPPE 1196312199407199411 9597 8728.1746MANGL +8313ROUILLAC BERNARD 11964 31991021991022529918968.4746MSANS +1947CORNEILLE DOMINIQUE 11965111987021994091693613499.4346MANGL +1364KERSAUX JACQUES 11965 41987091986092090215981.4746CANGL +4571CAILLOU ERIC 11965 91985041992071616712995.9946CSANS +5043BAC MONIQUE 21965 61988081987081539912452.4646CSANS +5037CALLE PHILIPPE ROGER 11966 81994091993091839014312.4546LSANS +3072PONTHION ALAIN 11966 21990091989091467711987.1346MANGL +3441ARMAINVILLIERS YANNICK 11966 11987021994091693613498.8546MANGL +2298PLESSIER ANNE MARIE 21967 2199004199111 8656 8146.6146.ANGL +3281ALBAN ELIANE 21967 21986111992011288210744.0846MSANS +1984ROCH GERARD 11968111992031992041467711986.7246MSANS +6981TROQUEREAU JEAN JACQUES 11968 91992081991081467711986.2646MALLEM +4384LAMORLAYE MICHELE 21968 31993121992011202810240.1746MSANS +4391JUGE BERTRAND 11969101992091993072397418036.9346MSANS +4122CAULAINCOURT YVES 11969101988081987081539912452.1646MINFOR +5356LACAPELLE ALAIN 119691119930419920411389 9852.0246MTECHN +8278CHANTEMERLE GERARD 11969 919920619940710876 9503.4546MSANS +2596DESSUS GUILLAUME 11969 11991091990091467711986.4946MSANS +7596MEYERBEER EDOUARD 11970 11992111992111330611018.1046CMARKT +5724HOCQUETTES AUDE 21971 31991071990071467711986.3146MSANS +1372AUBEPINS CHRISTIAN 11971 21994101993101360611209.8846MALLEM +8783BAUDOIN JEAN FRANCOIS 11971121993081994011202810240.4146CSANS +3416MIREFLEURS NORIKO 21972121994021993021360611211.5646MCOMPT +0948TIERRAINE MARC CAMILLE 11972 319930719920711389 9851.5946MTECHN +0904FOUGERES JEAN MARIE 11972 919920119920311389 9850.8946CTECHN +4010QUARTRAVEL CATHERINE 2197211199501199401 9894 8921.7246MSANS +1528FARMINGTON RENEE 21973 119940419940111389 9851.0346MSANS +8402TREZEE GILLES 11973 919930719920711389 9850.8846CSANS +7279CORNE GUY 11973 71994011993011360611210.3746CSANS +0232PIN JEAN CLAUDE 11973 519960619940110668 9425.4546CTECHN +9635MAGALI CHRISTIAN 11974 4199607199507 8656 8147.2246CALLEM +7035ANGLAS LUCIENNE 21932 21963011988102273717260.1448VSANS +7818HERZOG DOMINIQUE 21937121972101993041557012567.0848DSANS +6478MAREYE JEAN PHILIPPE 11940 21959101983102273717260.8048MSANS +1661VAN EDITH 21940 81974091990012137316330.9748MSANS +1597MATRAT CATHERINE 21940 61967071992121834514275.5948MTECHN +1046MAUNY JEAN CHRISTOPHE 11941 81979021994011471512025.4748MSANS +8249FILLES MICHEL 11942 51962081993093417325097.1948MSANS +0711PICCINI JEAN JACQUES 11943 81963041995072470018542.0048MSANS +0378HALLIERS JEAN PHILIPPE 11943 3199501199401 9597 8729.3648CALLEM +9597VOLTE MARIE THERESE 21946 71968041990012273717260.9448MCOMPT +4768PICAUD BRIGITTE 21947101973101995102043315670.9248DSANS +0554ROLAND ANNE 219471019920719910710024 8998.7748DSANS +3349SERRE PIERRE MARC 11948 61969021991012470018542.1048MALLEM +3355KURFURSTEN PAULE MARIE ODILE 21948 7199501199301 8656 8145.6648MSANS +6449IRUENA DOMINIQUE 11949 71969031990051932314934.2748MESP +3922LAVERSINE YVES 11949 81975101986103634926571.4148CSANS +7286JOUVENET HENRI 11951121981021994011621213032.6548MANGL +2199CABOTS CHRISTIAN 11953121988121995011373711326.7148MINFOR +8300CHARPENTIER CHANTAL 21955 61992011993041249910472.4148MSANS +2397FAMILIAL JANY 11955 61982101994041471512024.3348MANGL +9021BIED CLAUDE 11957 51980061992111911114779.6848MSANS +4703COZ JEAN 11957 41979081993121911114779.7748MSANS +3297STALINGRAD BERTRAND 11959 31981081992102090215980.9748MANGL +2319FRANCOEUR HENRI FELIX 11959 11980081993121804514081.0148MSANS +8833MONTLHERY ELIANE 21960111983041989041527112373.6848MANGL +1084MAGNARD JEAN PIERRE 11960 91984021992012022115556.0248MSANS +4562HAUTE ANNIE 21961 61984061983061249910472.8748MTECHN +4907FRANC BERTRAND 11964 21984081986072090215980.5648CSANS +2492ETANG PASCAL VINCENT 11968121990111989111467711986.6248MANGL +3754RAOUL FRANCOISE 21968 91994031993091450311831.8448MTECHN +7902CELARD BERNARD 11969 31990041989041467711987.9048MANGL +0316FLORENTIN TYRONE 11969111989081989021450311832.4148MANGL +1981DEPARTEMENTALE PIERRE 11970111993041992041420611639.0148CSANS +4735BEL SKEVOS 11970 61991021994011249910473.5448MSANS +0999CONNE DENIS 11971101993041992041420611638.8848CSANS +3832BEACH SERGE 11973 41994121994011202810241.1248MTECHN +4697PURPAN FRANCK 11935 51976041994011578112723.1550MTECHN +1565NEMOURS ANDRE BERTIN 11939101967071990091932314934.3150MANGL +8977MAHATMA HERVE 11942 41981051994011621213032.0650MANGL +8738ZILINA JEAN LOUIS 11942101980061990031249910473.4750MTECHN +6415ECUREUILS ERIC WILLIAM 11942 61969081994011932314934.7050MSANS +9332FRIRION GEORGES 11945 5199409199309 9597 8729.4950MSANS +5001YVES PHILIPPE 11945 41975111988071578112722.8750MSANS +2290ENSOLEIADO JEAN MICHEL 11946 21988051994011288210745.5250MSANS +8492LAGRIVE LAURENT 11947 81982011993011369311287.2950MANGL +3609GUESDE ERIC 11949 11989061992031249910472.1950MSANS +8482TOUT ANDRE 11949 71980041995011621213034.2250MANGL +8866PERCENEIGE PASCAL 11950 41976071995011578112723.7450MSANS +3195VIVE CLAUDE 11950 21981081995011621213032.2050MSANS +2538AICARD SABINE 21954121976061993031608112915.5150MTECHN +5185LUTHEZIEU PATRICK 11955 51988021994011288210744.2650MANGL +3135EDER DIDIER 11957 819880119930310791 9502.9150MTECHN +9006MAURETTES JACQUES 11958 11985041993011369311286.6950MINFOR +8049COLLIERES CHANTAL 21961 11984031983031288210745.2250MTECHN +8766TERROIR GILLES 11963101987121989091450311832.4150CALLEM +2924LAC BRUNO 11963121989051988052090215981.1450MSANS +5549DUMONT MICHEL 11964 51988051991081450311832.4250MALLEM +8382MONSEIGNEUR CHRISTIAN 11964111992011994011249910471.8950MSANS +8129STATION BRUNO 11966 41994051993051202810239.8750MANGL +3420EMERIAU JOSE 1196711199306199206 9597 8729.8450MANGL +9831CLAMOUR YVES 11967 819950919940910668 9427.4950MANGL +9072MENDON GUY 11968 1199605199505 8656 8146.8850MSANS +4669FAURE ERIC 11968 3199505199405 9126 8455.8850CTECHN +4319MOURISCOT PATRICK 11970 9199306199206 9597 8729.2750LSANS +1731FRANKLIN MICHEL 11970 4199401199301 9597 8729.4050CSANS +0510PILOT DANIEL 11972 519961219951211389 9851.5250CSANS +5973LECLERC MAURICE 11974 3199606199506 8656 8146.3750CSANS +9358MONBEL HENRI 11933 91959031993011557012567.1251MVENTE +7641BRETONNE CHANTAL 21936 51962081990012273717260.9451CSANS +7048CASTELNAU LAURENCE 21937 91962031991042273717259.7851CMICRO +5481PASCAL GILLES EMILE 11937101958051979013327724476.1651MSANS +6723SARRAZA FRANCOIS 11938 21962031989082572519240.3551MSANS +6355REPOS JEAN MARC 11938 41960011980013327724476.5251MSANS +1644ACARDIE BEATE 21939 31963091991072273717260.2251CTECHN +5030LOGELBACH ASTRIDE 21940 11962031991042137316332.4551MVENTE +5298GARDE MARIE FRANCE 21940 91969011989011621213034.1951MALLEM +6400SIONIE CATHERINE 21941 3196206196106 4894 6128.0051MTECHN +5537CAPEOU LUCE 21942 519931219920110024 8999.7951DINFOR +7143DEO NOBUKO 21942 41969091991102137316331.9751MSANS +9555CAMBRONNE DANIELE 21943111962051984122572519240.2851CSANS +3792EAUX JEAN 11944 81966031995072137316330.9751MSANS +6932PAULIN ISABELLE 21945 41972041989011621213033.2851MALLEM +1308CHRISTOL MARTINE 21945111968121993061834514274.8451MSANS +2877DANIELLE GERARD 11946111970051992011471512025.1151MSANS +5367ILE FRANCOISE 2194712199010198910 8656 8146.1451.SANS +3253VERG BIRGIT AGNES 21948101969071985042470018540.3951DANGL +5806FRED CATHERINE 21948 41968041990042572519239.8251MANGL +6174BANQUIER CATHERINE 21950111971061989011621213033.7051MSANS +8732FOUNSUT PIERRE ANDRE 11950 11978071995041249910472.1051MCOMPT +4803ALASSEUR AGNES 21950 71974051992091471512026.1051MSANS +9024CHATARDS CAROLINE SOPHIE 21951 31972081987052334017609.4651MALLEM +1259SOUFFLOT FRANCOISE 21952 81981011983091326611017.2551CSANS +7009PARADIS LUDWIKA 21952 71974011973011215710279.1951MSANS +9186LESPIAT EVELYNE 21952111973041990101578112722.1551MSANS +6834FLEMING JOCELYNE 21953 41973021993012017815517.2851MMARKT +5164BEAUVILLAGE COLETTE 21953 91986081985081684813421.4051MSANS +4947ESCALUS CHANTAL 21954 219810519800510024 8998.4151MSANS +8461MARGUERITES CATHERINE 21955111976061994051471512025.0151DSANS +5391FOURCAULT ANITA 21956 61978061992091471512024.4451MSANS +2777ALMUNECAR CHRISTINE 21958 41993071992011249910471.6251MINFOR +9747DROPT MONIQUE 21958 31979031993041471512024.0851MANGL +2758CRAYS KIM LEE TAMARA 21959 11992031991011202810240.1951MSANS +8238SERGENT ISABELLE 21959111983061982061326611016.0351CSANS +4402DIVISION SABINE 21959 71979101993071471512025.1651MALLEM +1231FACE HUBERT 11959 319950319940111389 9852.6751LTECHN +3907ESBLY GUNDA 21960 81980071979071288210745.3451MANGL +4821TAMEYE MERCEDES 21960 119820919810910668 9426.6651MANGL +1175CRESY CHRISTIANE 21961 21990111989111249910471.6651SSANS +6825FEUILLES DENISE 21961 51982051981051326611016.0651MANGL +5368FLANDRE SUZANNE 21962 71983111982111249910472.3351MANGL +0947LORRAINS CHRISTINE 21962101985041984041288210745.1651MALLEM +5318CLAMART ANNE 21962 51982081981081326611018.0051MSANS +8693FILLIETTE JEANNINE 21962 31982091981091194310201.7051MANGL +5069GRAVELLE ILSE BERTI 21962 81992061991011202810241.9051CSANS +5908VERTS CATHERINE MARIE 21962121984111983111608112915.9651MSANS +3068DUNKERQUE ELIANE 21962 31986101985101202810240.4051MSANS +5894CARESTIER MARYSE 21963 41985091984091288210745.1351MALLEM +1739HILARION LAURENCE 21963 61982091981091497412179.3651MSANS +8326MASSAY MARTINE 21963 41984091983091608112915.6951CANGL +6923GUYONNE NATHALIE 21963 81983101982101608112915.7551CVENTE +3533SAVIGNAC SERGE 11963 319890319880310407 9271.2351MSANS +9590GARIBALDI FLORENCE 21963 519940619920111389 9852.0051CANGL +5287HORIZONS MARIE ODILE 21963 21983021982021249910471.5651MSANS +9152PARRERE PHILIPPE ANDRE 11963 61992021991021381911366.2151CSANS +4730CROISETTE MARC 11963 61987111992012529918968.2051MANGL +7896LONGUE MARTINE 21964 91986041985041288210745.7251MSANS +0156CHTANOU YVES 11964 71993011992011839014314.0851MANGL +3013CELLIER REGINE SYLVIANE 21964 719870619860610668 9426.4151MANGL +1040HAUTI MARTINE 21964 11984101983101288210745.3951MINFOR +0730COURBET CHRISTINE 21964101984101983101202810241.7051MSANS +2393ROTONDE ELISABETH 21964 71984071983071202810241.8451MANGL +6940LELIEVRE RYOKO 21964 21985051984051527112373.2351CSANS +5571MARCEAUX ANDREE 21965 31993091992011202810240.2251MSANS +9937MANDARINE GHISLAINE 21965 11994031992011202810240.9151MANGL +6185HERMITTE FRANCOIS 11965 91990051989051949415051.5051CSANS +5405ARTZAMENDI MICHELE 21965 71989081988111949415050.6751MANGL +4260MIROMESNIL MARTINE 21965 71988031987031450311830.5351CSANS +9396BARBUSSE MICHELLE 21966 91986061993011839014313.0951MSANS +8592PLANTIERS MARTINE 21966 71994031993031267210589.5751CSANS +6905HAVRE PATRICK 11967 61988111987112090215981.2251MSANS +0499BEAUMARCHES JEAN PIERRE 11967111990021994051839014313.9551MSANS +9812PECHERIE FLORENCE 21967 219940419920111389 9852.2251CESP +6177RIQUET JANINE 21968 51994031993031267210589.6651CTECHN +1459FRANCE ANNE MARIE 21968 21988091993011381911366.4951CTECHN +9340EPINE RENAUD 11969 11994081993081206910239.8651MSANS +7293OBERKAMPF JEAN JACQUES 11969 81989041993041249910471.7051CCOMPT +0852GUERARD MARIE SOPHIE 2196911199308199208 9894 8923.1651MESP +8275DELZONS MICHELE 219691119930319920311389 9852.7251CALLEM +5873MARCHE MARIE LAURENCE CHRIS2197011199205199105 9597 8729.3051MSANS +8465BERNASSE ISABELLE 219701119920319910311389 9852.6551MANGL +2444BOUGNON MARIE JEANNE 21970 81993111992111267210590.7451CSANS +3440BAZOCHES MICHELE 21970111993101995041206910240.4151MSANS +2864GOAS SERGE 11970 51992101993081267210590.4151CESP +5499CLOHARS GERARD 11970 819900819890810024 8998.8451CSANS +6120MARVIVO EVELYNE 21971 519950219940210668 9426.5351MSANS +5419BEZANLEU CATHERINE 21971 51994031993031267210590.2951MTECHN +0309TUILERIE SOPHIE 21971 21994051993051267210590.6951CSANS +6131CAGNES NICOLE 21971 519940619930610668 9426.5351CCOMPT +8518VILLOUE JOELLE 21971 61992041993051267210590.0951CSANS +8453JONCHERE DOMINIQUE 11971 319940619920110024 8998.7651MSANS +5604NEUILLY AGNES 21972 119920419910410668 9425.8151MSANS +7047ALOUETTES MARIE ANDREE 21972 419920119910111389 9850.9451CSANS +5306BOPENIAN MONIQUE 219721019920919910911389 9851.9151MSANS +9169FLEURIS LILIANE 21972 71993121992121267210588.9251CANGL +8308BUZENVAL VERONIQUE THERESE 21972 5199607199507 7803 7679.4151CALLEM +1210NAUGAIRE MARIE ANTOINETTE 21973 61993081993091267210589.5252MSANS +5105HUGO CATHERINE 2197311199607199507 9894 8921.4651CANGL +3726LIVRYS BRIGITTE 21973121995071995051288210745.4751CSANS +5859MUZY PASCALE 21973 619930719920711389 9850.6151CVENTE +1436SAUVE DOMINIQUE 21973 61994101994121206910241.1351MSANS +2239CHALIGNY KYOKO 21973 31994091993091206910239.8651CSANS +0183LAURIERS PAULE 21974 81995111994121206910241.2551CSANS +9366PINET LAURENCE 21974 819940819930810668 9425.3651MESP +6833VIGNY EVELYNE 21974 51994081995121206910239.9952CVENTE +1571SEINE GUY 11974 3199609199509 7803 7680.8951CANGL +8078LAMARCK JOSIANE 21974 3199602199502 9894 8922.4151CTECHN +0018LOUVERSEY CATHERINE GINETTE 2197510199611199511 9894 8922.1451CSANS +7419VEROCE MICHELLE 21975 3199406199306 7803 7680.1451CSANS +8512ASSOMPTION CHRISTIANE 21975 3199608199508 7803 7680.5951CVENTE +6365EDENFLORE BRIGITTE 21975 1199308199208 7803 7681.4251.ALLEM +2274LOTUS ISABELLE 21975 7199612199512 9894 8923.1351CSANS +5674MAUBLANC NICOLE 21975 9199602199502 9894 8922.8051CSANS +0762GIORDAN ANNE MARIE 21975 1199607199507 9894 8921.3151MINFOR +0696PICAUD JEANNINE 21976 2199607199507 7464 7525.7451CSANS +6681MARCEL FRANCOISE 21976 3199608199508 7803 7680.6251CSANS +0740CHESNAIE PHILIPPE 11977 1199507199407 7803 7681.2551CINFOR +4654CANNES FRANCIS 11977 3199609199509 7803 7679.5851CANGL +7430MULLERON FRANCOIS 11978 5199607199507 7803 7680.8451CSANS +3935LISSAND ISABELLE 21978 4199607199507 7803 7680.6351CSANS +5586SCHUMAN NANCIE 21931111974111991071578112723.0552VSANS +1401RENAUDOT MARYSE 21933 51968071990071621213033.8152MSANS +1061AMBOISE DENIS 11934 11964041993011663613344.2752MSANS +9799GUILLEMETTE JEAN CLAUDE 11935 31955021991082470018540.7552MSANS +3145SABLES PHILIPPE 11936 11959021993073417325098.3651MANGL +3589FOURMONT PASCAL 11936 71959031982063327724477.0651MSANS +2996PAUL MARIE PIERRE 21936 51972121989011621213033.9152MSANS +2578PISY YVES 11938 71962111981102470018542.2252MSANS +1257LAMARK PATRICK 11939 71963121992052470018541.5052MINFOR +6677BRETHENCOURT NOEL 11939 21972111991011578112722.7052MSANS +9734FIGOURNAS DENIS 11940111971041989101932314934.7252MANGL +6502POMMERY ROBERT 11941 81963121993011663613344.0552MSANS +2718CHENES HAFID 11941 11964081994011557012567.3952MSANS +4104LANCY LIONEL 11942121988011995013587826261.1652.SANS +8284MERY PAUL EMILE 11942 61968021994012137316331.8752MCOMPT +3992BOUTICOURT EUGENIO GIOVANNI 11943 51964071987042273717261.8452MALLEM +9819LATTRE GUY 11945 31974071992071369311286.1252MESP +1150CAILLOUX JOSIANE 21945 11965021985042470018541.4752CANGL +6760HAUTINS BRIGITTE 21945 719781219900711131 9659.0652MSANS +2900FOS BERNARD GUY 11946 91974051993091168610046.6952CINFOR +3096CASTELLAR JACQUES 11946 71972041991112137316331.0352MINFOR +3983FLEURIE ISABELLE 11948111973111994011663613343.3052MANGL +9627CITROEN SILVIE 21948 31970041991012990722150.2852CALLEM +2626BUFFON BRUNO PIERRE 11948 51974051993011621213032.8352MANGL +1995GRENELLE PASCAL 11949 81975041991071578112721.7152MSANS +6675EMAN BERNARD 11950 71973081991012739020403.1152VSANS +1203JACOB JEAN PIERRE 11950 619790819780811389 9852.0052MSANS +1502COUBERTIN MICHEL 11951121979031992121608112916.4752MCOMPT +9762APPOLINAIRE JEAN CLAUDE 11951 51971101992112175716600.9252MANGL +6014MAURICE JOEL 11952 419910319900310024 8999.7952CSANS +8272BESANCON CHRISTIANE 21953 2199304199204 9597 8728.9452SSANS +4121VOLTAIRE PHILIPPE 11953 51972071995122043315671.2452CALLEM +3385CARNOT HENERE 11953121978061993051864214469.1452MANGL +9459SAUVETERRE OLIVIER MICHEL LOUIS11954101982061990011608112916.2352MANGL +0260MOURILLON JOELLE 21955 21984011992011249910473.0952MSANS +6808ROBERT PIERRE 11956 61979061992021471512025.3752DVENTE +1754CITADELLE PHILIPPE 119561019830619910311131 9658.9152MANGL +3114PINCES FREDERIC 11956 61976031988011684813422.5952CSANS +2401PAPE MARIE ANNE 21956 31978061992121471512025.9552MSANS +3724AGNOS ERIC 11956 71976041993111578112721.7052CSANS +1438KERLIBOUZEC EVELYNE 21956 71981111980111527112373.3252MINFOR +8247VERSAILLES LAURENT 11956 61980081995091249910472.5552MSANS +0939FLAMBERTINS ALAIN 11957 819950619920110024 8999.0752CSANS +5765FOCH ROBERT 11957 11981031993031608112916.3252MALLEM +9301GARDETTES DOMINIQUE 21957 1199505199405 9126 8456.6952MSANS +8571TIRE ROBERT 11958 11984051992041326611017.9752MSANS +7487THORNTON JEAN LOUIS 11958 31981041994051804514081.0752MANGL +3406AVEL PAULE 21958 419780619770611515 9930.5352MSANS +0124DESPORTES STEPHANE 11959 21979021995091471512025.7252MSANS +6928ASSIER PIERRETTE 21959111993101992011202810241.1352CTECHN +0989FEROLLES WILLIAM 11959 81983041982041326611016.3052MSANS +9802ORGE JEAN CLAUDE 11959 11980081987112256617145.8752MSANS +8376FOUQUE ERIC 11959 2198801198502 8656 8145.6552.SANS +8925COURBET YVES 11960 71987031989112090215980.8752MALLEM +3897ANDELU ALAIN 11960 81991011994011249910471.7452DSANS +3323BOSQUETS CLAUDE 11960 41983031995121433211715.6952CANGL +7089COULOUBRIER DENIS 11960 7199303199203 9126 8455.6552CVENTE +3026AGUILLON LUC 11961 2199601199501 8656 8145.6652MANGL +9585EGLISE ANDRE ROGER 11961101988111993092401918076.1152MSANS +0634MAINE JOSEPH 11961111986011992121288210745.7052CSANS +7284FORTES ANDREE 21961 51991111990111949415051.2152MSANS +3518VIELLE GEORGES 11961101988091992121249910473.6752MSANS +3969FERIGOULAS SYLVIE 21962 71983011982011288210743.9052MALLEM +1749ARCADIA PASCAL 1196210199305199209 9597 8727.8352CANGL +5023PAVIS YVON 11962 4199512199501 9126 8455.5352MALLEM +6853PLAGNE ROBERT 11962 819840619830611131 9657.1252CINFOR +0421HARAVILLIERS MAX 11962 819850819840810791 9502.9852CINFOR +8436PLEIN ROGER 11962 51984081989112090215981.3652CESP +2433SARTRE SERGE 119621219850719920910791 9502.6652CSANS +4413WALDTEUFEL FRANCINE 21962121982051988051608112916.0252MANGL +2214MONTEZE FRANCOISE 21962 3199302199202 9597 8728.3752MALLEM +0233COMMUNE ANNE 21963 2199312199212 9085 8419.4452STECHN +0441SOLARIUM ELISABETH MARIE PIER21963 21993071992011202810240.9952MTECHN +4510LETELLIER HUBERT 11963 31986111986031527112374.5852CSANS +1778EVEQUE BERNARD 11963 51986111992011949415051.3952MSANS +1339SEGUR SERGE 11963 91985091992121527112374.1252MTECHN +4092HEURSAULT AGNES 21963 51982031981031326611016.7552MSANS +9379GOJA MARIE THERESE 21963 71983041982041288210744.2652MINFOR +1533BODIN ISABELLE 21963 419831219821210024 8998.9152MSANS +9862FOSSE BETTINA 21963 91990111989111949415051.9552MSANS +6255VIGNE NICOLE 21963101984111983111608112916.9152MSANS +6101VAUGRENIER CATHERINE 21963101984051989041527112374.9452MINFOR +8653SEQUOIA HENRI 11964 51988031994011249910473.2052MSANS +9919BILY PATRICK GUY 11964 91985091992091949415050.6352MSANS +7059VALLEROY BEATRIX 21964 2199204199104 9597 8729.0752MSANS +5440PORS ANNE MARIE 21965 21986061985061527112373.1752MSANS +2587VICOMTE PATRICIA 21965 11991111992011202810239.8652CESP +9598SULLY CHRISTIAN 11965 91994051992011202810240.1452MANGL +0899MANU JEAN PAUL 11965 519880519870510407 9270.2952MTECHN +0493POET JEAN PAUL 11965 119891219881210407 9270.5652MINFOR +7853LILAS JEAN CLAUDE 11966 31986051985051288210744.5052MANGL +4637LONGCHAMP CATHERINE 21966 91988051993091839014313.0952MSANS +5141LINDFIELD GERARD 119661119870119860110407 9272.2452MANGL +3945PESSOT VERONIQUE 21966 119910719900710024 8998.8952MINFOR +6408PUJOLS CHRISTINE 21966 71987061986061249910473.0952MSANS +5883AUREA JEAN 11966101988061991011249910471.9452CESP +6385CHAILLY LAURENCE 21967 419910719900710024 8998.4152MANGL +8609CEINTURE ANNE MARIE 21967 21991121995071202810240.1452MANGL +1367NOIRES ANNIE 21967 61991101990101330611017.1952MSANS +6827NOISY FRANCIS 11967101988011987011450311831.9752CESP +3823RESISTANCE CHRISTIAN HENRI 119671119890319880610407 9270.8452MSANS +5716CYRAN PATRICK 11967 11987071994111450311832.6852MANGL +2307ARBELLARA NADINE 21967 61988091990111839014313.9352CSANS +0224VEBRET VIRGINIE 21967 9199406199305 9126 8456.1652CANGL +3639BERGERON CHRISTINE 21967 619951219940110668 9426.1852DSANS +5292CREGY MAURICE 11967 719940819930411389 9852.4952MANGL +8369BRENS COLETTE 21968 81991101990101330611017.4152CANGL +2447REBEYROLIE ANNIE 21968 619900319900911389 9851.0352MALLEM +0478MES CHRISTINE 21968 4199309199209 9597 8728.7152CSANS +2875CLION MARIE FRANCE 21968 319930519920511389 9852.4552CSANS +8148CROS FRANCOIS 11968 41988111987111249910472.7352MSANS +9990VERCINGETORIX CHRISTINE 21968 119950419930411389 9851.2852MSANS +2796BLONC JEAN PIERRE 11968 4199301199511 9597 8727.8152MSANS +9996GUIS LUCIEN 119681219931119920110024 8998.5352CSANS +7769NERVAL MICHELE 21968 41990051994011330611017.8352CSANS +6262RACINE ALAIN 11969 719890419880410407 9271.9552CSANS +9102SAUGES BENOIT 11969 11989071993081381911364.8152MSANS +4448NARON PASCAL LOUIS 11969 2199605199505 8656 8145.6952LSANS +3197CHAUMES GUY 11969 819930619920610024 8998.9452MSANS +2201LUYNES SOPHIE JOELLE 21969 5199311199211 9597 8728.2352CANGL +3000PLAINES JEAN MARC 1196910199204199312 7677 7604.9052CINFOR +7547BREGUIERES THERESE 21969 719920419910411389 9851.3352MANGL +9804CADOT MARIE JOSE 21969 81991101990101330611018.2252MSANS +5321JAUNAC SOPHIE 219691019910719900710024 8998.5852MSANS +3824LAVISSE DANIELLE 2196912199405199305 8359 7952.9252CSANS +6505LOUISE PIERRE 11969 419910119900110024 8999.8152CSANS +9873BOULOURI JEAN MICHEL 11969 71990021992091202810241.3652MSANS +9771BREUILHSUD THIERRY 11969 419910719900710024 8997.9652CCOMPT +8931ELVARD CLAUDE 11970 81994031993032107316096.9852MANGL +2755GEROME MAURICE 11970 8199311199212 9597 8728.9552MTECHN +8557CYRNOS BERNARD 11970 5199404199201 9597 8729.9052MSANS +3651COCTEAU GABRIEL 11970 41994011993011267210588.5352CSANS +4459VITALIS ALAIN 1197010199612199512 9894 8921.9152LSANS +9388COURTENAY JEAN JACQUES 11970 91990031995071202810241.1252MVENTE +1310CAILLADE ADRIEN 11970101996111995111616712994.7752CALLEM +5461GOMETZ CHRISTIANE 21970 61994071993071407611559.6252CSANS +0669MAUVALAT DANIELE 21970 6199209199109 9597 8728.7652MSANS +0103TAILLEFER MICHELINE 2197010199608199508 7803 7680.0552CSANS +5577MOUGINS CHANTAL 21970 619940919930411389 9852.6952CSANS +0340LAMBESC MARIE CHRISTINE 21970 3199607199507 7803 7680.6252CSANS +1328PIERRE PATRICE PAUL 1197111199106199006 8656 8145.0352.SANS +3172DENOUVAL DANIEL 11971 419940319920110024 8999.1652MSANS +9639ESPAON MARC 11971 7199407199307 9597 8727.7852CTECHN +6612FONTMERLE JOELLE 21971 919930419920411389 9850.8452CSANS +1855MAILLOL PIERRE 1197110199303199203 9597 8728.0452MSANS +8791RASTINES PHILIP 11971 81993011992011267210589.2852CSANS +2880FLORALIES MARIE THERESE 219711219930919920911389 9852.3352CINFOR +9921SERPENTINE FRANCOISE 21971 419920219910211389 9851.1652CVENTE +6761KING JACQUES 11971 5199606199401 9597 8729.9952CALLEM +8677BREANCON VERONIQUE 21971 919940819930810668 9425.7252MANGL +0030SUVERET PATRICK 1197110199501199304 9597 8728.6652MSANS +4284REGNAULT JEAN MARC 11971 719900619890610024 8999.3652CSANS +3275POMPIDOU DIDIER 11971 6199610199510 8656 8145.3352MSANS +7270BONNEUIL MARC 1197110199107199007 8656 8145.3052.SANS +2988DEREURE BRIGITTE 21971 8199606199506 8656 8145.8752CINFOR +0334GRAVESONN JEAN 119711119911019901010024 8997.7852CANGL +5425PONT FRANCOIS 11971111995041994041267210588.8852CSANS +7132MIDI JEAN PIERRE 11971 5199608199509 8656 8145.4852CANGL +5172BLOMET JEAN PIERRE 11971 81993061992061267210589.5252CSANS +1753QUIETA DOMINIQUE 11971 41991061995101202810241.7652MSANS +8062DOMINO MARC 11971 719910819900810024 8999.4052MSANS +8636ECLUZELLES MICHELE 21971 9199609199509 9894 8921.5952CSANS +5812REPUBLIQUE VERONIQUE 21972 31995101994101206910240.4052CSANS +0712TEYSSIERES MARTINE 21972 6199607199507 7803 7680.8952CSANS +3543DUNETTE LAURENCE 21972 4199608199508 8656 8145.9152MSANS +7967FOUCANCOURT ASTRID 21972 219930619951011389 9850.8852CSANS +6876THERESE MISAKO 21972 719940819930710668 9427.2652MSANS +9406GALLIEN MICHEL 11972 219910719900710024 8997.9052MSANS +7605BAUMES ALEXANDRA 11972 7199501199304 9597 8728.1952MALLEM +1625ARTHUISIERE JACQUES 11972 61995011994011206910240.6652CSANS +6717DOUMER PHILIPPE 1197212199611199401 9597 8728.8052CESP +1677CHABRIER LAURENT JEAN CLAUDE 1197211199504199404 9126 8456.3952CSANS +8299PUY JEAN 119721119931219940111389 9852.6352CANGL +8443COUSTERES MICHEL 11972 2199107199012 8656 8145.4452.SANS +7741NANT FREDERIC 11972 31991061994111202810240.7652MSANS +0657TAUDE FABRICE HENRI 11972 319940219930211389 9851.3752CANGL +9630GOELETTE JEAN LOUIS THIERRY 11972 4199407199307 9597 8728.1352CSANS +1127EXUPERY SIMONE 21972 5199602199502 9894 8921.4152CTECHN +6944LIBERTE CORINNE MARIE 21972 41993071993051267210589.5253CSANS +3755ARNAUD MARIE PIERRE 21972 6199307199207 9597 8729.3052MALLEM +2437CLAUSONNES MARTINE 2197212199411199311 9126 8457.1152MSANS +2896LUNA NADINE MARIE 21972 8199308199208 9597 8728.3252CTECHN +1758KARU LILIANE 21972 3199207199107 9597 8729.7452CINFOR +5392FER RADHIA 21972 3199210199106 8359 7952.9152.SANS +9857EGLISE CLAIRE 21972 7199402199302 9126 8457.1152CSANS +6707INKERMANN GERARD 119731219951119941110668 9426.5952CSANS +4728ESTANISLAO ERIC 11973 1199608199508 7803 7680.7752CSANS +6566GOULAIN BRIGITTE 21973121994121993121206910240.7753CESP +0727PUY THERESE 2197311199610199510 8656 8145.6552LTECHN +0980ARGENTIERE GILLES 1197311199406199306 9126 8456.1552CANGL +4718DOMOY MICHEL 11973 219940819930811389 9852.0052CSANS +0216CALAIS FREDERIQUE 21973 219930919920911389 9850.6152MVENTE +2997FOIRAIL COLAS JEAN LOUP 11973 1199604199504 8656 8145.4852CINFOR +5877EPI LUC 11973 5199308199208 9597 8729.3052CANGL +0287CARTIER JEAN LUC 11973 7199511199411 9894 8923.3852CTECHN +7891MOUSTRAN PAUL 11973 2199303199203 9597 8729.8452CSANS +3815ELYSEE LOUIS 1197311199304199204 9597 8728.6652CSANS +0959REPUBLIQUE ERICK 11973 619930719951111389 9852.2752CESP +2490GLENANS PHILIPPE 11973 41995101994101206910241.8452CSANS +6935PAYRAC JEAN JACQUES 11973 9199310199210 9597 8729.2252MSANS +8784JACQUET FREDERICK 11973 319930919920911389 9852.2452CINFOR +7986COUCHANT YOLANDE 2197312199608199508 7803 7679.4652CALLEM +1549DRYADES PIERRE G 11973 9199408199307 9126 8456.7052CSANS +0968OPIO SYLVIE 21974 6199606199506 8656 8145.3852CSANS +0353DELATTRE FREDERIQUE 21974 9199603199503 8656 8145.8052CINFOR +1122ACACIAS SERGE 11974101995101994101206910240.9452CTECHN +9008MANOIR DANIEL R 11974 9199606199506 9894 8921.4052CSANS +3650AIRES FERNANDO 11974 7199407199307 8656 8146.2552CSANS +7799TOUR JEAN PIERRE 11974 3199508199408 9126 8456.3752CSANS +4614VILLERS CHRISTIAN 11974 119951119941110668 9427.4752CSANS +6384SEURAT JEAN JACQUES 11974 1199504199404 9126 8457.4952CSANS +0504MEYRIN MICHEL 11974 8199607199507 7803 7679.3752CTECHN +3076TAMARIS THIERRY 1197411199405199305 9126 8457.7452CALLEM +5273CAYES PHILIPPE NICOLAS 11974 2199308199208 9597 8729.3452CALLEM +9558BATOUCH PAUL 11974 6199606199506 8656 8145.2452CSANS +6082PEDRO GERARD 11974 6199607199507 7803 7680.3252CSANS +4712CIDEX NICOLE 21974 9199607199507 7803 7680.0052CALLEM +7982VILAR MICHELINE 21974 9199604199504 9894 8921.4052CALLEM +0377RIBE MARTINE 2197411199609199509 8656 8146.6152CVENTE +1910AUBE DOMINIQUE 21974 3199610199510 8656 8146.0152CANGL +1632COURTAU MARIE JOSEE 21974 8199609199509 7803 7679.6352CSANS +0616HIIS BEATRICE 21974 919930919920911389 9850.9852MSANS +5825TIREUSES MARIE FRANCOISE 2197512199609199509 7803 7680.7152CANGL +8598SAND CHRISTIANE 2197511199607199507 9894 8922.0552CSANS +9425VISA GILLES 11975 319951119950211389 9851.7452CALLEM +8440EYGAUX LAURENT 11975 6199603199507 9894 8922.1652CSANS +3240BARBUSSE JEAN PIERRE 11975 6199510199410 8656 8146.2552CANGL +7022LOUPS DOMINIQUE 11975 3199605199505 8656 8146.7752CSANS +3687SULTZER MARYLINE 21975 8199607199507 7803 7681.1752CTECHN +3649TROIS ANGELICA 2197511199608199508 8656 8147.0652CSANS +8797BELHAITRE RENE 11975 4199409199309 9126 8455.7652CSANS +3401SOURCE PAUL 11975 2199612199512 9894 8921.4152CANGL +0533JOUFFROY LUCIENNE 2197511199608199508 9894 8922.0052CTECHN +4412CAPEAU MONIQUE 21976 1199607199507 7803 7680.6252CINFOR +9518COCULOT HELENE 21976 8199508199408 7803 7681.2952CSANS +1220VALLOIS ALAIN 11976 7199607199507 7803 7680.1852CANGL +7054DANGALYS MARTINE 2197712199607199507 7803 7680.7752CSANS +5515MARNE GHISLAINE 21977 6199607199507 7803 7680.0552CSANS +2958CLAIR GISELE 21977 8199608199508 7803 7680.6352CANGL +5379CONCHES DOMINIQUE 21977 6199607199507 7803 7679.4652CANGL +9250DECHAMBRE MICHEL 11977 8199607199507 7803 7679.4552CSANS +7969SALEON ALAIN 11977 8199607199507 7803 7679.3652CANGL +0131EOLE ROXANE RENEE 2197710199607199507 7803 7679.2852CANGL +9710OUEST HENRIE MARCEL 11979 2199607199507 7464 7525.1452CINFOR +0487PRIEUR JEAN FRANCOIS 11956 81983041982041684813423.3153MSANS +7696BELVEDERE XAVIER 11962 81982071995091450311830.6753MINFOR +2063LIOURA PASCAL JEAN 11964 41986111995082256617145.7853MANGL +7927TRAVERSIERE JEAN PIERRE 11965111986081995091450311832.1553MCOMPT +2549VASCO DANIEL 11968 51990091995111450311832.1453MANGL +2675RESIDENCE JEAN MARC 11969 21995111994111450311831.3453CANGL +8649VIGIER OLIVIER 11969 8199612199512 4638 5819.0153MSANS +7524BEDOK STEPHANE AUGUSTE 11969 51995121994121450311832.5653CSANS +3056FRANCE MARION 21971 61996091995091450311831.7553CSANS +9905CORNICHE DANIEL 11972 31996091995091450311832.2057CSANS +4894PORTE RONAN JEAN PIERRE 11972121993091992091450311831.9353CSANS +6471SUCCURSALE LAURE MARIE 21972 71996091995091450311832.1854CALLEM +8530TOURS ANNE YVONNE 21973 31995121994121450311832.3854CSANS +4004MORTON JEAN CLAUDE 11965 81992031991031965617846.6854CANGL +4099MONTELIER DENIS 11971 519940819930811389 9851.1257MSANS +9423CHATEAU CARL 11956 51980091992121471512024.3958MSANS +2026BERT CLAUDE 21957 51979031986021497412181.1158MALLEM +0951MERAY MARIE HELENE 21964 61990051989051249910472.7058MTECHN +5282PINEL LILIANE 21948 71977031992011471512024.4859MINFOR +5545DOM ANNIE 21960121982091995061638413150.2959DSANS +4161BOIS ANNICK 21960 81983021982021326611016.2459MSANS +1624LORRAINE CHRISTIAN 11961 41983081991012781920674.8359MSANS +0982VEYANS MICHEL 11961 21982091991092529918968.7059MINFOR +0123LOCARNO ANNE MARIE 2197411199402199302 8359 7953.1159MSANS +7957AVAUX PHILIPPE 11942 51963041991072273717261.4960CCOMPT +0611SAUVAN JEAN FRANCOIS 11946 71980111994011471512025.0260MTECHN +8634MONTGAZIN ANDRE 11950121974061991012137316331.7560MALLEM +3872AZUR JEAN CLAUDE 11951101970101990101932314935.1760MMICRO +7401PARC PIERRE 11952 91989011994011288210745.9360MSANS +8111STADE BERNARD 11953 21983021984051249910473.4960MANGL +8795MOTU JEAN LUC 11959 81979101994011578112722.8260MSANS +2118BAUDETS MARIE CHRISTINE 21961 31983011982011608112915.3560MTECHN +8422WIEHN BRUNO 11963121988061992021249910472.6660MANGL +3871SOLE MARTINE 219661019910919950510876 9503.4760MINFOR +6169CUOQ CORINNE BRIGITTE 21967 21989121995071249910472.2560MANGL +2571BARAT MARTINE 21968 81994061996012303517377.3560CSANS +4114HOURTINS DOMINIQUE 11977 1199608199508 7803 7680.5960CANGL +1079GUEN HELENE 219391219820419810411131 9657.7561MSANS +0830EGLY DANIELLE 21950 1199406199306 9126 8457.4261MSANS +1903GENEVIEVE HARDY 11953 91978111989112256617146.1661MINFOR +9550INGERSHEIM PHILIPPE 11961 61982041987041608112917.1961MANGL +3284BELLETRUD JEAN 11950 61977101993121369311287.2363MALLEM +2911SOUBISE IVAN 11958 71982031992112529918967.7663MTECHN +5851CREACH FRANCOIS 21963 9199608199508 7803 7680.0863MSANS +6333DUPARCHY LILIANE 21973 3199406199306 9894 8921.6763CSANS +1729CURAT ROBERT 11935 91958051994123417325098.2464MSANS +7436CHALLONNIERE VALERIE 21941 41962041989012137316332.3664MSANS +6301BLUM CHANTAL 21943 71969071991051932314935.2664MSANS +7026SARRETTE MICHEL 11946 21991011990013200223583.2364.ANGL +0646MARIE BRIGITTE 21950111971011992061834514275.6164DMANAG +1101ENFANTS ANTOINETTE 21955 61981011995011527112373.9164MANGL +8770RACHERET LAURENCE 21956 71978061993051608112916.8864MANGL +4751LIONS DAVID 11958 91980071993092090215981.1464MANGL +9291SOULEYAS DOMINIQUE 11958 11980011992101911114779.7764MANGL +2505LUCHON JACQUELINE 21958 21989011993041249910473.4964MSANS +8607VOLVESTRE ELISABETH 21958 11991111990111249910472.9764SALLEM +1586PESSAC JEAN YVES 11961 21989051988051949415050.2864CSANS +5341RIOU ROBERT 11962 61985091993011949415052.4365MCOMPT +8946MOULINET ANNE 21962 81983041982041608112915.6064MSANS +5619MARCQ MONIQUE 21963101995101994101206910241.3064MSANS +8989JUZAN CLAUDE 11965101990091994092401918075.4464CANGL +0763PERAULT CHANTAL 21965 21986041985041527112373.5364MSANS +1526JEREZ NICOLE 21967 519911219920111389 9851.6164.ALLEM +2211KELLERMANN FREDERIQUE 21967 91991111990111202810241.9764MSANS +4302KERCADORET DOMINIQUE 11971 81994071993071206910240.2364CSANS +1236PALETTE ROSE MAY 21971 91994031993031267210588.9264CSANS +8225SEROT MARTINE 21972 11992061992031330611017.7065CALLEM +5326DRAGUIGNAN FRANCOISE 21972 519930619920611389 9852.0564MTECHN +5970DANUBE PHILIPPE 11974 11994071993071206910240.4965CSANS +6556BROUILLET ANTOINE 11937 11986101986012687820055.0565.SANS +1186AOUT JEAN JACQUES 11937 21987011986012431618272.0165.COMPT +7999PIERREFONDS STEPHANE 11938 31964051994011663613342.7665MINFOR +1312GRENOUILLERE PHILIPPE 11939 71964101987016400345693.2465MALLEM +0460MARRONNIERS GERARD 11942 41961061994113587826261.7965MINFOR +4154LOUIS PHILIPPE 11942121965101993012739020403.3065MVENTE +3603MUETTE GEORGES CHARLES 11942 41968071992013844228044.8465MANGL +8992COUDREE PASCAL 11943 91968031988072273717260.3265MSANS +9382CONSTANCE MADELEINE 21944 519830619860211131 9657.1265VSANS +0255MARTINIQUE GERARD 11946 31994121993123882428316.7365MSANS +8195EXELMANS BERNARD 11946 91984051984111215710278.1665MVENTE +3879GOUT JACQUES 11947 51968121992122470018540.5765MSANS +9678HETRES VIANNEY 11947 91968091994094121428006.1765MALLEM +6027STRASBOURD JEAN CLAUDE 11951 21972101987052470018540.1565MALLEM +7805BESSIERES JEAN 11952 51973031988112334017609.4265MSANS +7152REUILLY ANNE 21953 91974071993121471512024.5665MINFOR +4995BERCHET FRANCOISE 2195412199306199206 8656 8145.6065MMANAG +1933ERMITAGE JEAN CLAUDE 11955 11991031994021249910471.6165MSANS +0728VOISEMBERT ISABELLE 21955 61976011991011471512024.2165MSANS +0718CERNAY MARC JEAN MARIE 11959 11988011987013669126843.7365.SANS +2726ORDENER MARIE FRANCOISE 21959 21980071991101369311287.9765MSANS +0225PLELO PHILIPPE 119591119800319790311389 9851.3365MSANS +0630GOBELINS BERNARD 11959 71981031991012781920674.6165MTECHN +1138ISARDS ELIANE 21960 21988101990042581519316.5865.SANS +8716TOURELLES JOSETTE 21961 81983041989112090215980.4365DANGL +3837CONTAMINES ANNIE 21961 81984121992061527112373.2265MANGL +0223FOUSSEAU DOMINIQUE 21961 21996071995082005015476.6165DINFOR +8553OUSTALADO PIERRE 11962 61984011993121326611017.7265MSANS +1723HIGH MURIEL 21962 71983011982011608112917.1865MSANS +2779PLAT MICHEL 11963121984051993102401918074.6765CANGL +7160BOILEAU DENIS 11964111985031990111949415051.9565MANGL +1054MARINET CRISTOFORO 11964101985091993092401918076.4465MALLEM +0034ANGELY JEAN PIERRE 11965 31988081991121249910473.3265MINFOR +0684DIEUDONNE CORINNE 21965101988121987121249910473.7465MSANS +4943SICARD DOMINIQUE 21966 919931019921010363 9233.2765MINFOR +8211CARLE PATRICK 11966 31994011993011621213033.5665MALLEM +1276GREFFIER SERGE 11967 119930619940110024 8999.1365CSANS +5313BIARRITZ CHRISTINE 21967 91990111991012602319433.9065.ALLEM +5161DUBOC NICOLE 219671219880119870111302 9774.4865MANGL +1515SABLEAUX REGINE 21969 71993011992011839014313.2665MSANS +7518LANORVILLE JEAN DAVID ALBERT 119701219960519950511389 9851.7065CSANS +6488CATALAGNE PHILIPPE 11970 71996101995101706413577.4365CSANS +8039LAURENS PATRICIA 21971111993031995011557012567.4165.SANS +7894PEPINIERE MARIE ANNE 21971 41991111991111723313653.7565MSANS +9988MEN JACQUES 11972 71994061993061420611638.1665CANGL +0742TOUTES JEAN FRANCOIS 11972 71993031992031420611637.6665CANGL +3618FREDISANE BRUNO 119751019960619950611389 9852.5465CANGL +7403AUGUSTINES ERICK 11937 61988031987024330331419.2172.ALLEM +7418PATRICIA JEAN CLAUDE 11944 71990071993011369311286.2072.SANS +9902CORSE MARIE JOSE 21958 41988101983101326611018.1872.INFOR +1972FLANDRIN CATHERINE 21963121988101983101288210744.3772.SANS +6223BEAR MICHELINE 21963 51989061992031450311831.6972.SANS +1899CHEVILLY ISABELLE 21963 71989011992061450311832.7272MTECHN +1131BLAISE MIHOKO 21963101990011991061450311831.0372.SANS +7170AIGUEBONNE MARIE 21971 11995101994101206910241.9972CSANS +0384LAMBESC ALBERT 11973 119901019920110024 8999.7672.TECHN +4786VIGEN EVELYNE 21939121962121990102273717261.1873MINFOR +5969COTE MIDORI 21946121994101993102334017610.5973MSANS +6378MYOSOTIS YVES 11949 31992011994113844228045.8873.SANS +3664MAREUIL NADINE 21966 21989061989111288210744.8673.SANS +8858EANOLIAS JACQUELINE 21949 51977071991121911114778.7075CSANS +1090LORETTE YVES ANDRE 11950 61971081995013587826261.5875MSANS +3800KOUTIO ALAIN 11961 91982121989052090215980.3975MINFOR +5591PALALDA MARC 11965 81995061994061267210590.3275MSANS diff --git a/storage/connect/mysql-test/connect/std_data/expenses.txt b/storage/connect/mysql-test/connect/std_data/expenses.txt index 049f132dd5e..66a94edbb9a 100644 --- a/storage/connect/mysql-test/connect/std_data/expenses.txt +++ b/storage/connect/mysql-test/connect/std_data/expenses.txt @@ -1,24 +1,24 @@ -Joe 3Beer 18.00 -Beth 4Food 17.00 -Janet 5Beer 14.00 -Joe 3Food 12.00 -Joe 4Beer 19.00 -Janet 5Car 12.00 -Joe 3Food 19.00 -Beth 4Beer 15.00 -Janet 5Beer 19.00 -Joe 3Car 20.00 -Joe 4Beer 16.00 -Beth 5Food 12.00 -Beth 3Beer 16.00 -Joe 4Food 17.00 -Joe 5Beer 14.00 -Janet 3Car 19.00 -Joe 4Food 17.00 -Beth 5Beer 20.00 -Janet 3Food 18.00 -Joe 4Beer 14.00 -Joe 5Food 12.00 -Janet 3Beer 18.00 -Janet 4Car 17.00 -Janet 5Food 12.00 +Joe 3Beer 18.00 +Beth 4Food 17.00 +Janet 5Beer 14.00 +Joe 3Food 12.00 +Joe 4Beer 19.00 +Janet 5Car 12.00 +Joe 3Food 19.00 +Beth 4Beer 15.00 +Janet 5Beer 19.00 +Joe 3Car 20.00 +Joe 4Beer 16.00 +Beth 5Food 12.00 +Beth 3Beer 16.00 +Joe 4Food 17.00 +Joe 5Beer 14.00 +Janet 3Car 19.00 +Joe 4Food 17.00 +Beth 5Beer 20.00 +Janet 3Food 18.00 +Joe 4Beer 14.00 +Joe 5Food 12.00 +Janet 3Beer 18.00 +Janet 4Car 17.00 +Janet 5Food 12.00 From a392c79552f1a728426b6664f434fe818a894e03 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Thu, 16 Jul 2015 11:05:20 +0200 Subject: [PATCH 21/39] Fix and Enhance remote indexing: - Apply to ODBC tables as well as MYSQL tables - Fix and enhance the CheckCond routine Make ReadKey and MakeKeyWhere handle all conditions modified: storage/connect/.gitattributes modified: storage/connect/.gitignore modified: storage/connect/connect.cc modified: storage/connect/connect.h modified: storage/connect/ha_connect.cc modified: storage/connect/ha_connect.h modified: storage/connect/mycat.cc modified: storage/connect/tabmysql.cpp modified: storage/connect/tabmysql.h modified: storage/connect/tabodbc.cpp modified: storage/connect/tabodbc.h modified: storage/connect/xobject.cpp modified: storage/connect/xobject.h modified: storage/connect/xtable.h Add some new tests: storage/connect/mysql-test/connect/r/endian.result storage/connect/mysql-test/connect/r/mysql_index.result storage/connect/mysql-test/connect/t/endian.test storage/connect/mysql-test/connect/t/mysql_index.test --- storage/connect/.gitattributes | 6 +- storage/connect/.gitignore | 4 + storage/connect/connect.cc | 28 +- storage/connect/connect.h | 4 +- storage/connect/ha_connect.cc | 261 +++++++----- storage/connect/ha_connect.h | 11 +- storage/connect/mycat.cc | 4 +- .../mysql-test/connect/r/endian.result | 105 +++++ .../mysql-test/connect/r/mysql_index.result | 114 +++++ .../connect/mysql-test/connect/t/endian.test | 88 ++++ .../mysql-test/connect/t/mysql_index.test | 66 +++ storage/connect/tabmysql.cpp | 54 +-- storage/connect/tabmysql.h | 2 +- storage/connect/tabodbc.cpp | 401 +++++++++++------- storage/connect/tabodbc.h | 16 +- storage/connect/xobject.cpp | 24 +- storage/connect/xobject.h | 2 +- storage/connect/xtable.h | 27 +- 18 files changed, 896 insertions(+), 321 deletions(-) create mode 100644 storage/connect/mysql-test/connect/r/endian.result create mode 100644 storage/connect/mysql-test/connect/r/mysql_index.result create mode 100644 storage/connect/mysql-test/connect/t/endian.test create mode 100644 storage/connect/mysql-test/connect/t/mysql_index.test diff --git a/storage/connect/.gitattributes b/storage/connect/.gitattributes index d21fdf8f212..79f6ef0fff9 100644 --- a/storage/connect/.gitattributes +++ b/storage/connect/.gitattributes @@ -11,8 +11,10 @@ # Declare files that will always have LF line endings on checkout. *.result text eol=lf -mysql-test/connect/std_data/*.txt text eol=lf -mysql-test/connect/std_data/*.dat text eol=lf + +# Denote files that should not be modified. +mysql-test/connect/std_data/*.txt binary +mysql-test/connect/std_data/*.dat binary # Denote all files that are truly binary and should not be modified. *.png binary diff --git a/storage/connect/.gitignore b/storage/connect/.gitignore index e0b8bb27a24..e2fa07ee143 100644 --- a/storage/connect/.gitignore +++ b/storage/connect/.gitignore @@ -82,6 +82,10 @@ RelWithDebInfo/ *.vcproj.* *.vcproj.*.* *.vcproj.*.*.* +*.vcxproj +*.vcxproj.* +*.vcxproj.*.* +*.vcxproj.*.*.* # Build results [Dd]ebug/ diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index 4e554b16638..56a0fc4fd4f 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -735,17 +735,12 @@ static void SetSwapValue(PVAL valp, char *kp) /* IndexRead: fetch a record having the index value. */ /***********************************************************************/ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, - const void *key, int len, bool mrr) + const key_range *kr, bool mrr) { - char *kp= (char*)key; int n, x; - short lg; - bool rcb; RCODE rc; - PVAL valp; - PCOL colp; XXBASE *xbp; - PTDBDOX tdbp; + PTDBDOX tdbp; if (!ptdb) return RC_FX; @@ -757,13 +752,13 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, return RC_FX; } else if (x == 2) { // Remote index - if (ptdb->ReadKey(g, op, key, len)) + if (ptdb->ReadKey(g, op, kr)) return RC_FX; goto rnd; } else if (x == 3) { - if (key) - ((PTDBASE)ptdb)->SetRecpos(g, *(int*)key); + if (kr) + ((PTDBASE)ptdb)->SetRecpos(g, *(int*)kr->key); if (op == OP_SAME) return RC_NF; @@ -790,7 +785,14 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, xbp= (XXBASE*)tdbp->To_Kindex; - if (key) { + if (kr) { + char *kp= (char*)kr->key; + int len= kr->length; + short lg; + bool rcb; + PVAL valp; + PCOL colp; + for (n= 0; n < tdbp->Knum; n++) { colp= (PCOL)tdbp->To_Key_Col[n]; @@ -832,10 +834,10 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op, kp+= valp->GetClen(); - if (len == kp - (char*)key) { + if (len == kp - (char*)kr->key) { n++; break; - } else if (len < kp - (char*)key) { + } else if (len < kp - (char*)kr->key) { strcpy(g->Message, "Key buffer is too small"); return RC_FX; } // endif len diff --git a/storage/connect/connect.h b/storage/connect/connect.h index fd8b7e9442f..bbefda52274 100644 --- a/storage/connect/connect.h +++ b/storage/connect/connect.h @@ -36,7 +36,7 @@ bool CntRewindTable(PGLOBAL g, PTDB tdbp); int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort); int CntIndexInit(PGLOBAL g, PTDB tdbp, int id, bool sorted); RCODE CntReadNext(PGLOBAL g, PTDB tdbp); -RCODE CntIndexRead(PGLOBAL g, PTDB, OPVAL op, const void *k, int n, bool mrr); +RCODE CntIndexRead(PGLOBAL g, PTDB, OPVAL op, const key_range *kr, bool mrr); RCODE CntWriteRow(PGLOBAL g, PTDB tdbp); RCODE CntUpdateRow(PGLOBAL g, PTDB tdbp); RCODE CntDeleteRow(PGLOBAL g, PTDB tdbp, bool all); @@ -60,7 +60,7 @@ class TDBDOX: public TDBDOS { friend int MakeIndex(PGLOBAL, PTDB, PIXDEF); friend int CntCloseTable(PGLOBAL, PTDB, bool, bool); friend int CntIndexInit(PGLOBAL, PTDB, int, bool); - friend RCODE CntIndexRead(PGLOBAL, PTDB, OPVAL, const void*, int, bool); + friend RCODE CntIndexRead(PGLOBAL, PTDB, OPVAL, const key_range*, bool); friend RCODE CntDeleteRow(PGLOBAL, PTDB, bool); friend int CntIndexRange(PGLOBAL, PTDB, const uchar**, uint*, bool*, key_part_map*); diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index c2fb6481cb0..9d67904dfb2 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -169,9 +169,9 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.03.0007 June 03, 2015"; + char version[]= "Version 1.04.0001 June 29, 2015"; #if defined(__WIN__) - char compver[]= "Version 1.03.0007 " __DATE__ " " __TIME__; + char compver[]= "Version 1.04.0001 " __DATE__ " " __TIME__; char slash= '\\'; #else // !__WIN__ char slash= '/'; @@ -2188,97 +2188,157 @@ int ha_connect::ScanRecord(PGLOBAL g, uchar *) /***********************************************************************/ int ha_connect::CheckRecord(PGLOBAL g, const uchar *, uchar *newbuf) { - return ScanRecord(g, newbuf); + return ScanRecord(g, newbuf); } // end of dummy CheckRecord +/***********************************************************************/ +/* Return true if this field is used in current indexing. */ +/***********************************************************************/ +bool ha_connect::IsIndexed(Field *fp) +{ + if (active_index < MAX_KEY) { + KEY_PART_INFO *kpart; + KEY *kfp= &table->key_info[active_index]; + uint rem= kfp->user_defined_key_parts; + + for (kpart= kfp->key_part; rem; rem--, kpart++) + if (kpart->field == fp) + return true; + + } // endif active_index + + return false; +} // end of IsIndexed + + /***********************************************************************/ /* Return the where clause for remote indexed read. */ /***********************************************************************/ -bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL op, char q, - const void *key, int klen) +bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, + const key_range *kr) { - const uchar *ptr; - uint rem, len, stlen; //, prtlen; - bool nq, oom, b= false; - Field *fp; - KEY *kfp; - KEY_PART_INFO *kpart; + const uchar *ptr; + uint i, rem, len, klen, stlen; + bool nq, both, oom= false; + OPVAL op; + Field *fp; + const key_range *ranges[2]; + my_bitmap_map *old_map; + KEY *kfp; + KEY_PART_INFO *kpart; if (active_index == MAX_KEY) return false; - else if (!key) { - strcpy(g->Message, "MakeKeyWhere: No key"); - return true; - } // endif key - oom= qry->Append(" WHERE ("); - kfp= &table->key_info[active_index]; - rem= kfp->user_defined_key_parts, - len= klen, - ptr= (const uchar *)key; + ranges[0]= kr; + ranges[1]= (end_range && !eq_range) ? &save_end_range : NULL; - for (kpart= kfp->key_part; rem; rem--, kpart++) { - fp= kpart->field; - stlen= kpart->store_length; -// prtlen= MY_MIN(stlen, len); - nq= fp->str_needs_quotes(); + if (!ranges[0] && !ranges[1]) { + strcpy(g->Message, "MakeKeyWhere: No key"); + return true; + } else + both= ranges[0] && ranges[1]; - if (b) - oom|= qry->Append(" AND "); - else - b= true; + kfp= &table->key_info[active_index]; + old_map= dbug_tmp_use_all_columns(table, table->write_set); - oom|= qry->Append(q); - oom|= qry->Append((PSZ)fp->field_name); - oom|= qry->Append(q); + for (i = 0; i <= 1; i++) { + if (ranges[i] == NULL) + continue; - switch (op) { - case OP_EQ: - case OP_GT: - case OP_GE: - oom|= qry->Append((PSZ)GetValStr(op, false)); - break; - default: - oom|= qry->Append(" ??? "); - } // endwitch op + if (both && i > 0) + oom|= qry->Append(") AND ("); + else + oom|= qry->Append(" WHERE ("); - if (nq) - oom|= qry->Append('\''); + klen= len= ranges[i]->length; + rem= kfp->user_defined_key_parts; + ptr= ranges[i]->key; - if (kpart->key_part_flag & HA_VAR_LENGTH_PART) { - String varchar; - uint var_length= uint2korr(ptr); + for (kpart= kfp->key_part; rem; rem--, kpart++) { + fp= kpart->field; + stlen= kpart->store_length; + nq= fp->str_needs_quotes(); - varchar.set_quick((char*) ptr+HA_KEY_BLOB_LENGTH, - var_length, &my_charset_bin); - oom|= qry->Append(varchar.ptr(), varchar.length()); - } else { - char strbuff[MAX_FIELD_WIDTH]; - String str(strbuff, sizeof(strbuff), kpart->field->charset()), *res; + if (kpart != kfp->key_part) + oom|= qry->Append(" AND "); - res= fp->val_str(&str, ptr); - oom|= qry->Append(res->ptr(), res->length()); - } // endif flag + if (q) { + oom|= qry->Append(q); + oom|= qry->Append((PSZ)fp->field_name); + oom|= qry->Append(q); + } else + oom|= qry->Append((PSZ)fp->field_name); - if (nq) - oom|= qry->Append('\''); + switch (ranges[i]->flag) { + case HA_READ_KEY_EXACT: +// op= (stlen >= len || !nq || fp->result_type() != STRING_RESULT) +// ? OP_EQ : OP_LIKE; + op= OP_EQ; + break; + case HA_READ_AFTER_KEY: + op= (stlen >= len) ? (!i ? OP_GT : OP_LE) : OP_GE; + break; + case HA_READ_KEY_OR_NEXT: + op= OP_GE; + break; + case HA_READ_BEFORE_KEY: + op= (stlen >= len) ? OP_LT : OP_LE; + break; + case HA_READ_KEY_OR_PREV: + op= OP_LE; + break; + default: + sprintf(g->Message, "cannot handle flag %d", ranges[i]->flag); + goto err; + } // endswitch flag - if (stlen >= len) - break; + oom|= qry->Append((PSZ)GetValStr(op, false)); - len-= stlen; + if (nq) + oom|= qry->Append('\''); - /* For nullable columns, null-byte is already skipped before, that is - ptr was incremented by 1. Since store_length still counts null-byte, - we need to subtract 1 from store_length. */ - ptr+= stlen - MY_TEST(kpart->null_bit); - } // endfor kpart + if (kpart->key_part_flag & HA_VAR_LENGTH_PART) { + String varchar; + uint var_length= uint2korr(ptr); + + varchar.set_quick((char*)ptr + HA_KEY_BLOB_LENGTH, + var_length, &my_charset_bin); + oom|= qry->Append(varchar.ptr(), varchar.length(), nq); + } else { + char strbuff[MAX_FIELD_WIDTH]; + String str(strbuff, sizeof(strbuff), kpart->field->charset()), *res; + + res= fp->val_str(&str, ptr); + oom|= qry->Append(res->ptr(), res->length(), nq); + } // endif flag + + if (nq) + oom |= qry->Append('\''); + + if (stlen >= len) + break; + + len-= stlen; + + /* For nullable columns, null-byte is already skipped before, that is + ptr was incremented by 1. Since store_length still counts null-byte, + we need to subtract 1 from store_length. */ + ptr+= stlen - MY_TEST(kpart->null_bit); + } // endfor kpart + + } // endfor i if ((oom|= qry->Append(")"))) strcpy(g->Message, "Out of memory"); - return oom; + dbug_tmp_restore_column_map(table->write_set, old_map); + return oom; + +err: + dbug_tmp_restore_column_map(table->write_set, old_map); + return true; } // end of MakeKeyWhere @@ -2548,8 +2608,9 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) /***********************************************************************/ /* Check the WHERE condition and return a MYSQL/ODBC/WQL filter. */ /***********************************************************************/ -PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) +PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) { + AMT tty = filp->Type; char *body= filp->Body; unsigned int i; bool ismul= false, x= (tty == TYPE_AM_MYX || tty == TYPE_AM_XDBC); @@ -2582,7 +2643,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) List* arglist= cond_item->argument_list(); List_iterator li(*arglist); - Item *subitem; + const Item *subitem; p1= body + strlen(body); strcpy(p1, "("); @@ -2590,7 +2651,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) for (i= 0; i < arglist->elements; i++) if ((subitem= li++)) { - if (!CheckCond(g, filp, tty, subitem)) { + if (!CheckCond(g, filp, subitem)) { if (vop == OP_OR || nonul) return NULL; else @@ -2612,26 +2673,27 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) } else if (cond->type() == COND::FUNC_ITEM) { unsigned int i; -// int n; bool iscol, neg= FALSE; Item_func *condf= (Item_func *)cond; Item* *args= condf->arguments(); if (trace) htrc("Func type=%d argnum=%d\n", condf->functype(), - condf->argument_count()); - -// neg= condf-> + condf->argument_count()); switch (condf->functype()) { case Item_func::EQUAL_FUNC: - case Item_func::EQ_FUNC: vop= OP_EQ; break; - case Item_func::NE_FUNC: vop= OP_NE; break; - case Item_func::LT_FUNC: vop= OP_LT; break; - case Item_func::LE_FUNC: vop= OP_LE; break; - case Item_func::GE_FUNC: vop= OP_GE; break; - case Item_func::GT_FUNC: vop= OP_GT; break; - case Item_func::IN_FUNC: vop= OP_IN; + case Item_func::EQ_FUNC: vop= OP_EQ; break; + case Item_func::NE_FUNC: vop= OP_NE; break; + case Item_func::LT_FUNC: vop= OP_LT; break; + case Item_func::LE_FUNC: vop= OP_LE; break; + case Item_func::GE_FUNC: vop= OP_GE; break; + case Item_func::GT_FUNC: vop= OP_GT; break; + case Item_func::LIKE_FUNC: vop= OP_LIKE; break; + case Item_func::ISNOTNULL_FUNC: + neg = true; + case Item_func::ISNULL_FUNC: vop= OP_NULL; break; + case Item_func::IN_FUNC: vop= OP_IN; case Item_func::BETWEEN: ismul= true; neg= ((Item_func_opt_neg *)condf)->negated; @@ -2644,7 +2706,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) else if (ismul && tty == TYPE_AM_WMI) return NULL; // Not supported by WQL - if (x && (neg || !(vop == OP_EQ || vop == OP_IN))) + if (x && (neg || !(vop == OP_EQ || vop == OP_IN || vop == OP_NULL))) return NULL; for (i= 0; i < condf->argument_count(); i++) { @@ -2665,9 +2727,10 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) if (x && i) return NULL; - - if (pField->field->table != table) - return NULL; // Field does not belong to this table + else if (pField->field->table != table) + return NULL; // Field does not belong to this table + else if (tty != TYPE_AM_WMI && IsIndexed(pField->field)) + return NULL; // Will be handled by ReadKey else fop= GetFieldOptionStruct(pField->field); @@ -2698,7 +2761,7 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond) strcat(body, fnm); } else if (args[i]->type() == COND::FUNC_ITEM) { if (tty == TYPE_AM_MYSQL) { - if (!CheckCond(g, filp, tty, args[i])) + if (!CheckCond(g, filp, args[i])) return NULL; } else @@ -2887,14 +2950,17 @@ const COND *ha_connect::cond_push(const COND *cond) goto fin; if (b) { - PCFIL filp= (PCFIL)PlugSubAlloc(g, NULL, sizeof(CONDFIL)); + PCFIL filp; + if ((filp= tdbp->GetCondFil()) && filp->Cond == cond && + filp->Idx == active_index && filp->Type == tty) + goto fin; // Already done + + filp= new(g) CONDFIL(cond, active_index, tty); filp->Body= (char*)PlugSubAlloc(g, NULL, (x) ? 128 : 0); *filp->Body= 0; - filp->Op= OP_XX; - filp->Cmds= NULL; - if (CheckCond(g, filp, tty, (Item *)cond)) { + if (CheckCond(g, filp, cond)) { if (trace) htrc("cond_push: %s\n", filp->Body); @@ -3358,13 +3424,13 @@ int ha_connect::index_end() /****************************************************************************/ /* This is internally called by all indexed reading functions. */ /****************************************************************************/ -int ha_connect::ReadIndexed(uchar *buf, OPVAL op, const uchar *key, uint key_len) +int ha_connect::ReadIndexed(uchar *buf, OPVAL op, const key_range *kr) { int rc; //statistic_increment(ha_read_key_count, &LOCK_status); - switch (CntIndexRead(xp->g, tdbp, op, key, (int)key_len, mrr)) { + switch (CntIndexRead(xp->g, tdbp, op, kr, mrr)) { case RC_OK: xp->fnd++; rc= MakeRecord((char*)buf); @@ -3430,7 +3496,12 @@ int ha_connect::index_read(uchar * buf, const uchar * key, uint key_len, htrc("%p index_read: op=%d\n", this, op); if (indexing > 0) { - rc= ReadIndexed(buf, op, key, key_len); + start_key.key= key; + start_key.length= key_len; + start_key.flag= find_flag; + start_key.keypart_map= 0; + + rc= ReadIndexed(buf, op, &start_key); if (rc == HA_ERR_INTERNAL_ERROR) { nox= true; // To block making indexes @@ -3736,7 +3807,7 @@ void ha_connect::position(const uchar *) //if (((PTDBASE)tdbp)->GetDef()->Indexable()) my_store_ptr(ref, ref_length, (my_off_t)((PTDBASE)tdbp)->GetRecpos()); - if (trace) + if (trace > 1) htrc("position: pos=%d\n", ((PTDBASE)tdbp)->GetRecpos()); DBUG_VOID_RETURN; @@ -6648,10 +6719,10 @@ maria_declare_plugin(connect) PLUGIN_LICENSE_GPL, connect_init_func, /* Plugin Init */ connect_done_func, /* Plugin Deinit */ - 0x0103, /* version number (1.03) */ + 0x0104, /* version number (1.04) */ NULL, /* status variables */ connect_system_variables, /* system variables */ - "1.03.0007", /* string version */ + "1.04.0001", /* string version */ MariaDB_PLUGIN_MATURITY_BETA /* maturity */ } maria_declare_plugin_end; diff --git a/storage/connect/ha_connect.h b/storage/connect/ha_connect.h index 611f9ba0b54..05cc872fa2a 100644 --- a/storage/connect/ha_connect.h +++ b/storage/connect/ha_connect.h @@ -241,11 +241,12 @@ public: int MakeRecord(char *buf); int ScanRecord(PGLOBAL g, uchar *buf); int CheckRecord(PGLOBAL g, const uchar *oldbuf, uchar *newbuf); - int ReadIndexed(uchar *buf, OPVAL op, const uchar* key= NULL, - uint key_len= 0); + int ReadIndexed(uchar *buf, OPVAL op, const key_range *kr= NULL); + bool IsIndexed(Field *fp); bool MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL op, char q, - const void *key, int klen); - inline char *Strz(LEX_STRING &ls); + const key_range *kr); + inline char *Strz(LEX_STRING &ls); + key_range start_key; /** @brief @@ -374,7 +375,7 @@ public: condition stack. */ virtual const COND *cond_push(const COND *cond); -PCFIL CheckCond(PGLOBAL g, PCFIL filp, AMT tty, Item *cond); +PCFIL CheckCond(PGLOBAL g, PCFIL filp, const Item *cond); const char *GetValStr(OPVAL vop, bool neg); PFIL CondFilter(PGLOBAL g, Item *cond); //PFIL CheckFilter(PGLOBAL g); diff --git a/storage/connect/mycat.cc b/storage/connect/mycat.cc index 9c72e9cd665..76a00c7e7f6 100644 --- a/storage/connect/mycat.cc +++ b/storage/connect/mycat.cc @@ -299,13 +299,13 @@ int GetIndexType(TABTYPE type) xtyp= 1; break; case TAB_MYSQL: -// case TAB_ODBC: + case TAB_ODBC: xtyp= 2; break; case TAB_VIR: xtyp= 3; break; - case TAB_ODBC: +// case TAB_ODBC: default: xtyp= 0; break; diff --git a/storage/connect/mysql-test/connect/r/endian.result b/storage/connect/mysql-test/connect/r/endian.result new file mode 100644 index 00000000000..a4c81e43b6b --- /dev/null +++ b/storage/connect/mysql-test/connect/r/endian.result @@ -0,0 +1,105 @@ +SET time_zone='+00:00'; +# +# Testing little endian table +# +CREATE TABLE t1 +( +fig INT(4) NOT NULL FIELD_FORMAT='C', +name CHAR(10) NOT NULL, +birth DATE NOT NULL FIELD_FORMAT='L', +id CHAR(5) NOT NULL FIELD_FORMAT='L2', +salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='LF', +dept INT(4) NOT NULL FIELD_FORMAT='L2' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat'; +SELECT * FROM t1; +fig name birth id salary dept +5500 ARCHIBALD 1980-01-25 3789 4380.50 318 +123 OLIVER 1953-08-10 23456 3400.68 2158 +3123 FOO 2002-07-23 888 0.00 318 +INSERT INTO t1 VALUES (5555,'RONALD','1980-02-26','3333',4444.44,555); +SELECT * FROM t1; +fig name birth id salary dept +5500 ARCHIBALD 1980-01-25 3789 4380.50 318 +123 OLIVER 1953-08-10 23456 3400.68 2158 +3123 FOO 2002-07-23 888 0.00 318 +5555 RONALD 1980-02-26 3333 4444.44 555 +DROP TABLE t1; +CREATE TABLE t1 +( +fig INT(4) NOT NULL FIELD_FORMAT='C', +name CHAR(10) NOT NULL, +birth DATE NOT NULL, +id CHAR(5) NOT NULL FIELD_FORMAT='S', +salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', +dept INT(4) NOT NULL FIELD_FORMAT='S' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat' OPTION_LIST='Endian=Little'; +SELECT * FROM t1; +fig name birth id salary dept +5500 ARCHIBALD 1980-01-25 3789 4380.50 318 +123 OLIVER 1953-08-10 23456 3400.68 2158 +3123 FOO 2002-07-23 888 0.00 318 +5555 RONALD 1980-02-26 3333 4444.44 555 +# +# Testing big endian table +# +CREATE TABLE t2 ( +fig INT(4) NOT NULL FIELD_FORMAT='C', +name CHAR(10) NOT NULL, +birth DATE NOT NULL FIELD_FORMAT='B', +id CHAR(5) NOT NULL FIELD_FORMAT='BS', +salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='BF', +dept INT(4) NOT NULL FIELD_FORMAT='B2' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.bin'; +INSERT INTO t2 SELECT * FROM t1; +SELECT * FROM t2; +fig name birth id salary dept +5500 ARCHIBALD 1980-01-25 3789 4380.50 318 +123 OLIVER 1953-08-10 23456 3400.68 2158 +3123 FOO 2002-07-23 888 0.00 318 +5555 RONALD 1980-02-26 3333 4444.44 555 +DROP TABLE t2; +CREATE TABLE t2 ( +fig INT(4) NOT NULL FIELD_FORMAT='C', +name CHAR(10) NOT NULL, +birth DATE NOT NULL, +id CHAR(5) NOT NULL FIELD_FORMAT='S', +salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', +dept INT(4) NOT NULL FIELD_FORMAT='2' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.bin' OPTION_LIST='Endian=Big'; +SELECT * FROM t2; +fig name birth id salary dept +5500 ARCHIBALD 1980-01-25 3789 4380.50 318 +123 OLIVER 1953-08-10 23456 3400.68 2158 +3123 FOO 2002-07-23 888 0.00 318 +5555 RONALD 1980-02-26 3333 4444.44 555 +DROP TABLE t2; +CREATE TABLE t2 ( +fig CHAR(4) NOT NULL, +name CHAR(10) NOT NULL, +birth DATE NOT NULL, +id SMALLINT(5) NOT NULL, +salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', +dept SMALLINT(4) NOT NULL +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.bin' OPTION_LIST='Endian=Big'; +SELECT * FROM t2; +fig name birth id salary dept +5500 ARCHIBALD 1980-01-25 3789 4380.50 318 +123 OLIVER 1953-08-10 23456 3400.68 2158 +3123 FOO 2002-07-23 888 0.00 318 +5555 RONALD 1980-02-26 3333 4444.44 555 +DROP TABLE t2; +CREATE TABLE t2 ( +fig INT(4) NOT NULL FIELD_FORMAT='C', +name CHAR(10) NOT NULL, +birth DATE NOT NULL FIELD_FORMAT='B', +id CHAR(5) NOT NULL FIELD_FORMAT='BS', +salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='BF', +dept SMALLINT(4) NOT NULL FIELD_FORMAT='B' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.bin'; +SELECT * FROM t2; +fig name birth id salary dept +5500 ARCHIBALD 1980-01-25 3789 4380.50 318 +123 OLIVER 1953-08-10 23456 3400.68 2158 +3123 FOO 2002-07-23 888 0.00 318 +5555 RONALD 1980-02-26 3333 4444.44 555 +DROP TABLE t1, t2; diff --git a/storage/connect/mysql-test/connect/r/mysql_index.result b/storage/connect/mysql-test/connect/r/mysql_index.result new file mode 100644 index 00000000000..4ebf10802ae --- /dev/null +++ b/storage/connect/mysql-test/connect/r/mysql_index.result @@ -0,0 +1,114 @@ +# +# Make remote table +# +CREATE TABLE t1 ( +id int(11) NOT NULL, +msg char(100) DEFAULT NULL, +PRIMARY KEY (id) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES(1,'Un'),(3,'Trois'),(5,'Cinq'); +INSERT INTO t1 VALUES(2,'Two'),(4,'Four'),(6,'Six'); +SELECT * FROM t1; +id msg +1 Un +3 Trois +5 Cinq +2 Two +4 Four +6 Six +# +# Make local MYSQL table with indexed id column +# +CREATE TABLE t2 ( +id int(11) NOT NULL, +msg char(100) DEFAULT NULL, +PRIMARY KEY (id) +) ENGINE=CONNECT DEFAULT CHARSET=latin1 TABLE_TYPE=MYSQL TABNAME=t1; +# +# Testing SELECT, etc. +# +SELECT * FROM t2; +id msg +1 Un +3 Trois +5 Cinq +2 Two +4 Four +6 Six +SELECT * FROM t2 WHERE id = 3; +id msg +3 Trois +SELECT * FROM t2 WHERE id IN (2,4); +id msg +2 Two +4 Four +SELECT * FROM t2 WHERE id IN (2,4) AND msg = 'Two'; +id msg +2 Two +SELECT * FROM t2 WHERE id > 3; +id msg +5 Cinq +4 Four +6 Six +SELECT * FROM t2 WHERE id >= 3; +id msg +3 Trois +5 Cinq +4 Four +6 Six +SELECT * FROM t2 WHERE id < 3; +id msg +1 Un +2 Two +SELECT * FROM t2 WHERE id < 3 OR id > 4; +id msg +1 Un +2 Two +5 Cinq +6 Six +SELECT * FROM t2 WHERE id <= 3; +id msg +1 Un +2 Two +3 Trois +SELECT * FROM t2 WHERE id BETWEEN 3 AND 5; +id msg +3 Trois +4 Four +5 Cinq +SELECT * FROM t2 WHERE id > 2 AND id < 6; +id msg +3 Trois +4 Four +5 Cinq +SELECT * FROM t2 ORDER BY id; +id msg +1 Un +2 Two +3 Trois +4 Four +5 Cinq +6 Six +UPDATE t2 SET msg = 'Five' WHERE id = 5; +Warnings: +Note 1105 t1: 1 affected rows +SELECT * FROM t2; +id msg +1 Un +3 Trois +5 Five +2 Two +4 Four +6 Six +DELETE FROM t2 WHERE id = 4; +Warnings: +Note 1105 t1: 1 affected rows +SELECT * FROM t2; +id msg +1 Un +3 Trois +5 Five +2 Two +6 Six +DROP TABLE t2; +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/endian.test b/storage/connect/mysql-test/connect/t/endian.test new file mode 100644 index 00000000000..e5f4a24f52d --- /dev/null +++ b/storage/connect/mysql-test/connect/t/endian.test @@ -0,0 +1,88 @@ +let $MYSQLD_DATADIR= `select @@datadir`; + +--copy_file $MTR_SUITE_DIR/std_data/Testbal.dat $MYSQLD_DATADIR/test/Testbal.dat + +SET time_zone='+00:00'; + +--echo # +--echo # Testing little endian table +--echo # +CREATE TABLE t1 +( + fig INT(4) NOT NULL FIELD_FORMAT='C', + name CHAR(10) NOT NULL, + birth DATE NOT NULL FIELD_FORMAT='L', + id CHAR(5) NOT NULL FIELD_FORMAT='L2', + salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='LF', + dept INT(4) NOT NULL FIELD_FORMAT='L2' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat'; +SELECT * FROM t1; +INSERT INTO t1 VALUES (5555,'RONALD','1980-02-26','3333',4444.44,555); +SELECT * FROM t1; + +DROP TABLE t1; +CREATE TABLE t1 +( + fig INT(4) NOT NULL FIELD_FORMAT='C', + name CHAR(10) NOT NULL, + birth DATE NOT NULL, + id CHAR(5) NOT NULL FIELD_FORMAT='S', + salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', + dept INT(4) NOT NULL FIELD_FORMAT='S' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.dat' OPTION_LIST='Endian=Little'; +SELECT * FROM t1; + +--echo # +--echo # Testing big endian table +--echo # +CREATE TABLE t2 ( + fig INT(4) NOT NULL FIELD_FORMAT='C', + name CHAR(10) NOT NULL, + birth DATE NOT NULL FIELD_FORMAT='B', + id CHAR(5) NOT NULL FIELD_FORMAT='BS', + salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='BF', + dept INT(4) NOT NULL FIELD_FORMAT='B2' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.bin'; +INSERT INTO t2 SELECT * FROM t1; +SELECT * FROM t2; + +DROP TABLE t2; +CREATE TABLE t2 ( + fig INT(4) NOT NULL FIELD_FORMAT='C', + name CHAR(10) NOT NULL, + birth DATE NOT NULL, + id CHAR(5) NOT NULL FIELD_FORMAT='S', + salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', + dept INT(4) NOT NULL FIELD_FORMAT='2' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.bin' OPTION_LIST='Endian=Big'; +SELECT * FROM t2; + +DROP TABLE t2; +CREATE TABLE t2 ( + fig CHAR(4) NOT NULL, + name CHAR(10) NOT NULL, + birth DATE NOT NULL, + id SMALLINT(5) NOT NULL, + salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='F', + dept SMALLINT(4) NOT NULL +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.bin' OPTION_LIST='Endian=Big'; +SELECT * FROM t2; + +DROP TABLE t2; +CREATE TABLE t2 ( + fig INT(4) NOT NULL FIELD_FORMAT='C', + name CHAR(10) NOT NULL, + birth DATE NOT NULL FIELD_FORMAT='B', + id CHAR(5) NOT NULL FIELD_FORMAT='BS', + salary DOUBLE(9,2) NOT NULL DEFAULT 0.00 FIELD_FORMAT='BF', + dept SMALLINT(4) NOT NULL FIELD_FORMAT='B' +) ENGINE=CONNECT TABLE_TYPE=BIN BLOCK_SIZE=5 FILE_NAME='Testbal.bin'; +SELECT * FROM t2; + +DROP TABLE t1, t2; + +# +# Clean up +# +--remove_file $MYSQLD_DATADIR/test/Testbal.dat +--remove_file $MYSQLD_DATADIR/test/Testbal.bin diff --git a/storage/connect/mysql-test/connect/t/mysql_index.test b/storage/connect/mysql-test/connect/t/mysql_index.test new file mode 100644 index 00000000000..9a162b4d8e3 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/mysql_index.test @@ -0,0 +1,66 @@ +-- source include/not_embedded.inc + +# +# TODO: consider a possibility to run this test +# against some remote MySQL server +# + +let $PORT= `select @@port`; + +--disable_query_log +--replace_result $PORT PORT +--error 0,ER_UNKNOWN_ERROR +--eval CREATE TABLE t1 (a INT) ENGINE=CONNECT TABLE_TYPE=MYSQL TABNAME='tx1' OPTION_LIST='host=localhost,user=root,port=$PORT' +if (!`SELECT count(*) FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1' + AND ENGINE='CONNECT' + AND CREATE_OPTIONS LIKE '%`table_type`=MySQL%'`) +{ + Skip Need MySQL support; +} +DROP TABLE t1; +--enable_query_log + +--echo # +--echo # Make remote table +--echo # +CREATE TABLE t1 ( + id int(11) NOT NULL, + msg char(100) DEFAULT NULL, + PRIMARY KEY (id) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES(1,'Un'),(3,'Trois'),(5,'Cinq'); +INSERT INTO t1 VALUES(2,'Two'),(4,'Four'),(6,'Six'); +SELECT * FROM t1; + +--echo # +--echo # Make local MYSQL table with indexed id column +--echo # +CREATE TABLE t2 ( + id int(11) NOT NULL, + msg char(100) DEFAULT NULL, + PRIMARY KEY (id) +) ENGINE=CONNECT DEFAULT CHARSET=latin1 TABLE_TYPE=MYSQL TABNAME=t1; + +--echo # +--echo # Testing SELECT, etc. +--echo # +SELECT * FROM t2; +SELECT * FROM t2 WHERE id = 3; +SELECT * FROM t2 WHERE id IN (2,4); +SELECT * FROM t2 WHERE id IN (2,4) AND msg = 'Two'; +SELECT * FROM t2 WHERE id > 3; +SELECT * FROM t2 WHERE id >= 3; +SELECT * FROM t2 WHERE id < 3; +SELECT * FROM t2 WHERE id < 3 OR id > 4; +SELECT * FROM t2 WHERE id <= 3; +SELECT * FROM t2 WHERE id BETWEEN 3 AND 5; +SELECT * FROM t2 WHERE id > 2 AND id < 6; +SELECT * FROM t2 ORDER BY id; +UPDATE t2 SET msg = 'Five' WHERE id = 5; +SELECT * FROM t2; +DELETE FROM t2 WHERE id = 4; +SELECT * FROM t2; + +DROP TABLE t2; +DROP TABLE t1; diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 19a5dfd758f..658f3513b07 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -1054,14 +1054,14 @@ int TDBMYSQL::SendCommand(PGLOBAL g) /***********************************************************************/ /* Data Base indexed read routine for MYSQL access method. */ /***********************************************************************/ -bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len) +bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) { - bool oom; int oldlen = Query->GetLength(); + PHC hc = To_Def->GetHandler(); - if (!key || op == OP_NEXT || - Mode == MODE_UPDATE || Mode == MODE_DELETE) { - if (!key && Mode == MODE_READX) { + if (!(kr || hc->end_range) || op == OP_NEXT || + Mode == MODE_UPDATE || Mode == MODE_DELETE) { + if (!kr && Mode == MODE_READX) { // This is a false indexed read m_Rc = Myc.ExecSQL(g, Query->GetStr()); Mode = MODE_READ; @@ -1069,37 +1069,39 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len) } // endif key return false; - } else if (op == OP_FIRST) { - if (To_CondFil) { - oom = Query->Append(" WHERE "); - - if ((oom |= Query->Append(To_CondFil->Body))) { - strcpy(g->Message, "Readkey: Out of memory"); - return true; - } // endif oom - - } // endif To_Condfil - } else { if (Myc.m_Res) Myc.FreeResult(); - To_Def->GetHandler()->MakeKeyWhere(g, Query, op, '`', key, len); + if (hc->MakeKeyWhere(g, Query, op, '`', kr)) + return true; if (To_CondFil) { - oom = Query->Append(" AND ("); - oom |= Query->Append(To_CondFil->Body); + if (To_CondFil->Idx != hc->active_index) { + To_CondFil->Idx = hc->active_index; + To_CondFil->Body= (char*)PlugSubAlloc(g, NULL, 0); + *To_CondFil->Body= 0; - if ((oom |= Query->Append(')'))) { - strcpy(g->Message, "Readkey: Out of memory"); - return true; - } // endif oom + if ((To_CondFil = hc->CheckCond(g, To_CondFil, To_CondFil->Cond))) + PlugSubAlloc(g, NULL, strlen(To_CondFil->Body) + 1); - } // endif To_Condfil + } // endif active_index - } // endif's op + if (To_CondFil) + if (Query->Append(" AND ") || Query->Append(To_CondFil->Body)) { + strcpy(g->Message, "Readkey: Out of memory"); + return true; + } // endif Append - m_Rc = Myc.ExecSQL(g, Query->GetStr()); + } // endif To_Condfil + + Mode = MODE_READ; + } // endif's op + + if (trace) + htrc("MYSQL ReadKey: Query=%s\n", Query->GetStr()); + + m_Rc = Myc.ExecSQL(g, Query->GetStr()); Query->Truncate(oldlen); return (m_Rc == RC_FX) ? true : false; } // end of ReadKey diff --git a/storage/connect/tabmysql.h b/storage/connect/tabmysql.h index 17d7b190340..edb15b5cca6 100644 --- a/storage/connect/tabmysql.h +++ b/storage/connect/tabmysql.h @@ -99,7 +99,7 @@ class TDBMYSQL : public TDBASE { virtual int WriteDB(PGLOBAL g); virtual int DeleteDB(PGLOBAL g, int irc); virtual void CloseDB(PGLOBAL g); - virtual bool ReadKey(PGLOBAL g, OPVAL op, const void *key, int len); + virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); // Specific routines bool SetColumnRanks(PGLOBAL g); diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index 307509848f4..b23b981a3f8 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -1,7 +1,7 @@ /************* Tabodbc C++ Program Source Code File (.CPP) *************/ /* PROGRAM NAME: TABODBC */ /* ------------- */ -/* Version 2.9 */ +/* Version 3.0 */ /* */ /* COPYRIGHT: */ /* ---------- */ @@ -35,6 +35,7 @@ /* Include relevant MariaDB header file. */ /***********************************************************************/ #include "my_global.h" +#include "sql_class.h" #if defined(__WIN__) #include #include @@ -72,6 +73,7 @@ #include "reldef.h" #include "tabcol.h" #include "valblk.h" +#include "ha_connect.h" #include "sql_string.h" @@ -386,176 +388,209 @@ int TDBODBC::Decode(char *txt, char *buf, size_t n) /* Note: when implementing EOM filtering, column only used in local */ /* filter should be removed from column list. */ /***********************************************************************/ -char *TDBODBC::MakeSQL(PGLOBAL g, bool cnt) +bool TDBODBC::MakeSQL(PGLOBAL g, bool cnt) { - char *colist, *tabname, *sql, buf[NAM_LEN * 3]; - LPCSTR schmp = NULL, catp = NULL; - int len, ncol = 0; - bool first = true; - PTABLE tablep = To_Table; - PCOL colp; + char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3]; + int len; + bool oom = false, first = true; + PTABLE tablep = To_Table; + PCOL colp; - if (Srcdef) - return Srcdef; + if (Srcdef) { + Query = new(g)STRING(g, 0, Srcdef); + return false; + } // endif Srcdef - if (!cnt) { - // Normal SQL statement to retrieve results - for (colp = Columns; colp; colp = colp->GetNext()) - if (!colp->IsSpecial()) - ncol++; + // Allocate the string used to contain the Query + Query = new(g)STRING(g, 1023, "SELECT "); - if (ncol) { - colist = (char*)PlugSubAlloc(g, NULL, (NAM_LEN + 4) * ncol); + if (!cnt) { + if (Columns) { + // Normal SQL statement to retrieve results + for (colp = Columns; colp; colp = colp->GetNext()) + if (!colp->IsSpecial()) { + if (!first) + oom |= Query->Append(", "); + else + first = false; - for (colp = Columns; colp; colp = colp->GetNext()) - if (!colp->IsSpecial()) { - // Column name can be in UTF-8 encoding - /*rc=*/ Decode(colp->GetName(), buf, sizeof(buf)); + // Column name can be encoded in UTF-8 + Decode(colp->GetName(), buf, sizeof(buf)); - if (Quote) { - if (first) { - strcat(strcat(strcpy(colist, Quote), buf), Quote); - first = false; - } else - strcat(strcat(strcat(strcat(colist, ", "), - Quote), buf), Quote); + if (Quote) { + // Put column name between identifier quotes in case in contains blanks + oom |= Query->Append(Quote); + oom |= Query->Append(buf); + oom |= Query->Append(Quote); + } else + oom |= Query->Append(buf); - } else { - if (first) { - strcpy(colist, buf); - first = false; - } else - strcat(strcat(colist, ", "), buf); + } // endif colp - } // endif Quote - - } // endif !Special - - } else { - // ncol == 0 can occur for queries such that sql count(*) from... + } else + // !Columns can occur for queries such that sql count(*) from... // for which we will count the rows from sql * from... - colist = (char*)PlugSubAlloc(g, NULL, 2); - strcpy(colist, "*"); - } // endif ncol + oom |= Query->Append('*'); - } else { + } else // SQL statement used to retrieve the size of the result - colist = (char*)PlugSubAlloc(g, NULL, 9); - strcpy(colist, "count(*)"); - } // endif cnt + oom |= Query->Append("count(*)"); - // Table name can be encoded in UTF-8 - /*rc = */Decode(TableName, buf, sizeof(buf)); - - // Put table name between identifier quotes in case in contains blanks - tabname = (char*)PlugSubAlloc(g, NULL, strlen(buf) + 3); - - if (Quote) - strcat(strcat(strcpy(tabname, Quote), buf), Quote); - else - strcpy(tabname, buf); - - // Below 14 is length of 'select ' + length of ' from ' + 1 - len = (strlen(colist) + strlen(buf) + 14); - len += (To_CondFil ? strlen(To_CondFil->Body) + 7 : 0); + oom |= Query->Append(" FROM "); if (Catalog && *Catalog) catp = Catalog; - if (catp) - len += (strlen(catp) + 2); - if (tablep->GetSchema()) - schmp = tablep->GetSchema(); + schmp = (char*)tablep->GetSchema(); else if (Schema && *Schema) schmp = Schema; - if (schmp) - len += (strlen(schmp) + 1); - - sql = (char*)PlugSubAlloc(g, NULL, len); - strcat(strcat(strcpy(sql, "SELECT "), colist), " FROM "); - if (catp) { - strcat(sql, catp); + oom |= Query->Append(catp); - if (schmp) - strcat(strcat(sql, "."), schmp); - else - strcat(sql, "."); + if (schmp) { + oom |= Query->Append('.'); + oom |= Query->Append(schmp); + } // endif schmp - strcat(sql, "."); - } else if (schmp) - strcat(strcat(sql, schmp), "."); + oom |= Query->Append('.'); + } else if (schmp) { + oom |= Query->Append(schmp); + oom |= Query->Append('.'); + } // endif schmp - strcat(sql, tabname); + // Table name can be encoded in UTF-8 + Decode(TableName, buf, sizeof(buf)); - if (To_CondFil) - strcat(strcat(sql, " WHERE "), To_CondFil->Body); - - if (trace) - htrc("sql: '%s'\n", sql); + if (Quote) { + // Put table name between identifier quotes in case in contains blanks + oom |= Query->Append(Quote); + oom |= Query->Append(buf); + oom |= Query->Append(Quote); + } else + oom |= Query->Append(buf); - return sql; + len = Query->GetLength(); + + if (To_CondFil) { + if (Mode == MODE_READ) { + oom |= Query->Append(" WHERE "); + oom |= Query->Append(To_CondFil->Body); + len = Query->GetLength() + 1; + } else + len += (strlen(To_CondFil->Body) + 256); + + } else + len += ((Mode == MODE_READX) ? 256 : 1); + + if (oom || Query->Resize(len)) { + strcpy(g->Message, "MakeSQL: Out of memory"); + return true; + } // endif oom + + if (trace) + htrc("Query=%s\n", Query->GetStr()); + + return false; } // end of MakeSQL /***********************************************************************/ /* MakeInsert: make the Insert statement used with ODBC connection. */ /***********************************************************************/ -char *TDBODBC::MakeInsert(PGLOBAL g) +bool TDBODBC::MakeInsert(PGLOBAL g) { - char *stmt, *colist, *valist, buf[NAM_LEN * 3]; -// char *tk = "`"; - int len = 0; - bool b = FALSE; - PCOL colp; + char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3]; + int len = 0; + bool b = false, oom; + PTABLE tablep = To_Table; + PCOL colp; for (colp = Columns; colp; colp = colp->GetNext()) if (colp->IsSpecial()) { strcpy(g->Message, MSG(NO_ODBC_SPECOL)); - return NULL; + return true; } else { - len += (strlen(colp->GetName()) + 4); + // Column name can be encoded in UTF-8 + Decode(colp->GetName(), buf, sizeof(buf)); + len += (strlen(buf) + 6); // comma + quotes + valist ((PODBCCOL)colp)->Rank = ++Nparm; } // endif colp - colist = (char*)PlugSubAlloc(g, NULL, len); - *colist = '\0'; - valist = (char*)PlugSubAlloc(g, NULL, 2 * Nparm); - *valist = '\0'; + // Below 32 is enough to contain the fixed part of the query + if (Catalog && *Catalog) + catp = Catalog; - for (colp = Columns; colp; colp = colp->GetNext()) { - if (b) { - strcat(colist, ", "); - strcat(valist, ","); - } else - b = true; + if (catp) + len += strlen(catp) + 1; - // Column name can be in UTF-8 encoding - Decode(colp->GetName(), buf, sizeof(buf)); + if (tablep->GetSchema()) + schmp = (char*)tablep->GetSchema(); + else if (Schema && *Schema) + schmp = Schema; - if (Quote) - strcat(strcat(strcat(colist, Quote), buf), Quote); - else - strcat(colist, buf); + if (schmp) + len += strlen(schmp) + 1; - strcat(valist, "?"); // Parameter marker - } // endfor colp + // Column name can be encoded in UTF-8 + Decode(TableName, buf, sizeof(buf)); + len += (strlen(buf) + 32); + Query = new(g) STRING(g, len, "INSERT INTO "); - // Below 32 is enough to contain the fixed part of the query - len = (strlen(TableName) + strlen(colist) + strlen(valist) + 32); - stmt = (char*)PlugSubAlloc(g, NULL, len); - strcpy(stmt, "INSERT INTO "); + if (catp) { + oom |= Query->Append(catp); - if (Quote) - strcat(strcat(strcat(stmt, Quote), TableName), Quote); - else - strcat(stmt, TableName); + if (schmp) { + oom |= Query->Append('.'); + oom |= Query->Append(schmp); + } // endif schmp - strcat(strcat(strcat(stmt, " ("), colist), ") VALUES ("); - strcat(strcat(stmt, valist), ")"); + oom |= Query->Append('.'); + } else if (schmp) { + oom |= Query->Append(schmp); + oom |= Query->Append('.'); + } // endif schmp - return stmt; + if (Quote) { + // Put table name between identifier quotes in case in contains blanks + oom |= Query->Append(Quote); + oom |= Query->Append(buf); + oom |= Query->Append(Quote); + } else + oom |= Query->Append(buf); + + oom |= Query->Append('('); + + for (colp = Columns; colp; colp = colp->GetNext()) { + if (b) + oom |= Query->Append(", "); + else + b = true; + + // Column name can be in UTF-8 encoding + Decode(colp->GetName(), buf, sizeof(buf)); + + if (Quote) { + // Put column name between identifier quotes in case in contains blanks + oom |= Query->Append(Quote); + oom |= Query->Append(buf); + oom |= Query->Append(Quote); + } else + oom |= Query->Append(buf); + + } // endfor colp + + oom |= Query->Append(") VALUES ("); + + for (int i = 0; i < Nparm; i++) + oom |= Query->Append("?,"); + + if (oom) + strcpy(g->Message, "MakeInsert: Out of memory"); + else + Query->RepLast(')'); + + return oom; } // end of MakeInsert /***********************************************************************/ @@ -580,7 +615,7 @@ bool TDBODBC::BindParameters(PGLOBAL g) /* MakeCommand: make the Update or Delete statement to send to the */ /* MySQL server. Limited to remote values and filtering. */ /***********************************************************************/ -char *TDBODBC::MakeCommand(PGLOBAL g) +bool TDBODBC::MakeCommand(PGLOBAL g) { char *p, *stmt, name[68], *body = NULL, *qc = Ocp->GetQuoteChar(); char *qrystr = (char*)PlugSubAlloc(g, NULL, strlen(Qrystr) + 1); @@ -638,7 +673,8 @@ char *TDBODBC::MakeCommand(PGLOBAL g) return NULL; } // endif p - return stmt; + Query = new(g) STRING(g, 0, stmt); + return (!Query->GetSize()); } // end of MakeCommand #if 0 @@ -815,10 +851,12 @@ bool TDBODBC::OpenDB(PGLOBAL g) if (Memory < 3) { // Method will depend on cursor type - if ((Rbuf = Ocp->Rewind(Query, (PODBCCOL)Columns)) < 0) { - Ocp->Close(); - return true; - } // endif Rewind + if ((Rbuf = Ocp->Rewind(Query->GetStr(), (PODBCCOL)Columns)) < 0) + if (Mode != MODE_READX) { + Ocp->Close(); + return true; + } else + Rbuf = 0; } else Rbuf = Qrp->Nblin; @@ -853,15 +891,14 @@ bool TDBODBC::OpenDB(PGLOBAL g) /*********************************************************************/ if (Mode == MODE_READ || Mode == MODE_READX) { if (Memory > 1 && !Srcdef) { - char *Sql; - int n; + int n; - if ((Sql = MakeSQL(g, true))) { + if (!MakeSQL(g, true)) { // Allocate a Count(*) column Cnp = new(g) ODBCCOL; Cnp->InitValue(g); - if ((n = Ocp->GetResultSize(Sql, Cnp)) < 0) { + if ((n = Ocp->GetResultSize(Query->GetStr(), Cnp)) < 0) { strcpy(g->Message, "Cannot get result size"); return true; } // endif n @@ -871,36 +908,36 @@ bool TDBODBC::OpenDB(PGLOBAL g) if ((Qrp = Ocp->AllocateResult(g))) Memory = 2; // Must be filled else { - strcpy(g->Message, "Memory allocation failed"); + strcpy(g->Message, "Result set memory allocation failed"); return true; } // endif n Ocp->m_Rows = 0; - } else { - strcpy(g->Message, "MakeSQL failed"); + } else return true; - } // endif Sql } // endif Memory - if ((Query = MakeSQL(g, false))) { + if (!(rc = MakeSQL(g, false))) { for (PODBCCOL colp = (PODBCCOL)Columns; colp; colp = (PODBCCOL)colp->GetNext()) if (!colp->IsSpecial()) colp->AllocateBuffers(g, Rows); - rc = ((Rows = Ocp->ExecDirectSQL(Query, (PODBCCOL)Columns)) < 0); - } // endif Query + rc = (Mode == MODE_READ) + ? ((Rows = Ocp->ExecDirectSQL(Query->GetStr(), (PODBCCOL)Columns)) < 0) + : false; + } // endif rc } else if (Mode == MODE_INSERT) { - if ((Query = MakeInsert(g))) { - if (Nparm != Ocp->PrepareSQL(Query)) { + if (!(rc = MakeInsert(g))) { + if (Nparm != Ocp->PrepareSQL(Query->GetStr())) { strcpy(g->Message, MSG(PARM_CNT_MISS)); rc = true; } else rc = BindParameters(g); - } // endif Query + } // endif rc } else if (Mode == MODE_UPDATE || Mode == MODE_DELETE) { rc = false; // wait for CheckCond before calling MakeCommand(g); @@ -958,6 +995,59 @@ bool TDBODBC::SetRecpos(PGLOBAL g, int recpos) return false; } // end of SetRecpos +/***********************************************************************/ +/* Data Base indexed read routine for MYSQL access method. */ +/***********************************************************************/ +bool TDBODBC::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) +{ + char c = Quote ? *Quote : 0; + int oldlen = Query->GetLength(); + PHC hc = To_Def->GetHandler(); + + if (!(kr || hc->end_range) || op == OP_NEXT || + Mode == MODE_UPDATE || Mode == MODE_DELETE) { + if (!kr && Mode == MODE_READX) { + // This is a false indexed read + Rows = Ocp->ExecDirectSQL((char*)Query->GetStr(), (PODBCCOL)Columns); + Mode = MODE_READ; + return (Rows < 0); + } // endif key + + return false; + } else { + if (To_Def->GetHandler()->MakeKeyWhere(g, Query, op, c, kr)) + return true; + + if (To_CondFil) { + if (To_CondFil->Idx != hc->active_index) { + To_CondFil->Idx = hc->active_index; + To_CondFil->Body= (char*)PlugSubAlloc(g, NULL, 0); + *To_CondFil->Body= 0; + + if ((To_CondFil = hc->CheckCond(g, To_CondFil, To_CondFil->Cond))) + PlugSubAlloc(g, NULL, strlen(To_CondFil->Body) + 1); + + } // endif active_index + + if (To_CondFil) + if (Query->Append(" AND ") || Query->Append(To_CondFil->Body)) { + strcpy(g->Message, "Readkey: Out of memory"); + return true; + } // endif Append + + } // endif To_Condfil + + Mode = MODE_READ; + } // endif's op + + if (trace) + htrc("ODBC ReadKey: Query=%s\n", Query->GetStr()); + + Rows = Ocp->ExecDirectSQL((char*)Query->GetStr(), (PODBCCOL)Columns); + Query->Truncate(oldlen); + return (Rows < 0); +} // end of ReadKey + /***********************************************************************/ /* VRDNDOS: Data Base read routine for odbc access method. */ /***********************************************************************/ @@ -970,11 +1060,11 @@ int TDBODBC::ReadDB(PGLOBAL g) GetTdb_No(), Mode, To_Key_Col, To_Link, To_Kindex); if (Mode == MODE_UPDATE || Mode == MODE_DELETE) { - if (!Query && !(Query = MakeCommand(g))) + if (!Query && MakeCommand(g)) return RC_FX; // Send the UPDATE/DELETE command to the remote table - if (!Ocp->ExecSQLcommand(Query)) { + if (!Ocp->ExecSQLcommand(Query->GetStr())) { sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); if (trace) @@ -1052,11 +1142,11 @@ int TDBODBC::WriteDB(PGLOBAL g) int TDBODBC::DeleteDB(PGLOBAL g, int irc) { if (irc == RC_FX) { - if (!Query && !(Query = MakeCommand(g))) + if (!Query && MakeCommand(g)) return RC_FX; // Send the DELETE (all) command to the remote table - if (!Ocp->ExecSQLcommand(Query)) { + if (!Ocp->ExecSQLcommand(Query->GetStr())) { sprintf(g->Message, "%s: %d affected rows", TableName, AftRows); if (trace) @@ -1272,7 +1362,7 @@ void ODBCCOL::ReadColumn(PGLOBAL g) if (Value->IsZero()) Value->SetNull(Nullable); - if (trace) { + if (trace > 1) { char buf[64]; htrc("ODBC Column %s: rows=%d buf=%p type=%d value=%s\n", @@ -1560,9 +1650,12 @@ bool TDBXDBC::OpenDB(PGLOBAL g) int TDBXDBC::ReadDB(PGLOBAL g) { if (Cmdlist) { - Query = Cmdlist->Cmd; + if (!Query) + Query = new(g)STRING(g, 0, Cmdlist->Cmd); + else + Query->Set(Cmdlist->Cmd); - if (Ocp->ExecSQLcommand(Query)) + if (Ocp->ExecSQLcommand(Query->GetStr())) Nerr++; Fpos++; // Used for progress info @@ -1620,10 +1713,10 @@ void XSRCCOL::ReadColumn(PGLOBAL g) PTDBXDBC tdbp = (PTDBXDBC)To_Tdb; switch (Flag) { - case 0: Value->SetValue_psz(tdbp->Query); break; - case 1: Value->SetValue(tdbp->AftRows); break; - case 2: Value->SetValue_psz(g->Message); break; - default: Value->SetValue_psz("Invalid Flag"); break; + case 0: Value->SetValue_psz(tdbp->Query->GetStr()); break; + case 1: Value->SetValue(tdbp->AftRows); break; + case 2: Value->SetValue_psz(g->Message); break; + default: Value->SetValue_psz("Invalid Flag"); break; } // endswitch Flag } // end of ReadColumn diff --git a/storage/connect/tabodbc.h b/storage/connect/tabodbc.h index b8c9d85aae5..6440dee830d 100644 --- a/storage/connect/tabodbc.h +++ b/storage/connect/tabodbc.h @@ -42,7 +42,8 @@ class DllExport ODBCDEF : public TABDEF { /* Logical table description */ int GetOptions(void) {return Options;} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); + virtual int Indexable(void) {return 2;} + virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); virtual PTDB GetTable(PGLOBAL g, MODE m); protected: @@ -111,15 +112,14 @@ class TDBODBC : public TDBASE { virtual int WriteDB(PGLOBAL g); virtual int DeleteDB(PGLOBAL g, int irc); virtual void CloseDB(PGLOBAL g); - virtual bool ReadKey(PGLOBAL g, OPVAL op, const void *key, int len) - {return true;} + virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); protected: // Internal functions int Decode(char *utf, char *buf, size_t n); - char *MakeSQL(PGLOBAL g, bool cnt); - char *MakeInsert(PGLOBAL g); - char *MakeCommand(PGLOBAL g); + bool MakeSQL(PGLOBAL g, bool cnt); + bool MakeInsert(PGLOBAL g); + bool MakeCommand(PGLOBAL g); //bool MakeFilter(PGLOBAL g, bool c); bool BindParameters(PGLOBAL g); //char *MakeUpdate(PGLOBAL g); @@ -129,14 +129,14 @@ class TDBODBC : public TDBASE { ODBConn *Ocp; // Points to an ODBC connection class ODBCCOL *Cnp; // Points to count(*) column ODBCPARM Ops; // Additional parameters - char *Connect; // Points to connection string + PSTRG Query; // Constructed SQL query + char *Connect; // Points to connection string char *TableName; // Points to ODBC table name char *Schema; // Points to ODBC table Schema char *User; // User connect info char *Pwd; // Password connect info char *Catalog; // Points to ODBC table Catalog char *Srcdef; // The source table SQL definition - char *Query; // Points to SQL statement char *Count; // Points to count(*) SQL statement //char *Where; // Points to local where clause char *Quote; // The identifier quoting character diff --git a/storage/connect/xobject.cpp b/storage/connect/xobject.cpp index 92bf039c07c..c2d77e206cb 100644 --- a/storage/connect/xobject.cpp +++ b/storage/connect/xobject.cpp @@ -290,14 +290,14 @@ bool STRING::Set(char *s, uint n) } // end of Set /***********************************************************************/ -/* Append a char* to a STRING. */ +/* Append a char* to a STRING. */ /***********************************************************************/ -bool STRING::Append(const char *s, uint ln) +bool STRING::Append(const char *s, uint ln, bool nq) { if (!s) return false; - uint len = Length + ln + 1; + uint i, len = Length + ln + 1; if (len > Size) { char *p = Realloc(len); @@ -311,8 +311,22 @@ bool STRING::Append(const char *s, uint ln) } // endif n - strncpy(Strp + Length, s, ln); - Length = len - 1; + if (nq) { + for (i = 0; i < ln; i++) + switch (s[i]) { + case '\\': Strp[Length++] = '\\'; Strp[Length++] = '\\'; break; + case '\0': Strp[Length++] = '\\'; Strp[Length++] = '0'; break; + case '\'': Strp[Length++] = '\\'; Strp[Length++] = '\''; break; + case '\n': Strp[Length++] = '\\'; Strp[Length++] = 'n'; break; + case '\r': Strp[Length++] = '\\'; Strp[Length++] = 'r'; break; + case '\032': Strp[Length++] = '\\'; Strp[Length++] = 'Z'; break; + default: Strp[Length++] = s[i]; + } // endswitch s[i] + + } else + for (i = 0; i < ln && s[i]; i++) + Strp[Length++] = s[i]; + Strp[Length] = 0; return false; } // end of Append diff --git a/storage/connect/xobject.h b/storage/connect/xobject.h index 82ff9e21225..d78cd09f9a4 100644 --- a/storage/connect/xobject.h +++ b/storage/connect/xobject.h @@ -134,7 +134,7 @@ class DllExport STRING : public BLOCK { inline void Reset(void) {*Strp = 0;} bool Set(PSZ s); bool Set(char *s, uint n); - bool Append(const char *s, uint ln); + bool Append(const char *s, uint ln, bool nq = false); bool Append(PSZ s); bool Append(STRING &str); bool Append(char c); diff --git a/storage/connect/xtable.h b/storage/connect/xtable.h index 1a75d97bafa..e18a08a54b8 100644 --- a/storage/connect/xtable.h +++ b/storage/connect/xtable.h @@ -19,6 +19,7 @@ #include "m_ctype.h" typedef class CMD *PCMD; +typedef struct st_key_range key_range; // Commands executed by XDBC and MYX tables class CMD : public BLOCK { @@ -32,12 +33,24 @@ class CMD : public BLOCK { }; // end of class CMD // Condition filter structure -typedef struct _cond_filter { - char *Body; - OPVAL Op; - PCMD Cmds; -} CONDFIL, *PCFIL; +class CONDFIL : public BLOCK { + public: + // Constructor + CONDFIL(const Item *cond, uint idx, AMT type) + { + Cond = cond; Idx = idx; Type = type; Body = NULL; Op = OP_XX; Cmds = NULL; + } + // Members + const Item *Cond; + AMT Type; + uint Idx; + char *Body; + OPVAL Op; + PCMD Cmds; +}; // end of class CONDFIL + +typedef class CONDFIL *PCFIL; typedef class TDBCAT *PTDBCAT; typedef class CATCOL *PCATCOL; @@ -109,7 +122,7 @@ class DllExport TDB: public BLOCK { // Table Descriptor Block. virtual int DeleteDB(PGLOBAL, int) = 0; virtual void CloseDB(PGLOBAL) = 0; virtual int CheckWrite(PGLOBAL) {return 0;} - virtual bool ReadKey(PGLOBAL, OPVAL, const void *, int) = 0; + virtual bool ReadKey(PGLOBAL, OPVAL, const key_range *) = 0; protected: // Members @@ -188,7 +201,7 @@ class DllExport TDBASE : public TDB { virtual void MarkDB(PGLOBAL g, PTDB tdb2); virtual int MakeIndex(PGLOBAL g, PIXDEF, bool) {strcpy(g->Message, "Remote index"); return RC_INFO;} - virtual bool ReadKey(PGLOBAL, OPVAL, const void *, int) + virtual bool ReadKey(PGLOBAL, OPVAL, const key_range *) {assert(false); return true;} protected: From 3b040a06ede62553560bd374b727c6187e5629a7 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Wed, 22 Jul 2015 15:49:38 +0200 Subject: [PATCH 22/39] Fix (?) retrieving integer arguments in JSON UDF's modified: storage/connect/jsonudf.cpp --- storage/connect/jsonudf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index ff4025ee0fb..b2d983712aa 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -261,7 +261,7 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, int i) break; case INT_RESULT: - jvp->SetInteger(g, *(int*)sap); + jvp->SetInteger(g, (int)*(long long*)sap); break; case REAL_RESULT: jvp->SetFloat(g, *(double*)sap); From 55cb3d8b44d6651e587190c49df1247b8ec02628 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Fri, 14 Aug 2015 17:07:50 +0200 Subject: [PATCH 23/39] Add new json UDFs and make possible to use a json file name as json item. modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/jsonudf.cpp modified: storage/connect/mysql-test/connect/r/json_udf.result modified: storage/connect/mysql-test/connect/t/json.test modified: storage/connect/tabjson.cpp Fix wrong calculation of Estimated Length when the table has virtual or special columns modified: storage/connect/reldef.h modified: storage/connect/tabdos.cpp Fix wrong handling of null values in ODBCCOL::ReadColumn modified: storage/connect/tabodbc.cpp Fix crash when SetValue_char is called with a negative length value. This can happen in odbconn.cpp when SQLFetch returns SQL_NO_TOTAL (-4) as length. modified: storage/connect/odbconn.cpp modified: storage/connect/value.cpp --- storage/connect/json.cpp | 174 +- storage/connect/json.h | 36 +- storage/connect/jsonudf.cpp | 2072 +++++++++++++++-- storage/connect/jsonudf.h | 175 ++ .../mysql-test/connect/r/json_udf.result | 13 +- .../mysql-test/connect/std_data/bib0.json | 2 + .../connect/mysql-test/connect/t/json.test | 30 + storage/connect/odbconn.cpp | 6 +- storage/connect/reldef.h | 3 +- storage/connect/tabdos.cpp | 7 +- storage/connect/tabjson.cpp | 21 +- storage/connect/tabodbc.cpp | 4 - storage/connect/value.cpp | 22 +- 13 files changed, 2279 insertions(+), 286 deletions(-) create mode 100644 storage/connect/jsonudf.h create mode 100644 storage/connect/mysql-test/connect/std_data/bib0.json diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 3d03bea5d00..2b339e9e9f6 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -1,5 +1,5 @@ /*************** json CPP Declares Source Code File (.H) ***************/ -/* Name: json.cpp Version 1.1 */ +/* Name: json.cpp Version 1.2 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ /* */ @@ -31,6 +31,7 @@ /***********************************************************************/ /* Parse a json string. */ +/* Note: when pretty is not known, the caller set pretty to 3. */ /***********************************************************************/ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) { @@ -58,21 +59,29 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) goto err; } // endif rc - for (i = 0; i < len; i++) + for (i = 0; i < len; i++) switch (s[i]) { case '[': if (jsp) { - strcpy(g->Message, "More than one item in file"); - goto err; + if (pretty < 3) { + strcpy(g->Message, "More than one item in file"); + goto err; + } else + goto tryit; + } else if (!(jsp = ParseArray(g, ++i, src))) goto err; break; case '{': if (jsp) { - strcpy(g->Message, "More than one item in file"); - goto err; - } else if (!(jsp = ParseObject(g, ++i, src))) + if (pretty < 3) { + strcpy(g->Message, "More than one item in file"); + goto err; + } else + goto tryit; + + } else if (!(jsp = ParseObject(g, ++i, src))) goto err; break; @@ -91,11 +100,6 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) sprintf(g->Message, "Unexpected ',' (pretty=%d)", pretty); goto err; - case '"': - if (!(jsp = ParseValue(g, i, src))) - goto err; - - break; case '(': b = true; break; @@ -106,10 +110,11 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) } // endif b default: - sprintf(g->Message, "Bad '%c' character near %.*s", - s[i], ARGS); - goto err; - }; // endswitch s[i] + if (!(jsp = ParseValue(g, i, src))) + goto err; + + break; + }; // endswitch s[i] if (!jsp) sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); @@ -117,7 +122,13 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) g->jump_level--; return jsp; - err: +tryit: + i = 0; + jsp = ParseArray(g, i, src); + g->jump_level--; + return jsp; + +err: g->jump_level--; return NULL; } // end of ParseJson @@ -130,6 +141,7 @@ PJAR ParseArray(PGLOBAL g, int& i, STRG& src) char *s = src.str; int len = src.len; int level = 0; + bool pty = (!i); PJAR jarp = new(g) JARRAY; PJVAL jvp = NULL; @@ -160,16 +172,21 @@ PJAR ParseArray(PGLOBAL g, int& i, STRG& src) if (level == 2) { sprintf(g->Message, "Unexpected value near %.*s", ARGS); return NULL; - } else if ((jvp = ParseValue(g, i, src))) { + } else if ((jvp = ParseValue(g, i, src))) jarp->AddValue(g, jvp); - level = 2; - } else + else return NULL; - level = 2; + level = (pty) ? 1 : 2; break; }; // endswitch s[i] + if (pty) { + // Case of Pretty == 0 + jarp->InitArray(g); + return jarp; + } // endif pty + strcpy(g->Message, "Unexpected EOF in array"); return NULL; } // end of ParseArray @@ -501,28 +518,37 @@ PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src) /***********************************************************************/ /* Serialize a JSON tree: */ /***********************************************************************/ -PSZ Serialize(PGLOBAL g, PJSON jsp, FILE *fs, int pretty) +PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty) { bool b = false, err = true; JOUT *jp; + FILE *fs = NULL; - g->Message[0] = 0; + g->Message[0] = 0; if (!jsp) { strcpy(g->Message, "Null json tree"); return NULL; - } else if (!fs) { + } else if (!fn) { // Serialize to a string jp = new(g) JOUTSTR(g); b = pretty == 1; - } else if (pretty == 2) { - // Serialize to a pretty file - jp = new(g) JOUTPRT(g, fs); - } else { - // Serialize to a flat file - jp = new(g) JOUTFILE(g, fs); - b = pretty == 1; - } // endif's + } else { + if (!(fs = fopen(fn, "wb"))) { + sprintf(g->Message, MSG(OPEN_MODE_ERROR), + "w", (int)errno, fn); + strcat(strcat(g->Message, ": "), strerror(errno)); + return g->Message; + } else if (pretty >= 2) { + // Serialize to a pretty file + jp = new(g)JOUTPRT(g, fs); + } else { + // Serialize to a flat file + jp = new(g)JOUTFILE(g, fs); + b = pretty == 1; + } // endif's + + } switch (jsp->GetType()) { case TYPE_JAR: @@ -923,6 +949,22 @@ void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key) } // end of SetValue +/***********************************************************************/ +/* Delete a value corresponding to the given key. */ +/***********************************************************************/ +void JOBJECT::DeleteKey(PSZ key) +{ + PJPR jp, *pjp = &First; + + for (jp = First; jp; jp = jp->Next) + if (!strcmp(jp->Key, key)) { + *pjp = jp->Next; + break; + } else + pjp = &jp->Next; + +} // end of DeleteKey + /***********************************************************************/ /* True if void or if all members are nulls. */ /***********************************************************************/ @@ -943,23 +985,25 @@ bool JOBJECT::IsNull(void) void JARRAY::InitArray(PGLOBAL g) { int i; - PJVAL jvp; + PJVAL jvp, *pjvp = &First; for (Size = 0, jvp = First; jvp; jvp = jvp->Next) if (!jvp->Del) Size++; - if (!Size) { - return; - } else if (Size > Alloc) { + if (Size > Alloc) { // No need to realloc after deleting values Mvals = (PJVAL*)PlugSubAlloc(g, NULL, Size * sizeof(PJVAL)); Alloc = Size; } // endif Size for (i = 0, jvp = First; jvp; jvp = jvp->Next) - if (!jvp->Del) - Mvals[i++] = jvp; + if (!jvp->Del) { + Mvals[i++] = jvp; + pjvp = &jvp->Next; + Last = jvp; + } else + *pjvp = jvp->Next; } // end of InitArray @@ -975,31 +1019,45 @@ PJVAL JARRAY::GetValue(int i) } // end of GetValue /***********************************************************************/ -/* Add a Value to the Arrays Value list. */ +/* Add a Value to the Array Value list. */ /***********************************************************************/ -PJVAL JARRAY::AddValue(PGLOBAL g, PJVAL jvp) +PJVAL JARRAY::AddValue(PGLOBAL g, PJVAL jvp, int *x) { if (!jvp) jvp = new(g) JVALUE; - if (Last) - Last->Next = jvp; - else - First = jvp; + if (x) { + int i = 0, n = *x; + PJVAL jp, *jpp = &First; + + for (jp = First; jp && i < n; i++, jp = *(jpp = &jp->Next)); + + (*jpp) = jvp; + + if (!(jvp->Next = jp)) + Last = jvp; + + } else { + if (Last) + Last->Next = jvp; + else + First = jvp; + + Last = jvp; + } // endif x - Last = jvp; return jvp; } // end of AddValue /***********************************************************************/ -/* Add a Value to the Arrays Value list. */ +/* Set the nth Value of the Array Value list. */ /***********************************************************************/ bool JARRAY::SetValue(PGLOBAL g, PJVAL jvp, int n) { int i = 0; PJVAL jp, *jpp = &First; - for (i = 0, jp = First; i < n; i++, jp = *(jpp = &jp->Next)) + for (jp = First; i < n; i++, jp = *(jpp = &jp->Next)) if (!jp) *jpp = jp = new(g) JVALUE; @@ -1092,6 +1150,14 @@ int JVALUE::GetInteger(void) return (Value) ? Value->GetIntValue() : 0; } // end of GetInteger +/***********************************************************************/ +/* Return the Value's Big integer value. */ +/***********************************************************************/ +long long JVALUE::GetBigint(void) +{ + return (Value) ? Value->GetBigintValue() : 0; +} // end of GetBigint + /***********************************************************************/ /* Return the Value's Double value. */ /***********************************************************************/ @@ -1134,7 +1200,15 @@ PSZ JVALUE::GetText(PGLOBAL g, PSZ text) void JVALUE::SetInteger(PGLOBAL g, int n) { Value = AllocateValue(g, &n, TYPE_INT); -} // end of AddInteger +} // end of SetInteger + +/***********************************************************************/ +/* Set the Value's value as the given big integer. */ +/***********************************************************************/ +void JVALUE::SetBigint(PGLOBAL g, long long ll) +{ + Value = AllocateValue(g, &ll, TYPE_BIGINT); +} // end of SetBigint /***********************************************************************/ /* Set the Value's value as the given DOUBLE. */ @@ -1142,7 +1216,7 @@ void JVALUE::SetInteger(PGLOBAL g, int n) void JVALUE::SetFloat(PGLOBAL g, double f) { Value = AllocateValue(g, &f, TYPE_DOUBLE, 6); -} // end of AddFloat +} // end of SetFloat /***********************************************************************/ /* Set the Value's value as the given string. */ @@ -1150,7 +1224,7 @@ void JVALUE::SetFloat(PGLOBAL g, double f) void JVALUE::SetString(PGLOBAL g, PSZ s) { Value = AllocateValue(g, s, TYPE_STRING); -} // end of AddFloat +} // end of SetString /***********************************************************************/ /* True when its JSON or normal value is null. */ diff --git a/storage/connect/json.h b/storage/connect/json.h index da45157f124..bc45e08acce 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -1,5 +1,5 @@ /**************** json H Declares Source Code File (.H) ****************/ -/* Name: json.h Version 1.1 */ +/* Name: json.h Version 1.2 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2014 - 2015 */ /* */ @@ -16,8 +16,9 @@ enum JTYP {TYPE_STRG = 1, TYPE_DBL = 2, TYPE_BOOL = 4, - TYPE_INTG = 7, - TYPE_JSON = 12, + TYPE_BINT = 5, + TYPE_INTG = 7, + TYPE_JSON = 12, TYPE_JAR, TYPE_JOB, TYPE_JVAL}; @@ -40,13 +41,13 @@ typedef struct { int len; } STRG, *PSG; -PJSON ParseJson(PGLOBAL g, char *s, int n, int prty, bool *b = NULL); +PJSON ParseJson(PGLOBAL g, char *s, int n, int prty = 2, bool *b = NULL); PJAR ParseArray(PGLOBAL g, int& i, STRG& src); PJOB ParseObject(PGLOBAL g, int& i, STRG& src); PJVAL ParseValue(PGLOBAL g, int& i, STRG& src); char *ParseString(PGLOBAL g, int& i, STRG& src); PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src); -PSZ Serialize(PGLOBAL g, PJSON jsp, FILE *fs, int pretty); +PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty); bool SerializeArray(JOUT *js, PJAR jarp, bool b); bool SerializeObject(JOUT *js, PJOB jobp); bool SerializeValue(JOUT *js, PJVAL jvp); @@ -118,7 +119,8 @@ class JOUTPRT : public JOUTFILE { /***********************************************************************/ class JPAIR : public BLOCK { friend class JOBJECT; - friend PJOB ParseObject(PGLOBAL, int&, STRG&); + friend class JSNX; + friend PJOB ParseObject(PGLOBAL, int&, STRG&); friend bool SerializeObject(JOUT *, PJOB); public: JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} @@ -145,7 +147,7 @@ class JSON : public BLOCK { virtual JTYP GetType(void) {return TYPE_JSON;} virtual JTYP GetValType(void) {X return TYPE_JSON;} virtual void InitArray(PGLOBAL g) {X} - virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL) {X return NULL;} + virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL) {X return NULL;} virtual PJPR AddPair(PGLOBAL g, PSZ key) {X return NULL;} virtual PJVAL GetValue(const char *key) {X return NULL;} virtual PJOB GetObject(void) {return NULL;} @@ -165,8 +167,9 @@ class JSON : public BLOCK { virtual void SetString(PGLOBAL g, PSZ s) {X} virtual void SetInteger(PGLOBAL g, int n) {X} virtual void SetFloat(PGLOBAL g, double f) {X} - virtual bool DeleteValue(int i) {X return true;} - virtual bool IsNull(void) {X return true;} + virtual void DeleteKey(char *k) {X} + virtual bool DeleteValue(int i) {X return true;} + virtual bool IsNull(void) {X return true;} protected: int Size; @@ -178,6 +181,7 @@ class JSON : public BLOCK { class JOBJECT : public JSON { friend PJOB ParseObject(PGLOBAL, int&, STRG&); friend bool SerializeObject(JOUT *, PJOB); + friend class JSNX; public: JOBJECT(void) : JSON() {First = Last = NULL;} @@ -191,7 +195,8 @@ class JOBJECT : public JSON { virtual PJVAL GetValue(const char* key); virtual PSZ GetText(PGLOBAL g, PSZ text); virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); - virtual bool IsNull(void); + virtual void DeleteKey(char *k); + virtual bool IsNull(void); protected: PJPR First; @@ -211,7 +216,7 @@ class JARRAY : public JSON { virtual void Clear(void) {First = Last = NULL; Size = 0;} virtual JTYP GetType(void) {return TYPE_JAR;} virtual PJAR GetArray(void) {return this;} - virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL); + virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL); virtual void InitArray(PGLOBAL g); virtual PJVAL GetValue(int i); virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); @@ -231,7 +236,8 @@ class JARRAY : public JSON { /***********************************************************************/ class JVALUE : public JSON { friend class JARRAY; - friend PJVAL ParseValue(PGLOBAL, int&, STRG&); + friend class JSNX; + friend PJVAL ParseValue(PGLOBAL, int&, STRG&); friend bool SerializeValue(JOUT *, PJVAL); public: JVALUE(void) : JSON() @@ -251,14 +257,16 @@ class JVALUE : public JSON { virtual PVAL GetValue(void) {return Value;} virtual PJSON GetJson(void) {return (Jsp ? Jsp : this);} virtual int GetInteger(void); - virtual double GetFloat(void); + virtual long long GetBigint(void); + virtual double GetFloat(void); virtual PSZ GetString(void); virtual PSZ GetText(PGLOBAL g, PSZ text); virtual void SetValue(PVAL valp) {Value = valp;} virtual void SetValue(PJSON jsp) {Jsp = jsp;} virtual void SetString(PGLOBAL g, PSZ s); virtual void SetInteger(PGLOBAL g, int n); - virtual void SetFloat(PGLOBAL g, double f); + virtual void SetBigint(PGLOBAL g, longlong ll); + virtual void SetFloat(PGLOBAL g, double f); virtual bool IsNull(void); protected: diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index b2d983712aa..300f294595b 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -1,5 +1,5 @@ /************* jsonudf C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: jsonudf Version 1.0 */ +/* PROGRAM NAME: jsonudf Version 1.1 */ /* (C) Copyright to the author Olivier BERTRAND 2015 */ /* This program are the JSON User Defined Functions . */ /***********************************************************************/ @@ -11,59 +11,909 @@ #include #include #include +#include -#include "global.h" -#include "plgdbsem.h" -#include "json.h" +#include "jsonudf.h" -#define MEMFIX 512 -#define UDF_EXEC_ARGS \ - UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* +#define MEMFIX 4096 +#define PUSH_WARNING(M) \ +push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M) uint GetJsonGrpSize(void); +static int IsJson(UDF_ARGS *args, int i); +static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i); -extern "C" { -DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Value(UDF_EXEC_ARGS); -DllExport void Json_Value_deinit(UDF_INIT*); +/* ------------------------------ JSNX ------------------------------- */ -DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Array(UDF_EXEC_ARGS); -DllExport void Json_Array_deinit(UDF_INIT*); +/***********************************************************************/ +/* JSNX public constructor. */ +/***********************************************************************/ +JSNX::JSNX(PGLOBAL g, PJSON row, int type, int len, int prec) +{ + Row = row; + Value = AllocateValue(g, type, len, prec); + MulVal = NULL; + Nodes = NULL; + Jp = NULL; + Jpath = NULL; + Buf_Type = type; + Long = len; + Prec = prec; + Nod = 0; + Xnod = -1; + B = 0; + Xpd = false; + Parsed = false; +} // end of JSNX constructor -DllExport my_bool Json_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Array_Add(UDF_EXEC_ARGS); -DllExport void Json_Array_Add_deinit(UDF_INIT*); +/***********************************************************************/ +/* SetJpath: set and parse the json path. */ +/***********************************************************************/ +my_bool JSNX::SetJpath(PGLOBAL g, char *path) +{ + // Check Value was allocated + if (!Value) + return true; -DllExport my_bool Json_Array_Delete_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Array_Delete(UDF_EXEC_ARGS); -DllExport void Json_Array_Delete_deinit(UDF_INIT*); + Value->SetNullable(true); + Jpath = path; -DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Object(UDF_EXEC_ARGS); -DllExport void Json_Object_deinit(UDF_INIT*); + // Parse the json path + return ParseJpath(g); +} // end of SetJpath -DllExport my_bool Json_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport char *Json_Object_Nonull(UDF_EXEC_ARGS); -DllExport void Json_Object_Nonull_deinit(UDF_INIT*); +/***********************************************************************/ +/* Check whether this object is expanded. */ +/***********************************************************************/ +my_bool JSNX::CheckExpand(PGLOBAL g, int i, PSZ nm, my_bool b) +{ +#if 0 + if ((Tjp->Xcol && nm && !strcmp(nm, Tjp->Xcol) && + (Tjp->Xval < 0 || Tjp->Xval == i)) || Xpd) { + Xpd = true; // Expandable object + Nodes[i].Op = OP_EXP; + } else if (b) { + strcpy(g->Message, "Cannot expand more than one branch"); + return true; + } // endif Xcol +#endif // 0 -DllExport my_bool Json_Array_Grp_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport void Json_Array_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); -DllExport char *Json_Array_Grp(UDF_EXEC_ARGS); -DllExport void Json_Array_Grp_clear(UDF_INIT *, char *, char *); -DllExport void Json_Array_Grp_deinit(UDF_INIT*); + return false; +} // end of CheckExpand -DllExport my_bool Json_Object_Grp_init(UDF_INIT*, UDF_ARGS*, char*); -DllExport void Json_Object_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); -DllExport char *Json_Object_Grp(UDF_EXEC_ARGS); -DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *); -DllExport void Json_Object_Grp_deinit(UDF_INIT*); -} // extern "C" +/***********************************************************************/ +/* Analyse array processing options. */ +/***********************************************************************/ +my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) +{ + int n = (int)strlen(p); + my_bool dg = true, b = false; + PJNODE jnp = &Nodes[i]; + + if (*p) { + if (p[--n] == ']') { + p[n--] = 0; + p++; + } else { + // Wrong array specification + sprintf(g->Message, +// "Invalid array specification %s for %s", p, Name); + "Invalid array specification %s", p); + return true; + } // endif p + + } else + b = true; + + // To check whether a numeric Rank was specified + for (int k = 0; dg && p[k]; k++) + dg = isdigit(p[k]) > 0; + + if (!n) { + // Default specifications + if (CheckExpand(g, i, nm, false)) + return true; + else if (jnp->Op != OP_EXP) { + if (b) { + // Return 1st value (B is the index base) + jnp->Rank = B; + jnp->Op = OP_EQ; + } else if (!Value->IsTypeNum()) { + jnp->CncVal = AllocateValue(g, (void*)", ", TYPE_STRING); + jnp->Op = OP_CNC; + } else + jnp->Op = OP_ADD; + + } // endif OP + + } else if (dg) { + // Return nth value + jnp->Rank = atoi(p) - B; + jnp->Op = OP_EQ; + } else if (n == 1) { + // Set the Op value; + switch (*p) { + case '+': jnp->Op = OP_ADD; break; + case '*': jnp->Op = OP_MULT; break; + case '>': jnp->Op = OP_MAX; break; + case '<': jnp->Op = OP_MIN; break; + case '!': jnp->Op = OP_SEP; break; // Average + case '#': jnp->Op = OP_NUM; break; + case 'x': + case 'X': // Expand this array + strcpy(g->Message, "Expand not supported by this function"); + return true; +#if 0 + if (!Tjp->Xcol && nm) { + Xpd = true; + jnp->Op = OP_EXP; + Tjp->Xval = i; + Tjp->Xcol = nm; + } else if (CheckExpand(g, i, nm, true)) + return true; + + break; +#endif // 0 + default: + sprintf(g->Message, +// "Invalid function specification %c for %s", *p, Name); + "Invalid function specification %c", *p); + return true; + } // endswitch *p + + } else if (*p == '"' && p[n - 1] == '"') { + // This is a concat specification + jnp->Op = OP_CNC; + + if (n > 2) { + // Set concat intermediate string + p[n - 1] = 0; + jnp->CncVal = AllocateValue(g, p + 1, TYPE_STRING); + } // endif n + + } else { +// sprintf(g->Message, "Wrong array specification for %s", Name); + strcpy(g->Message, "Wrong array specification"); + return true; + } // endif's + + // For calculated arrays, a local Value must be used + switch (jnp->Op) { + case OP_NUM: + jnp->Valp = AllocateValue(g, TYPE_INT); + break; + case OP_ADD: + case OP_MULT: + case OP_SEP: + if (!IsTypeChar(Buf_Type)) + jnp->Valp = AllocateValue(g, Buf_Type, 0, GetPrecision()); + else + jnp->Valp = AllocateValue(g, TYPE_DOUBLE, 0, 2); + + break; + case OP_MIN: + case OP_MAX: + jnp->Valp = AllocateValue(g, Buf_Type, Long, GetPrecision()); + break; + case OP_CNC: + if (IsTypeChar(Buf_Type)) + jnp->Valp = AllocateValue(g, TYPE_STRING, Long, GetPrecision()); + else + jnp->Valp = AllocateValue(g, TYPE_STRING, 512); + + break; + default: + break; + } // endswitch Op + + if (jnp->Valp) + MulVal = AllocateValue(g, jnp->Valp); + + return false; +} // end of SetArrayOptions + +/***********************************************************************/ +/* Parse the eventual passed Jpath information. */ +/* This information can be specified in the Fieldfmt column option */ +/* when creating the table. It permits to indicate the position of */ +/* the node corresponding to that column. */ +/***********************************************************************/ +my_bool JSNX::ParseJpath(PGLOBAL g) +{ + char *p, *p2 = NULL, *pbuf = NULL; + int i; + my_bool mul = false; + + if (Parsed) + return false; // Already done + //else if (InitValue(g)) + // return true; + else if (!Jpath) + // Jpath = Name; + return true; + +#if 0 + if (To_Tdb->GetOrig()) { + // This is an updated column, get nodes from origin + for (PJCOL colp = (PJCOL)Tjp->GetColumns(); colp; + colp = (PJCOL)colp->GetNext()) + if (!stricmp(Name, colp->GetName())) { + Nod = colp->Nod; + Nodes = colp->Nodes; + goto fin; + } // endif Name + + sprintf(g->Message, "Cannot parse updated column %s", Name); + return true; + } // endif To_Orig +#endif // 0 + + pbuf = PlugDup(g, Jpath); + + // The Jpath must be analyzed + for (i = 0, p = pbuf; (p = strchr(p, ':')); i++, p++) + Nod++; // One path node found + + Nodes = (PJNODE)PlugSubAlloc(g, NULL, (++Nod) * sizeof(JNODE)); + memset(Nodes, 0, (Nod)* sizeof(JNODE)); + + // Analyze the Jpath for this column + for (i = 0, p = pbuf; i < Nod; i++, p = (p2 ? p2 + 1 : p + strlen(p))) { + if ((p2 = strchr(p, ':'))) + *p2 = 0; + + // Jpath must be explicit + if (*p == 0 || *p == '[') { + // Analyse intermediate array processing + if (SetArrayOptions(g, p, i, Nodes[i-1].Key)) + return true; + + } else if (*p == '*') { + // Return JSON + Nodes[i].Op = OP_XX; + } else { + Nodes[i].Key = p; + Nodes[i].Op = OP_EXIST; + } // endif's + + } // endfor i, p + +//fin: + MulVal = AllocateValue(g, Value); + Parsed = true; + return false; +} // end of ParseJpath + +/***********************************************************************/ +/* MakeJson: Serialize the json item and set value to it. */ +/***********************************************************************/ +PVAL JSNX::MakeJson(PGLOBAL g, PJSON jsp) +{ + if (Value->IsTypeNum()) { + strcpy(g->Message, "Cannot make Json for a numeric value"); + Value->Reset(); + } else + Value->SetValue_psz(Serialize(g, jsp, NULL, 0)); + + return Value; +} // end of MakeJson + +/***********************************************************************/ +/* SetValue: Set a value from a JVALUE contains. */ +/***********************************************************************/ +void JSNX::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) +{ + if (val) { + switch (val->GetValType()) { + case TYPE_STRG: + case TYPE_INTG: + case TYPE_BINT: + case TYPE_DBL: + vp->SetValue_pval(val->GetValue()); + break; + case TYPE_BOOL: + if (vp->IsTypeNum()) + vp->SetValue(val->GetInteger() ? 1 : 0); + else + vp->SetValue_psz((PSZ)(val->GetInteger() ? "true" : "false")); + + break; + case TYPE_JAR: + SetJsonValue(g, vp, val->GetArray()->GetValue(0), n); + break; + case TYPE_JOB: + // if (!vp->IsTypeNum() || !Strict) { + vp->SetValue_psz(val->GetObject()->GetText(g, NULL)); + break; + // } // endif Type + + default: + vp->Reset(); + } // endswitch Type + + } else { + vp->SetNull(true); + vp->Reset(); + } // endif val + +} // end of SetJsonValue + +/***********************************************************************/ +/* GetJson: */ +/***********************************************************************/ +PJVAL JSNX::GetJson(PGLOBAL g) +{ + return GetValue(g, Row, 0); +} // end of GetJson + +/***********************************************************************/ +/* ReadValue: */ +/***********************************************************************/ +void JSNX::ReadValue(PGLOBAL g) +{ +//if (!Tjp->SameRow || Xnod >= Tjp->SameRow) +// Value->SetValue_pval(GetColumnValue(g, Tjp->Row, 0)); + Value->SetValue_pval(GetColumnValue(g, Row, 0)); + + // Set null when applicable +//if (Nullable) +// Value->SetNull(Value->IsZero()); + +} // end of ReadValue + +/***********************************************************************/ +/* GetColumnValue: */ +/***********************************************************************/ +PVAL JSNX::GetColumnValue(PGLOBAL g, PJSON row, int i) +{ + int n = Nod - 1; +//my_bool expd = false; +//PJAR arp; + PJVAL val = NULL; + +#if 0 + for (; i < Nod && row; i++) { + if (Nodes[i].Op == OP_NUM) { + Value->SetValue(row->GetType() == TYPE_JAR ? row->size() : 1); + return(Value); + } else if (Nodes[i].Op == OP_XX) { + return MakeJson(g, row); + } else switch (row->GetType()) { + case TYPE_JOB: + if (!Nodes[i].Key) { + // Expected Array was not there + if (i < Nod-1) + continue; + else + val = new(g)JVALUE(row); + + } else + val = ((PJOB)row)->GetValue(Nodes[i].Key); + + break; + case TYPE_JAR: + arp = (PJAR)row; + + if (!Nodes[i].Key) { + if (Nodes[i].Op == OP_EQ) + val = arp->GetValue(Nodes[i].Rank); + else if (Nodes[i].Op == OP_EXP) + return ExpandArray(g, arp, i); + else + return CalculateArray(g, arp, i); + + } else if (i < Nod-1) { + strcpy(g->Message, "Unexpected array"); + val = NULL; // Not an expected array + } else + val = arp->GetValue(0); + + break; + case TYPE_JVAL: + val = (PJVAL)row; + break; + default: + sprintf(g->Message, "Invalid row JSON type %d", row->GetType()); + val = NULL; + } // endswitch Type + + if (i < Nod-1) + row = (val) ? val->GetJson() : NULL; + + } // endfor i +#endif // 0 + + val = GetValue(g, row, i); + SetJsonValue(g, Value, val, n); + return Value; +} // end of GetColumnValue + +/***********************************************************************/ +/* GetValue: */ +/***********************************************************************/ +PJVAL JSNX::GetValue(PGLOBAL g, PJSON row, int i) +{ +//int n = Nod - 1; + my_bool expd = false; + PJAR arp; + PJVAL val = NULL; + + for (; i < Nod && row; i++) { + if (Nodes[i].Op == OP_NUM) { + Value->SetValue(row->GetType() == TYPE_JAR ? row->size() : 1); + val = new(g) JVALUE(g, Value); + return val; + } else if (Nodes[i].Op == OP_XX) { + return new(g) JVALUE(g, MakeJson(g, row)); + } else switch (row->GetType()) { + case TYPE_JOB: + if (!Nodes[i].Key) { + // Expected Array was not there + if (i < Nod-1) + continue; + else + val = new(g) JVALUE(row); + + } else + val = ((PJOB)row)->GetValue(Nodes[i].Key); + + break; + case TYPE_JAR: + arp = (PJAR)row; + + if (!Nodes[i].Key) { + if (Nodes[i].Op == OP_EQ) + val = arp->GetValue(Nodes[i].Rank); + else if (Nodes[i].Op == OP_EXP) + return (PJVAL)ExpandArray(g, arp, i); + else + return new(g) JVALUE(g, CalculateArray(g, arp, i)); + + } else if (i < Nod-1) { + strcpy(g->Message, "Unexpected array"); + val = NULL; // Not an expected array + } else + val = arp->GetValue(0); + + break; + case TYPE_JVAL: + val = (PJVAL)row; + break; + default: + sprintf(g->Message, "Invalid row JSON type %d", row->GetType()); + val = NULL; + } // endswitch Type + + if (i < Nod-1) + row = (val) ? val->GetJson() : NULL; + + } // endfor i + + // SetJsonValue(g, Value, val, n); + return val; +} // end of GetValue + +/***********************************************************************/ +/* ExpandArray: */ +/***********************************************************************/ +PVAL JSNX::ExpandArray(PGLOBAL g, PJAR arp, int n) +{ +#if 0 + int ars; + PJVAL jvp; + JVALUE jval; + + ars = MY_MIN(Tjp->Limit, arp->size()); + + if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) { + strcpy(g->Message, "Logical error expanding array"); + longjmp(g->jumper[g->jump_level], 666); + } // endif jvp + + if (n < Nod - 1 && jvp->GetJson()) { + jval.SetValue(GetColumnValue(g, jvp->GetJson(), n + 1)); + jvp = &jval; + } // endif n + + if (n >= Tjp->NextSame) { + if (++Nodes[n].Nx == ars) { + Nodes[n].Nx = 0; + Xnod = 0; + } else + Xnod = n; + + Tjp->NextSame = Xnod; + } // endif NextSame + + SetJsonValue(g, Value, jvp, n); + return Value; +#endif // 0 + strcpy(g->Message, "Expand cannot be done by this function"); + return NULL; +} // end of ExpandArray + +/***********************************************************************/ +/* CalculateArray: */ +/***********************************************************************/ +PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) +{ +//int i, ars, nv = 0, nextsame = Tjp->NextSame; + int i, ars, nv = 0, nextsame = 0; + my_bool err; + OPVAL op = Nodes[n].Op; + PVAL val[2], vp = Nodes[n].Valp; + PJVAL jvrp, jvp; + JVALUE jval; + + vp->Reset(); +//ars = MY_MIN(Tjp->Limit, arp->size()); + ars = arp->size(); + + for (i = 0; i < ars; i++) { + jvrp = arp->GetValue(i); + +// do { + if (n < Nod - 1 && jvrp->GetJson()) { +// Tjp->NextSame = nextsame; + jval.SetValue(GetColumnValue(g, jvrp->GetJson(), n + 1)); + jvp = &jval; + } else + jvp = jvrp; + + if (!nv++) { + SetJsonValue(g, vp, jvp, n); + continue; + } else + SetJsonValue(g, MulVal, jvp, n); + + if (!MulVal->IsZero()) { + switch (op) { + case OP_CNC: + if (Nodes[n].CncVal) { + val[0] = Nodes[n].CncVal; + err = vp->Compute(g, val, 1, op); + } // endif CncVal + + val[0] = MulVal; + err = vp->Compute(g, val, 1, op); + break; + // case OP_NUM: + case OP_SEP: + val[0] = Nodes[n].Valp; + val[1] = MulVal; + err = vp->Compute(g, val, 2, OP_ADD); + break; + default: + val[0] = Nodes[n].Valp; + val[1] = MulVal; + err = vp->Compute(g, val, 2, op); + } // endswitch Op + + if (err) + vp->Reset(); + + } // endif Zero + +// } while (Tjp->NextSame > nextsame); + + } // endfor i + + if (op == OP_SEP) { + // Calculate average + MulVal->SetValue(nv); + val[0] = vp; + val[1] = MulVal; + + if (vp->Compute(g, val, 2, OP_DIV)) + vp->Reset(); + + } // endif Op + +//Tjp->NextSame = nextsame; + return vp; +} // end of CalculateArray + +#if 0 +/***********************************************************************/ +/* GetRow: Get the object containing this column. */ +/***********************************************************************/ +PJSON JSNX::GetRow(PGLOBAL g) +{ + PJVAL val = NULL; + PJAR arp; +//PJSON nwr, row = Tjp->Row; + PJSON nwr, row = Row; + + for (int i = 0; i < Nod-1 && row; i++) { + if (Nodes[i+1].Op == OP_XX) + break; + else switch (row->GetType()) { + case TYPE_JOB: + if (!Nodes[i].Key) + // Expected Array was not there + continue; + + val = ((PJOB)row)->GetValue(Nodes[i].Key); + break; + case TYPE_JAR: + if (!Nodes[i].Key) { + arp = (PJAR)row; + + if (Nodes[i].Op == OP_EQ) + val = arp->GetValue(Nodes[i].Rank); + else + val = arp->GetValue(Nodes[i].Rx); + + } else { + strcpy(g->Message, "Unexpected array"); + val = NULL; // Not an expected array + } // endif Nodes + + break; + case TYPE_JVAL: + val = (PJVAL)row; + break; + default: + sprintf(g->Message, "Invalid row JSON type %d", row->GetType()); + val = NULL; + } // endswitch Type + + if (val) { + row = val->GetJson(); + } else { + // Construct missing objects + for (i++; row && i < Nod; i++) { + if (Nodes[i].Op == OP_XX) + break; + else if (!Nodes[i].Key) + // Construct intermediate array + nwr = new(g)JARRAY; + else + nwr = new(g)JOBJECT; + + if (row->GetType() == TYPE_JOB) { + ((PJOB)row)->SetValue(g, new(g)JVALUE(nwr), Nodes[i-1].Key); + } else if (row->GetType() == TYPE_JAR) { + ((PJAR)row)->AddValue(g, new(g)JVALUE(nwr)); + ((PJAR)row)->InitArray(g); + } else { + strcpy(g->Message, "Wrong type when writing new row"); + nwr = NULL; + } // endif's + + row = nwr; + } // endfor i + + break; + } // endelse + + } // endfor i + + return row; +} // end of GetRow + +/***********************************************************************/ +/* WriteColumn: */ +/***********************************************************************/ +void JSNX::WriteColumn(PGLOBAL g) +{ + /*********************************************************************/ + /* Check whether this node must be written. */ + /*********************************************************************/ + if (Value != To_Val) + Value->SetValue_pval(To_Val, FALSE); // Convert the updated value + + /*********************************************************************/ + /* On INSERT Null values are represented by no node. */ + /*********************************************************************/ + if (Value->IsNull() && Tjp->Mode == MODE_INSERT) + return; + + char *s; + PJOB objp = NULL; + PJAR arp = NULL; + PJVAL jvp = NULL; + PJSON jsp, row = GetRow(g); + JTYP type = row->GetType(); + + switch (row->GetType()) { + case TYPE_JOB: objp = (PJOB)row; break; + case TYPE_JAR: arp = (PJAR)row; break; + case TYPE_JVAL: jvp = (PJVAL)row; break; + default: row = NULL; // ??????????????????????????? + } // endswitch Type + + if (row) switch (Buf_Type) { + case TYPE_STRING: + if (Nodes[Nod-1].Op == OP_XX) { + s = Value->GetCharValue(); + + if (!(jsp = ParseJson(g, s, (int)strlen(s)))) { + strcpy(g->Message, s); + longjmp(g->jumper[g->jump_level], 666); + } // endif jsp + + if (arp) { + if (Nod > 1 && Nodes[Nod-2].Op == OP_EQ) + arp->SetValue(g, new(g)JVALUE(jsp), Nodes[Nod-2].Rank); + else + arp->AddValue(g, new(g)JVALUE(jsp)); + + arp->InitArray(g); + } else if (objp) { + if (Nod > 1 && Nodes[Nod-2].Key) + objp->SetValue(g, new(g)JVALUE(jsp), Nodes[Nod-2].Key); + + } else if (jvp) + jvp->SetValue(jsp); + + break; + } // endif Op + + // Passthru + case TYPE_DATE: + case TYPE_INT: + case TYPE_DOUBLE: + if (arp) { + if (Nodes[Nod-1].Op == OP_EQ) + arp->SetValue(g, new(g)JVALUE(g, Value), Nodes[Nod-1].Rank); + else + arp->AddValue(g, new(g)JVALUE(g, Value)); + + arp->InitArray(g); + } else if (objp) { + if (Nodes[Nod-1].Key) + objp->SetValue(g, new(g)JVALUE(g, Value), Nodes[Nod-1].Key); + + } else if (jvp) + jvp->SetValue(Value); + + break; + default: // ?????????? + sprintf(g->Message, "Invalid column type %d", Buf_Type); + } // endswitch Type + +} // end of WriteColumn +#endif // 0 + +/***********************************************************************/ +/* Locate a value in a JSON tree: */ +/***********************************************************************/ +PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, char *what, +enum Item_result type, unsigned long len) +{ + my_bool b = false, err = true; + + g->Message[0] = 0; + + if (!jsp) { + strcpy(g->Message, "Null json tree"); + return NULL; + } else // Write to the path string + Jp = new(g)JOUTPATH(g, what, type, len); + + switch (jsp->GetType()) { + case TYPE_JAR: + err = LocateArray((PJAR)jsp); + break; + case TYPE_JOB: + err = LocateObject((PJOB)jsp); + break; + case TYPE_JVAL: + err = LocateValue((PJVAL)jsp); + break; + default: + err = true; + } // endswitch Type + + if (err) { + if (!g->Message[0]) + strcpy(g->Message, "Invalid json tree"); + + } else if (Jp->Found) { + Jp->WriteChr('\0'); + PlugSubAlloc(g, NULL, Jp->N); + return Jp->Strp; + } // endif's + + return NULL; +} // end of Locate + +/***********************************************************************/ +/* Locate in a JSON Array. */ +/***********************************************************************/ +my_bool JSNX::LocateArray(PJAR jarp) +{ + char s[16]; + size_t m = Jp->N; + + for (int i = 0; i < jarp->size() && !Jp->Found; i++) { + Jp->N = m; + sprintf(s, "[%d]", i + B); + + if (Jp->WriteStr(s)) + return true; + + if (LocateValue(jarp->GetValue(i))) + return true; + + } // endfor i + + return false; +} // end of LocateArray + +/***********************************************************************/ +/* Locate in a JSON Object. */ +/***********************************************************************/ +my_bool JSNX::LocateObject(PJOB jobp) +{ + size_t m = Jp->N; + + for (PJPR pair = jobp->First; pair && !Jp->Found; pair = pair->Next) { + Jp->N = m; + + if (Jp->WriteStr(pair->Key)) + return true; + + if (LocateValue(pair->Val)) + return true; + + } // endfor i + + return false; +} // end of LocateObject + +/***********************************************************************/ +/* Locate a JSON Value. */ +/***********************************************************************/ +my_bool JSNX::LocateValue(PJVAL jvp) +{ + char *p, buf[32]; + PJAR jap; + PJOB jop; + PVAL valp; + + if ((jap = jvp->GetArray())) { + if (Jp->WriteChr(':')) + return true; + + return LocateArray(jap); + } else if ((jop = jvp->GetObject())) { + if (Jp->WriteChr(':')) + return true; + + return LocateObject(jop); + } else if (!(valp = jvp->Value) || valp->IsNull()) + return false; + else switch (Jp->Type) { + case STRING_RESULT: + p = valp->GetCharString(buf); + Jp->Found = (strlen(p) == Jp->Len && + !strncmp(Jp->What, valp->GetCharString(buf), Jp->Len)); + break; + case INT_RESULT: + Jp->Found = *(longlong*)Jp->What == valp->GetBigintValue(); + break; + case DECIMAL_RESULT: + Jp->Found = atof(Jp->What) == valp->GetFloatValue(); + break; + case REAL_RESULT: + Jp->Found = *(double*)Jp->What == valp->GetFloatValue(); + break; + default: + sprintf(Jp->g->Message, "Invalid type %d", Buf_Type); + return true; + } // endswitch Type + + return false; +} // end of LocateValue + +/* ---------------------------- JSON UDF ----------------------------- */ /***********************************************************************/ /* Allocate and initialise the memory area. */ /***********************************************************************/ -static my_bool JsonInit(UDF_INIT *initid, char *message, +static my_bool JsonInit(UDF_INIT *initid, char *message, my_bool mbn, unsigned long reslen, unsigned long memlen) { PGLOBAL g = PlugInit(NULL, memlen); @@ -78,27 +928,112 @@ static my_bool JsonInit(UDF_INIT *initid, char *message, } else initid->ptr = (char*)g; - initid->maybe_null = false; + initid->maybe_null = mbn; + initid->const_item = false; initid->max_length = reslen; return false; -} // end of Json_Object_init +} // end of Json_init /***********************************************************************/ -/* Returns true if the argument is a JSON string. */ +/* Check if a path was specified and set jvp according to it. */ /***********************************************************************/ -static my_bool IsJson(UDF_ARGS *args, int i) +static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON top, PJVAL& jvp, int n) { - return (args->arg_type[i] == STRING_RESULT && - !strnicmp(args->attributes[i], "Json_", 5)); + for (uint i = n; i < args->arg_count; i++) + if (args->arg_type[i] == STRING_RESULT) { + // A path to a subset of the json tree is given + char *path = MakePSZ(g, args, i); + PJSNX jsx = new(g)JSNX(g, top, TYPE_STRING); + + if (jsx->SetJpath(g, path)) + return true; + + if (!(jvp = jsx->GetJson(g))) { + sprintf(g->Message, "No sub-item at '%s'", path); + return true; + } // endif jvp + + break; + } // endif type + + return false; +} // end of CheckPath + +/***********************************************************************/ +/* Make the result according to the first argument type. */ +/***********************************************************************/ +static char *MakeResult(PGLOBAL g, UDF_ARGS *args, PJSON top, int n = 2) +{ + char *str; + + if (IsJson(args, 0) == 2) { + // Make the change in the json file + char *msg; + int pretty = 2; + + for (uint i = n; i < args->arg_count; i++) + if (args->arg_type[i] == INT_RESULT) { + pretty = (int)*(longlong*)args->args[i]; + break; + } // endif type + + if ((msg = Serialize(g, top, MakePSZ(g, args, 0), pretty))) + PUSH_WARNING(msg); + + str = NULL; + } else if (!(str = Serialize(g, top, NULL, 0))) + PUSH_WARNING(g->Message); + + return str; +} // end of MakeResult + +/***********************************************************************/ +/* Returns not 0 if the argument is a JSON item or file name. */ +/***********************************************************************/ +static int IsJson(UDF_ARGS *args, int i) +{ + int n = 0; + + if (!strnicmp(args->attributes[i], "Json_", 5)) + n = 1; // arg is a json item + else if (args->arg_type[i] == STRING_RESULT && + !strnicmp(args->attributes[i], "Jfile_", 6)) + n = 2; // arg is a json file name + + return n; } // end of IsJson +/***********************************************************************/ +/* GetFileLength: returns file size in number of bytes. */ +/***********************************************************************/ +static long GetFileLength(char *fn) +{ + int h; + long len; + + h= open(fn, _O_RDONLY); + + if (h != -1) { + if ((len = _filelength(h)) < 0) + len = 0; + + close(h); + } else + len = 0; + + return len; +} // end of GetFileLength + /***********************************************************************/ /* Calculate the reslen and memlen needed by a function. */ /***********************************************************************/ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, unsigned long& reslen, unsigned long& memlen) { - unsigned long i, k; + char fn[_MAX_PATH]; + unsigned long i, k, n; + long fl, j = -1; + reslen = args->arg_count + 2; // Calculate the result max length @@ -112,9 +1047,16 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, switch (args->arg_type[i]) { case STRING_RESULT: - if (IsJson(args, i)) + if (IsJson(args, i) == 2 && args->args[i]) { + n = MY_MIN(args->lengths[i], sizeof(fn) - 1); + memcpy(fn, args->args[i], n); + fn[n] = 0; + j = i; + fl = GetFileLength(fn); + reslen += fl; + } else if (IsJson(args, i) == 1) reslen += args->lengths[i]; - else + else reslen += (args->lengths[i] + 1) * 2; // Pessimistic ! break; @@ -153,8 +1095,18 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, switch (args->arg_type[i]) { case STRING_RESULT: - if (IsJson(args, i)) - memlen += args->lengths[i] * 5; // Estimate parse memory + if (IsJson(args, i) == 2 && args->args[i]) { + if ((signed)i != j) { + n = MY_MIN(args->lengths[i], sizeof(fn) - 1); + memcpy(fn, args->args[i], n); + fn[n] = 0; + j = -1; + fl = GetFileLength(fn); + } // endif i + + memlen += fl * 5; + } else if (IsJson(args, i) == 1) + memlen += args->lengths[i] * 5; // Estimate parse memory memlen += sizeof(TYPVAL); break; @@ -178,12 +1130,47 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, return false; } // end of CalcLen +/***********************************************************************/ +/* Check if the calculated memory is enough. */ +/***********************************************************************/ +static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, + uint n, my_bool obj) +{ + unsigned long rl, ml; + + for (uint i = 0; i < n; i++) + if (IsJson(args, i) == 2) { + if (CalcLen(args, obj, rl, ml)) + return true; + else if (ml > g->Sarea_Size) { + free(g->Sarea); + + if (!(g->Sarea = PlugAllocMem(g, ml))) { + char errmsg[256]; + + sprintf(errmsg, MSG(WORK_AREA), g->Message); + strcpy(g->Message, errmsg); + g->Sarea_Size = 0; + return true; + } else + g->Sarea_Size = ml; + + initid->max_length = rl; + } // endif Size + + break; + } // endif IsJson + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + return false; +} // end of CheckMemory + /***********************************************************************/ /* Make a zero terminated string from the passed argument. */ /***********************************************************************/ static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i) { - if (args->args[i]) { + if (args->arg_count > (unsigned)i && args->args[i]) { int n = args->lengths[i]; PSZ s = (PSZ)PlugSubAlloc(g, NULL, n + 1); @@ -200,54 +1187,101 @@ static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i) /***********************************************************************/ static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) { - int n = args->attribute_lengths[i]; - bool b; // true if attribute is zero terminated - PSZ p, s = args->attributes[i]; + if (args->arg_count > (unsigned)i) { + int n = args->attribute_lengths[i]; + my_bool b; // true if attribute is zero terminated + PSZ p, s = args->attributes[i]; - if (s && *s && (n || *s == '\'')) { - if ((b = (!n || !s[n]))) - n = strlen(s); + if (s && *s && (n || *s == '\'')) { + if ((b = (!n || !s[n]))) + n = strlen(s); - if (n > 5 && IsJson(args, i)) { - s += 5; - n -= 5; - } else if (*s == '\'' && s[n-1] == '\'') { - s++; - n -= 2; - b = false; - } // endif *s + if (n > 5 && IsJson(args, i)) { + s += 5; + n -= 5; + } else if (*s == '\'' && s[n-1] == '\'') { + s++; + n -= 2; + b = false; + } // endif *s - if (n < 1) - return "Key"; + if (n < 1) + return "Key"; - if (!b) { - p = (PSZ)PlugSubAlloc(g, NULL, n + 1); - memcpy(p, s, n); - p[n] = 0; - s = p; - } // endif b + if (!b) { + p = (PSZ)PlugSubAlloc(g, NULL, n + 1); + memcpy(p, s, n); + p[n] = 0; + s = p; + } // endif b - } // endif s + } // endif s - return s; + return s; + } // endif count + + return "Key"; } // end of MakeKey +/***********************************************************************/ +/* Return a json file contains. */ +/***********************************************************************/ +static char *GetJsonFile(PGLOBAL g, char *fn) +{ + char *str; + int h, n, len; + + h= open(fn, _O_RDONLY, _O_TEXT); + + if (h == -1) { + sprintf(g->Message, "Error %d opening %s", errno, fn); + return NULL; + } // endif h + + if ((len = _filelength(h)) < 0) { + sprintf(g->Message, MSG(FILELEN_ERROR), "_filelength", fn); + close(h); + return NULL; + } // endif len + + str = (char*)PlugSubAlloc(g, NULL, len + 1); + + if ((n = read(h, str, len)) < 0) { + sprintf(g->Message, "Error %d reading %d bytes from %s", errno, len, fn); + return NULL; + } // endif n + + str[n] = 0; + close(h); + return str; +} // end of GetJsonFile + /***********************************************************************/ /* Make a JSON value from the passed argument. */ /***********************************************************************/ -static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, int i) +static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) { - char *sap = (args->arg_count > (unsigned)i) ? args->args[i] : NULL; + char *sap = (args->arg_count > i) ? args->args[i] : NULL; + int n, len; + long long bigint; PJSON jsp; PJVAL jvp = new(g) JVALUE; if (sap) switch (args->arg_type[i]) { case STRING_RESULT: - if (args->lengths[i]) { - if (IsJson(args, i)) { - if (!(jsp = ParseJson(g, sap, args->lengths[i], 0))) - push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, - g->Message); + if ((len = args->lengths[i])) { + sap = MakePSZ(g, args, i); + + if ((n = IsJson(args, i))) { + if (n == 2) { + if (!(sap = GetJsonFile(g, sap))) + PUSH_WARNING(g->Message); + + len = (sap) ? strlen(sap) : 0; + } // endif n + + if (!(jsp = ParseJson(g, sap, len, 3))) + PUSH_WARNING(g->Message); if (jsp && jsp->GetType() == TYPE_JVAL) jvp = (PJVAL)jsp; @@ -255,13 +1289,19 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, int i) jvp->SetValue(jsp); } else - jvp->SetString(g, MakePSZ(g, args, i)); + jvp->SetString(g, sap); - } // endif str + } // endif len break; case INT_RESULT: - jvp->SetInteger(g, (int)*(long long*)sap); + bigint = *(long long*)sap; + + if (bigint > INT_MAX32 || bigint < INT_MIN32) + jvp->SetFloat(g, (double)bigint); + else + jvp->SetInteger(g, (int)bigint); + break; case REAL_RESULT: jvp->SetFloat(g, *(double*)sap); @@ -292,21 +1332,23 @@ my_bool Json_Value_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, reslen, memlen); + return JsonInit(initid, message, false, reslen, memlen); } // end of Json_Value_init char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *) { char *str; - PJVAL jvp; PGLOBAL g = (PGLOBAL)initid->ptr; - PlugSubSet(g, g->Sarea, g->Sarea_Size); - jvp = MakeValue(g, args, 0); + if (!CheckMemory(g, initid, args, 1, false)) { + PJVAL jvp = MakeValue(g, args, 0); - if (!(str = Serialize(g, jvp, NULL, 0))) - str = strcpy(result, g->Message); + if (!(str = Serialize(g, jvp, NULL, 0))) + str = strcpy(result, g->Message); + + } else + str = strcpy(result, g->Message); *res_length = strlen(str); return str; @@ -325,27 +1367,30 @@ my_bool Json_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, reslen, memlen); + return JsonInit(initid, message, false,reslen, memlen); } // end of Json_Array_init char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *) { char *str; uint i; PJAR arp; PGLOBAL g = (PGLOBAL)initid->ptr; - PlugSubSet(g, g->Sarea, g->Sarea_Size); - arp = new(g) JARRAY; + if (!CheckMemory(g, initid, args, args->arg_count, false)) { + arp = new(g)JARRAY; - for (i = 0; i < args->arg_count; i++) - arp->AddValue(g, MakeValue(g, args, i)); + for (i = 0; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); - arp->InitArray(g); + arp->InitArray(g); - if (!(str = Serialize(g, arp, NULL, 0))) - str = strcpy(result, g->Message); + if (!(str = Serialize(g, arp, NULL, 0))) + str = strcpy(result, g->Message); + + } else + str = strcpy(result, g->Message); *res_length = strlen(str); return str; @@ -357,50 +1402,122 @@ void Json_Array_deinit(UDF_INIT* initid) } // end of Json_Array_deinit /***********************************************************************/ -/* Add values to a Json array. */ +/* Add one or several values to a Json array. */ +/***********************************************************************/ +my_bool Json_Array_Add_Values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Json_Array_Add must have at least 2 arguments"); + return true; + } else if (IsJson(args, 0) != 1) { + strcpy(message, "Json_Array_Add first argument must be a json string"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Array_Add_init + +char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *str = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!CheckMemory(g, initid, args, args->arg_count, false)) { + PJAR arp; + PJVAL jvp = MakeValue(g, args, 0); + + if (jvp->GetValType() != TYPE_JAR) { + arp = new(g)JARRAY; + arp->AddValue(g, jvp); + } else + arp = jvp->GetArray(); + + for (uint i = 1; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); + + arp->InitArray(g); + str = Serialize(g, arp, NULL, 0); + } // endif CheckMemory + + if (!str) { + PUSH_WARNING(g->Message); + str = args->args[0]; + } // endif str + + *res_length = (str) ? strlen(str) : 0; + return str; +} // end of Json_Array_Add_Values + +void Json_Array_Add_Values_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Array_Add_Values_deinit + +/***********************************************************************/ +/* Add one value to a Json array. */ /***********************************************************************/ my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; - if (args->arg_count < 2) { - strcpy(message, "Json_Value_Add must have at least 2 arguments"); + if (args->arg_count < 2) { + strcpy(message, "Json_Array_Add must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Value_Add first argument must be a json item"); + strcpy(message, "Json_Array_Add first argument must be a json item"); return true; - } else + } else CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, reslen, memlen); + return JsonInit(initid, message, true, reslen, memlen); } // end of Json_Array_Add_init char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *) { - char *str; - PJVAL jvp; - PJAR arp; + char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - PlugSubSet(g, g->Sarea, g->Sarea_Size); - jvp = MakeValue(g, args, 0); + if (!CheckMemory(g, initid, args, 2, false)) { + int *x = NULL, n = 2; + PJSON top; + PJVAL jvp; + PJAR arp; - if (jvp->GetValType() != TYPE_JAR) { - arp = new(g) JARRAY; - arp->AddValue(g, jvp); - } else - arp = jvp->GetArray(); + if (args->arg_count > 2) { + if (args->arg_type[2] == INT_RESULT) { + x = (int*)PlugSubAlloc(g, NULL, sizeof(int)); + *x = (int)*(longlong*)args->args[2]; + n = 3; + } else if (!args->args[2]) + n = 3; - for (uint i = 1; i < args->arg_count; i++) - arp->AddValue(g, MakeValue(g, args, i)); + } // endif count - arp->InitArray(g); + jvp = MakeValue(g, args, 0); + top = jvp->GetJson(); - if (!(str = Serialize(g, arp, NULL, 0))) - str = strcpy(result, g->Message); + if (CheckPath(g, args, top, jvp, n)) + PUSH_WARNING(g->Message); + else if (jvp && jvp->GetValType() == TYPE_JAR) { + arp = jvp->GetArray(); + arp->AddValue(g, MakeValue(g, args, 1), x); + arp->InitArray(g); + str = MakeResult(g, args, top, n); + } else + PUSH_WARNING("First argument is not an array"); - *res_length = strlen(str); + } // endif CheckMemory + + // In case of error or file, return unchanged argument + if (!str) + str = args->args[0]; + + *res_length = (str) ? strlen(str) : 0; return str; } // end of Json_Array_Add @@ -416,52 +1533,51 @@ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; - if (args->arg_count != 2) { - strcpy(message, "Json_Value_Delete must have 2 arguments"); + if (args->arg_count < 2) { + strcpy(message, "Json_Array_Delete must have at lest 2 arguments"); return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Value_Delete first argument must be a json item"); - return true; - } else + } else if (!IsJson(args, 0)) { + strcpy(message, "Json_Aray_Delete first argument must be a json item"); + return true; + } else if (args->arg_type[1] != INT_RESULT) { + PUSH_WARNING("Json_Aray_Delete second argument is not an integer (index)"); + return true; + } else CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, reslen, memlen); + return JsonInit(initid, message, true, reslen, memlen); } // end of Json_Array_Delete_init char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *) { - char *str; - int n; - PJVAL jvp; - PJAR arp; + char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - PlugSubSet(g, g->Sarea, g->Sarea_Size); - jvp = MakeValue(g, args, 0); + if (!CheckMemory(g, initid, args, 1, false)) { + int n; + PJAR arp; + PJVAL jvp = MakeValue(g, args, 0); + PJSON top = jvp->GetJson(); - if (jvp->GetValType() != TYPE_JAR) { - push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, - "First argument is not an array"); - str = args->args[0]; - } else if (args->arg_type[1] != INT_RESULT) { - push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, - "Second argument is not an integer"); - str = args->args[0]; - } else { - n = *(int*)args->args[1]; - arp = jvp->GetArray(); - arp->DeleteValue(n); - arp->InitArray(g); + if (CheckPath(g, args, top, jvp, 2)) + PUSH_WARNING(g->Message); + else if (jvp && jvp->GetValType() == TYPE_JAR) { + n = *(int*)args->args[1]; + arp = jvp->GetArray(); + arp->DeleteValue(n); + arp->InitArray(g); + str = MakeResult(g, args, top); + } else + PUSH_WARNING("First argument is not an array"); - if (!(str = Serialize(g, arp, NULL, 0))) { - str = strcpy(result, g->Message); - push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, str); - } // endif str + } // endif CheckMemory - } // endif's + // In case of error or file, return unchanged argument + if (!str) + str = args->args[0]; - *res_length = strlen(str); + *res_length = (str) ? strlen(str) : 0; return str; } // end of Json_Array_Delete @@ -478,27 +1594,28 @@ my_bool Json_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); - return JsonInit(initid, message, reslen, memlen); + return JsonInit(initid, message, false, reslen, memlen); } // end of Json_Object_init char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { - char *str; - uint i; - PJOB objp; + char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - PlugSubSet(g, g->Sarea, g->Sarea_Size); - objp = new(g) JOBJECT; + if (!CheckMemory(g, initid, args, args->arg_count, true)) { + PJOB objp = new(g)JOBJECT; - for (i = 0; i < args->arg_count; i++) - objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); + for (uint i = 0; i < args->arg_count; i++) + objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); - if (!(str = Serialize(g, objp, NULL, 0))) - str = strcpy(result, g->Message); + str = Serialize(g, objp, NULL, 0); + } // endif CheckMemory - *res_length = strlen(str); + if (!str) + str = strcpy(result, g->Message); + + *res_length = strlen(str); return str; } // end of Json_Object @@ -516,29 +1633,30 @@ my_bool Json_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); - return JsonInit(initid, message, reslen, memlen); + return JsonInit(initid, message, false, reslen, memlen); } // end of Json_Object_Nonull_init char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *) { char *str; - uint i; - PJOB objp; - PJVAL jvp; PGLOBAL g = (PGLOBAL)initid->ptr; - PlugSubSet(g, g->Sarea, g->Sarea_Size); - objp = new(g) JOBJECT; + if (!CheckMemory(g, initid, args, args->arg_count, true)) { + PJVAL jvp; + PJOB objp = new(g)JOBJECT; - for (i = 0; i < args->arg_count; i++) - if (!(jvp = MakeValue(g, args, i))->IsNull()) - objp->SetValue(g, jvp, MakeKey(g, args, i)); + for (uint i = 0; i < args->arg_count; i++) + if (!(jvp = MakeValue(g, args, i))->IsNull()) + objp->SetValue(g, jvp, MakeKey(g, args, i)); - if (!(str = Serialize(g, objp, NULL, 0))) - str = strcpy(result, g->Message); + str = Serialize(g, objp, NULL, 0); + } // endif CheckMemory - *res_length = strlen(str); + if (!str) + str = strcpy(result, g->Message); + + *res_length = strlen(str); return str; } // end of Json_Object_Nonull @@ -548,7 +1666,122 @@ void Json_Object_Nonull_deinit(UDF_INIT* initid) } // end of Json_Object_nonull_deinit /***********************************************************************/ -/* Make a Json array from values comming from rows. */ +/* Add or replace a value in a Json Object. */ +/***********************************************************************/ +my_bool Json_Object_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Json_Object_Add must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Json_Object_Add first argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Object_Add_init + +char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *key, *str = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!CheckMemory(g, initid, args, 2, false)) { + PJOB jobp; + PJVAL jvp = MakeValue(g, args, 0); + PJSON top = jvp->GetJson(); + + if (CheckPath(g, args, top, jvp, 2)) + PUSH_WARNING(g->Message); + else if (jvp && jvp->GetValType() == TYPE_JOB) { + jobp = jvp->GetObject(); + jvp = MakeValue(g, args, 1); + key = MakeKey(g, args, 1); + jobp->SetValue(g, jvp, key); + str = MakeResult(g, args, top); + } else + PUSH_WARNING("First argument is not an object"); + + } // endif CheckMemory + + // In case of error or file, return unchanged argument + if (!str) + str = args->args[0]; + + *res_length = (str) ? strlen(str) : 0; + return str; +} // end of Json_Object_Add + +void Json_Object_Add_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Object_Add_deinit + +/***********************************************************************/ +/* Delete a value from a Json object. */ +/***********************************************************************/ +my_bool Json_Object_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Json_Object_Delete must have 2 or 3 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Json_Object_Delete first argument must be a json item"); + return true; + } else if (args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Json_Object_Delete second argument must be a key string"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Object_Delete_init + +char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *str = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!CheckMemory(g, initid, args, 1, false)) { + char *key; + PJOB jobp; + PJVAL jvp = MakeValue(g, args, 0); + PJSON top = jvp->GetJson(); + + if (CheckPath(g, args, top, jvp, 2)) + PUSH_WARNING(g->Message); + else if (jvp && jvp->GetValType() == TYPE_JOB) { + key = MakeKey(g, args, 1); + jobp = jvp->GetObject(); + jobp->DeleteKey(key); + str = MakeResult(g, args, top); + } else + PUSH_WARNING("First argument is not an object"); + + } // endif CheckMemory + + // In case of error or file, return unchanged argument + if (!str) + str = args->args[0]; + + *res_length = (str) ? strlen(str) : 0; + return str; +} // end of Json_Object_Delete + +void Json_Object_Delete_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Object_Delete_deinit + +/***********************************************************************/ +/* Make a Json array from values coming from rows. */ /***********************************************************************/ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { @@ -563,7 +1796,7 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) reslen *= n; memlen += ((memlen - MEMFIX) * (n - 1)); - if (JsonInit(initid, message, reslen, memlen)) + if (JsonInit(initid, message, false, reslen, memlen)) return true; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -592,8 +1825,7 @@ char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, PJAR arp = (PJAR)g->Activityp; if (g->N < 0) - push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, - "Result truncated to json_grp_size values"); + PUSH_WARNING("Result truncated to json_grp_size values"); arp->InitArray(g); @@ -619,7 +1851,7 @@ void Json_Array_Grp_deinit(UDF_INIT* initid) } // end of Json_Array_Grp_deinit /***********************************************************************/ -/* Make a Json object from values comming from rows. */ +/* Make a Json object from values coming from rows. */ /***********************************************************************/ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { @@ -634,7 +1866,7 @@ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) reslen *= n; memlen += ((memlen - MEMFIX) * (n - 1)); - if (JsonInit(initid, message, reslen, memlen)) + if (JsonInit(initid, message, false, reslen, memlen)) return true; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -663,8 +1895,7 @@ char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, PJOB objp = (PJOB)g->Activityp; if (g->N < 0) - push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, - "Result truncated to json_grp_size values"); + PUSH_WARNING("Result truncated to json_grp_size values"); if (!(str = Serialize(g, objp, NULL, 0))) str = strcpy(result, g->Message); @@ -687,4 +1918,469 @@ void Json_Object_Grp_deinit(UDF_INIT* initid) PlugExit((PGLOBAL)initid->ptr); } // end of Json_Object_Grp_deinit +/***********************************************************************/ +/* Get a string value from a Json item. */ +/***********************************************************************/ +my_bool Json_Get_String_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Json_Get_String must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0) && args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Json_Get_String first argument must be a json item"); + return true; + } else if (args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Second argument is not a (jpath) string"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + memlen += 1000; // TODO: calculate this + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Get_String_init + +char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *str = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!CheckMemory(g, initid, args, 1, false)) { + char *p, *path; + PJSON jsp; + PJSNX jsx; + PJVAL jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + path = MakePSZ(g, args, 1); + jsx = new(g)JSNX(g, jsp, TYPE_STRING); + + if (jsx->SetJpath(g, path)) { + PUSH_WARNING(g->Message); + return NULL; + } // endif SetJpath + + jsx->ReadValue(g); + + if (!jsx->GetValue()->IsNull()) + str = jsx->GetValue()->GetCharValue(); + + } // endif CheckMemory + + *res_length = (str) ? strlen(str) : 0; + return str; +} // end of Json_Get_String + +void Json_Get_String_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Get_String_deinit + +/***********************************************************************/ +/* Get an integer value from a Json item. */ +/***********************************************************************/ +my_bool Json_Get_Int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count != 2) { + strcpy(message, "Json_Get_Int must have 2 arguments"); + return true; + } else if (!IsJson(args, 0) && args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Json_Get_Int first argument must be a json item"); + return true; + } else if (args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Second argument is not a (jpath) string"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + memlen += 1000; // TODO: calculate this + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Get_Int_init + +long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!CheckMemory(g, initid, args, 1, false)) { + long long n; + char *p, *path; + PJSON jsp; + PJSNX jsx; + PJVAL jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + path = MakePSZ(g, args, 1); + jsx = new(g)JSNX(g, jsp, TYPE_BIGINT); + + if (jsx->SetJpath(g, path)) { + PUSH_WARNING(g->Message); + return NULL; + } // endif SetJpath + + jsx->ReadValue(g); + + if (jsx->GetValue()->IsNull()) { + PUSH_WARNING("Value not found"); + return NULL; + } // endif IsNull + + n = jsx->GetValue()->GetBigintValue(); + return n; + } else + return NULL; + +} // end of Json_Get_Int + +void Json_Get_Int_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Get_Int_deinit + +/***********************************************************************/ +/* Get a double value from a Json item. */ +/***********************************************************************/ +my_bool Json_Get_Real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Json_Get_Real must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0) && args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Json_Get_Real first argument must be a json item"); + return true; + } else if (args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Second argument is not a (jpath) string"); + return true; + } else if (args->arg_count > 2) { + if (args->arg_type[2] != INT_RESULT) { + strcpy(message, "Third argument is not an integer (decimals)"); + return true; + } else + initid->decimals = (uint)*(longlong*)args->args[2]; + + } else + initid->decimals = 15; + + CalcLen(args, false, reslen, memlen); + memlen += 1000; // TODO: calculate this + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Get_Real_init + +double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!CheckMemory(g, initid, args, 1, false)) { + char *p, *path; + double d; + PJSON jsp; + PJSNX jsx; + PJVAL jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + path = MakePSZ(g, args, 1); + jsx = new(g)JSNX(g, jsp, TYPE_DOUBLE); + + if (jsx->SetJpath(g, path)) { + PUSH_WARNING(g->Message); + return NULL; + } // endif SetJpath + + jsx->ReadValue(g); + + if (jsx->GetValue()->IsNull()) { + PUSH_WARNING("Value not found"); + return NULL; + } // endif IsNull + + d = jsx->GetValue()->GetFloatValue(); + return d; + } else + return NULL; + +} // end of Json_Get_Real + +void Json_Get_Real_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Get_Real_deinit + +/***********************************************************************/ +/* Locate a value in a Json tree. */ +/***********************************************************************/ +my_bool Json_Locate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, more = 1000; + + if (args->arg_count < 2) { + strcpy(message, "Json_Locate must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "Json_Locate first argument must be a json item"); + return true; + } else if (args->arg_count > 2) + if (args->arg_type[2] != INT_RESULT) { + strcpy(message, "Third argument is not an integer (memory)"); + return true; + } else + more = (ulong)*(longlong*)args->args[2]; + + CalcLen(args, false, reslen, memlen); + memlen += more; // TODO: calculate this + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Locate_init + +char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!CheckMemory(g, initid, args, 1, false)) { + char *p, *path = NULL; + int rc; + PJVAL jvp; + PJSON jsp; + PJSNX jsx; + + // Save stack and allocation environment and prepare error return + if (g->jump_level == MAX_JUMP) { + PUSH_WARNING(MSG(TOO_MANY_JUMPS)); + return NULL; + } // endif jump_level + + if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { + PUSH_WARNING(g->Message); + goto err; + } // endif rc + + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + + goto err; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + jsx = new(g)JSNX(g, jsp, TYPE_STRING); + path = jsx->Locate(g, jsp, args->args[1], args->arg_type[1], args->lengths[1]); + + err: + g->jump_level--; + *res_length = (path) ? strlen(path) : 0; + return path; + } else + return NULL; + +} // end of Json_Locate + +void Json_Locate_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Locate_deinit + +/***********************************************************************/ +/* Returns a json file as a string. */ +/***********************************************************************/ +my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, more = 1024; + + if (args->arg_count > 4) { + strcpy(message, "Json_File cannot accept more than 4 arguments"); + return true; + } else if (args->arg_type[0] != STRING_RESULT) { + strcpy(message, "Json_File first argument must be a (string) file name"); + return true; + } else if (args->arg_count > 1 && args->arg_type[1] != INT_RESULT) { + strcpy(message, "Second argument is not an integer (pretty)"); + return true; + } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { + strcpy(message, "Third argument is not an integer (check)"); + return true; + } else if (args->arg_count > 3) { + if (args->arg_type[3] != INT_RESULT) { + strcpy(message, "Fourth argument is not an integer (memory)"); + return true; + } else + more += (ulong)*(longlong*)args->args[2]; + + } // endifs + + initid->maybe_null = 1; + CalcLen(args, false, reslen, memlen); + + if (args->arg_count > 2 && *(longlong*)args->args[2]) + more += GetFileLength(args->args[0]) * 5; + + memlen += more; + return JsonInit(initid, message, false, reslen, memlen); +} // end of Json_File_init + +char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *str, *fn; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + fn = MakePSZ(g, args, 0); + + if (args->arg_count > 2 && *(longlong*)args->args[2]) { + char *memory; + int len, pretty; + HANDLE hFile; + MEMMAP mm; + PJSON jsp; + + pretty = (int)*(longlong*)args->args[1]; + + /*******************************************************************/ + /* Create the mapping file object. */ + /*******************************************************************/ + hFile = CreateFileMap(g, fn, &mm, MODE_READ, false); + + if (hFile == INVALID_HANDLE_VALUE) { + DWORD rc = GetLastError(); + + if (!(*g->Message)) + sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int)rc, fn); + + PUSH_WARNING(g->Message); + return NULL; + } // endif hFile + + /*******************************************************************/ + /* Get the file size (assuming file is smaller than 4 GB) */ + /*******************************************************************/ + len = mm.lenL; + memory = (char *)mm.memory; + + if (!len) { // Empty or deleted file + CloseFileHandle(hFile); + return NULL; + } // endif len + + if (!memory) { + CloseFileHandle(hFile); + sprintf(g->Message, MSG(MAP_VIEW_ERROR), fn, GetLastError()); + return NULL; + } // endif Memory + + CloseFileHandle(hFile); // Not used anymore + hFile = INVALID_HANDLE_VALUE; // For Fblock + + /*********************************************************************/ + /* Parse the json file and allocate its tree structure. */ + /*********************************************************************/ + g->Message[0] = 0; + + if (!(jsp = ParseJson(g, memory, len, pretty))) { + PUSH_WARNING(g->Message); + str = NULL; + } // endif jsp + + CloseMemMap(memory, len); + + if (jsp && !(str = Serialize(g, jsp, NULL, 0))) + PUSH_WARNING(g->Message); + + } else + str = GetJsonFile(g, fn); + + *res_length = (str) ? strlen(str) : 0; + return str; +} // end of Json_File + +void Json_File_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_File_deinit + +/***********************************************************************/ +/* Make a json file from a json item. */ +/***********************************************************************/ +my_bool Json_Make_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, more = 1024; + + if (args->arg_count < 2 || args->arg_count > 3) { + strcpy(message, "Json_Make_File only accepts 2 or 3 arguments"); + return true; + } else if (IsJson(args, 0) != 1) { + strcpy(message, "Json_Make_File first argument must be a json item"); + return true; + } else if (args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Second argument must be a (string) file name"); + return true; + } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { + strcpy(message, "Third argument is not an integer (pretty)"); + return true; + } // endifs + + CalcLen(args, false, reslen, memlen); + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Make_File_init + +char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *str, *fn, *msg; + int pretty; + PJVAL jvp; + PGLOBAL g = (PGLOBAL)initid->ptr; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + jvp = MakeValue(g, args, 0); + fn = MakePSZ(g, args, 1); + pretty = (args->arg_count > 2) ? (int)*(longlong*)args->args[2] : 2; + + if ((msg = Serialize(g, jvp->GetJson(), fn, pretty))) + PUSH_WARNING(msg); + + str= fn; + *res_length = (str) ? strlen(str) : 0; + return str; +} // end of Json_Make_File + +void Json_Make_File_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Make_File_deinit diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h new file mode 100644 index 00000000000..b6991e13941 --- /dev/null +++ b/storage/connect/jsonudf.h @@ -0,0 +1,175 @@ +/*************** tabjson H Declares Source Code File (.H) **************/ +/* Name: jsonudf.h Version 1.1 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2015 */ +/* */ +/* This file contains the JSON UDF function and classe declares. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "block.h" +#include "osutil.h" +#include "maputil.h" +#include "json.h" + +#define UDF_EXEC_ARGS \ + UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* + +/***********************************************************************/ +/* The JSON tree node. Can be an Object or an Array. */ +/***********************************************************************/ +typedef struct _jnode { + PSZ Key; // The key used for object + OPVAL Op; // Operator used for this node + PVAL CncVal; // To cont value used for OP_CNC + PVAL Valp; // The internal array VALUE + int Rank; // The rank in array + int Rx; // Read row number + int Nx; // Next to read row number +} JNODE, *PJNODE; + +typedef class JSNX *PJSNX; +typedef class JOUTPATH *PJTP; + +extern "C" { + DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Value(UDF_EXEC_ARGS); + DllExport void Json_Value_deinit(UDF_INIT*); + + DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Array(UDF_EXEC_ARGS); + DllExport void Json_Array_deinit(UDF_INIT*); + + DllExport my_bool Json_Array_Add_Values_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Array_Add_Values(UDF_EXEC_ARGS); + DllExport void Json_Array_Add_Values_deinit(UDF_INIT*); + + DllExport my_bool Json_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Array_Add(UDF_EXEC_ARGS); + DllExport void Json_Array_Add_deinit(UDF_INIT*); + + DllExport my_bool Json_Array_Delete_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Array_Delete(UDF_EXEC_ARGS); + DllExport void Json_Array_Delete_deinit(UDF_INIT*); + + DllExport my_bool Json_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Object_Nonull(UDF_EXEC_ARGS); + DllExport void Json_Object_Nonull_deinit(UDF_INIT*); + + DllExport my_bool Json_Object_Add_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Object_Add(UDF_EXEC_ARGS); + DllExport void Json_Object_Add_deinit(UDF_INIT*); + + DllExport my_bool Json_Object_Delete_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Object_Delete(UDF_EXEC_ARGS); + DllExport void Json_Object_Delete_deinit(UDF_INIT*); + + DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Object(UDF_EXEC_ARGS); + DllExport void Json_Object_deinit(UDF_INIT*); + + DllExport my_bool Json_Array_Grp_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport void Json_Array_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport char *Json_Array_Grp(UDF_EXEC_ARGS); + DllExport void Json_Array_Grp_clear(UDF_INIT *, char *, char *); + DllExport void Json_Array_Grp_deinit(UDF_INIT*); + + DllExport my_bool Json_Object_Grp_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport void Json_Object_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport char *Json_Object_Grp(UDF_EXEC_ARGS); + DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *); + DllExport void Json_Object_Grp_deinit(UDF_INIT*); + + DllExport my_bool Json_Get_String_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Get_String(UDF_EXEC_ARGS); + DllExport void Json_Get_String_deinit(UDF_INIT*); + + DllExport my_bool Json_Get_Int_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport long long Json_Get_Int(UDF_EXEC_ARGS); + DllExport void Json_Get_Int_deinit(UDF_INIT*); + + DllExport my_bool Json_Get_Real_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport double Json_Get_Real(UDF_EXEC_ARGS); + DllExport void Json_Get_Real_deinit(UDF_INIT*); + + DllExport my_bool Json_Locate_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Locate(UDF_EXEC_ARGS); + DllExport void Json_Locate_deinit(UDF_INIT*); + + DllExport my_bool Json_File_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_File(UDF_EXEC_ARGS); + DllExport void Json_File_deinit(UDF_INIT*); + + DllExport my_bool Json_Make_File_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Make_File(UDF_EXEC_ARGS); + DllExport void Json_Make_File_deinit(UDF_INIT*); +} // extern "C" + +/***********************************************************************/ +/* Class JSNX: JSON access method. */ +/***********************************************************************/ +class JSNX : public BLOCK { +public: + // Constructors + JSNX(PGLOBAL g, PJSON row, int type, int len = 64, int prec = 0); + + // Implementation + int GetPrecision(void) {return Prec;} + PVAL GetValue(void) {return Value;} + + // Methods + my_bool SetJpath(PGLOBAL g, char *path); + my_bool ParseJpath(PGLOBAL g); + void ReadValue(PGLOBAL g); + PJVAL GetJson(PGLOBAL g); + char *Locate(PGLOBAL g, PJSON jsp, char *what, + enum Item_result type, unsigned long len); + +protected: + my_bool CheckExpand(PGLOBAL g, int i, PSZ nm, my_bool b); + my_bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); + PVAL GetColumnValue(PGLOBAL g, PJSON row, int i); + PJVAL GetValue(PGLOBAL g, PJSON row, int i); + PVAL ExpandArray(PGLOBAL g, PJAR arp, int n); + PVAL CalculateArray(PGLOBAL g, PJAR arp, int n); + PVAL MakeJson(PGLOBAL g, PJSON jsp); + void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n); +//PJSON GetRow(PGLOBAL g); + my_bool LocateArray(PJAR jarp); + my_bool LocateObject(PJOB jobp); + my_bool LocateValue(PJVAL jvp); + + // Default constructor not to be used + JSNX(void) {} + + // Members + PJSON Row; + PVAL Value; + PVAL MulVal; // To value used by multiple column + PJTP Jp; + JNODE *Nodes; // The intermediate objects + char *Jpath; // The json path + int Buf_Type; + int Long; + int Prec; + int Nod; // The number of intermediate objects + int Xnod; // Index of multiple values + int B; // Index base + my_bool Xpd; // True for expandable column + my_bool Parsed; // True when parsed +}; // end of class JSNX + +/***********************************************************************/ +/* Class JOUTPATH. Used to make the locate path. */ +/***********************************************************************/ +class JOUTPATH : public JOUTSTR { +public: + JOUTPATH(PGLOBAL g, char *w, enum Item_result type, unsigned long len) + : JOUTSTR(g) {What = w; Type = type; Len = len; Found = false;} + + // Members + enum Item_result Type; + unsigned long Len; + char *What; + my_bool Found; +}; // end of class JOUTPATH diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result index 1455bac9017..be3b6df0479 100644 --- a/storage/connect/mysql-test/connect/r/json_udf.result +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -14,20 +14,23 @@ SELECT Json_Array(56,3.1416,'My name is "Foo"',NULL); Json_Array(56,3.1416,'My name is "Foo"',NULL) [56,3.141600,"My name is \"Foo\"",null] SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL)) Array; -ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Value_Add must have at least 2 arguments +ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add must have at least 2 arguments SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; Array [56,3.141600,"foo",null,"One more"] SELECT Json_Array_Add(Json_Value('one value'),'One more'); Json_Array_Add(Json_Value('one value'),'One more') -["one value","One more"] +"one value" +Warnings: +Warning 1105 First argument is not an array SELECT Json_Array_Add('one value','One more'); -ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Value_Add first argument must be a json item +ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add first argument must be a json item SELECT Json_Array_Add('one value' json_,'One more'); Json_Array_Add('one value' json_,'One more') -[null,"One more"] +one value Warnings: -Warning 1105 Bad 'o' character near one value +Warning 1105 Unexpected character 'o' near one value +Warning 1105 First argument is not an array SELECT Json_Value(56,3.1416,'foo',NULL); ERROR HY000: Can't initialize function 'Json_Value'; Json_Value cannot accept more than 1 argument SELECT Json_Value(3.1416); diff --git a/storage/connect/mysql-test/connect/std_data/bib0.json b/storage/connect/mysql-test/connect/std_data/bib0.json new file mode 100644 index 00000000000..2dabf0fd4b3 --- /dev/null +++ b/storage/connect/mysql-test/connect/std_data/bib0.json @@ -0,0 +1,2 @@ +{"ISBN":"9782212090819","LANG":"fr","SUBJECT":"applications","AUTHOR":[{"FIRSTNAME":"Jean-Michel","LASTNAME":"Bernadac"},{"FIRSTNAME":"François","LASTNAME":"Knab"}],"TITLE":"Construire une application XML","PUBLISHER":{"NAME":"Eyrolles","PLACE":"Paris"},"DATEPUB":1999} +{"ISBN":"9782840825685","LANG":"fr","SUBJECT":"applications","AUTHOR":[{"FIRSTNAME":"William J.","LASTNAME":"Pardi"}],"TITLE":"XML en Action","TRANSLATED":{"PREFIX":"adapté de l'anglais par","TRANSLATOR":{"FIRSTNAME":"James","LASTNAME":"Guerin"}},"PUBLISHER":{"NAME":"Microsoft Press","PLACE":"Paris"},"DATEPUB":2001} diff --git a/storage/connect/mysql-test/connect/t/json.test b/storage/connect/mysql-test/connect/t/json.test index 1cc2c054db4..fa962d3b302 100644 --- a/storage/connect/mysql-test/connect/t/json.test +++ b/storage/connect/mysql-test/connect/t/json.test @@ -4,6 +4,7 @@ let $MYSQLD_DATADIR= `select @@datadir`; --copy_file $MTR_SUITE_DIR/std_data/biblio.json $MYSQLD_DATADIR/test/biblio.json +--copy_file $MTR_SUITE_DIR/std_data/bib0.json $MYSQLD_DATADIR/test/bib0.json --copy_file $MTR_SUITE_DIR/std_data/expense.json $MYSQLD_DATADIR/test/expense.json --copy_file $MTR_SUITE_DIR/std_data/mulexp3.json $MYSQLD_DATADIR/test/mulexp3.json --copy_file $MTR_SUITE_DIR/std_data/mulexp4.json $MYSQLD_DATADIR/test/mulexp4.json @@ -115,6 +116,33 @@ ENGINE=CONNECT TABLE_TYPE=DOS FILE_NAME='biblio.json'; SELECT * FROM t1; DROP TABLE t1; +--echo # +--echo # Testing a pretty=0 file +--echo # +CREATE TABLE t1 +( + ISBN CHAR(15) NOT NULL, + Language CHAR(2) FIELD_FORMAT='LANG', + Subject CHAR(32) FIELD_FORMAT='SUBJECT', + AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', + AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', + Title CHAR(32) FIELD_FORMAT='TITLE', + Translation CHAR(32) FIELD_FORMAT='TRANSLATED:PREFIX', + TranslatorFN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:FIRSTNAME', + TranslatorLN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:LASTNAME', + Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', + Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', + Year int(4) FIELD_FORMAT='DATEPUB', + INDEX IX(ISBN) +) +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0'; +SHOW INDEX FROM t1; +SELECT * FROM t1; +DESCRIBE SELECT * FROM t1 WHERE ISBN = '9782212090819'; +--error ER_GET_ERRMSG +UPDATE t1 SET AuthorFN = 'Philippe' WHERE ISBN = '9782212090819'; +DROP TABLE t1; + --echo # --echo # A file with 2 arrays --echo # @@ -258,6 +286,8 @@ DROP TABLE t1, t2, t3, t4; # Clean up # --remove_file $MYSQLD_DATADIR/test/biblio.json +--remove_file $MYSQLD_DATADIR/test/bib0.dnx +--remove_file $MYSQLD_DATADIR/test/bib0.json --remove_file $MYSQLD_DATADIR/test/expense.json --remove_file $MYSQLD_DATADIR/test/mulexp3.json --remove_file $MYSQLD_DATADIR/test/mulexp4.json diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index 6aaa048de81..1ccdf231970 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -2360,9 +2360,11 @@ int ODBConn::GetCatInfo(CATPARM *cap) } // endif rc for (n = 0, crp = qrp->Colresp; crp; n++, crp = crp->Next) { - if (vlen[n] == SQL_NULL_DATA) + if (vlen[n] == SQL_NO_TOTAL) + ThrowDBX("Unexpected SQL_NO_TOTAL returned from SQLFetch"); + else if (vlen[n] == SQL_NULL_DATA) pval[n]->SetNull(true); - else if (crp->Type == TYPE_STRING && vlen[n] != SQL_NULL_DATA) + else if (crp->Type == TYPE_STRING/* && vlen[n] != SQL_NULL_DATA*/) pval[n]->SetValue_char(pbuf[n], vlen[n]); else pval[n]->SetNull(false); diff --git a/storage/connect/reldef.h b/storage/connect/reldef.h index 4aa29037dfc..dada5716dbe 100644 --- a/storage/connect/reldef.h +++ b/storage/connect/reldef.h @@ -193,7 +193,8 @@ class DllExport COLDEF : public COLCRT { /* Column description block friend class COLBLK; friend class DBFFAM; friend class TDBASE; - public: + friend class TDBDOS; +public: COLDEF(void); // Constructor // Implementation diff --git a/storage/connect/tabdos.cpp b/storage/connect/tabdos.cpp index a1e58ab3344..7906f6c9219 100644 --- a/storage/connect/tabdos.cpp +++ b/storage/connect/tabdos.cpp @@ -2018,7 +2018,8 @@ int TDBDOS::EstimatedLength(void) // result if we set dep to 1 dep = 1 + cdp->GetLong() / 20; // Why 20 ????? } else for (; cdp; cdp = cdp->GetNext()) - dep = MY_MAX(dep, cdp->GetOffset()); + if (!(cdp->Flags & (U_VIRTUAL|U_SPECIAL))) + dep = MY_MAX(dep, cdp->GetOffset()); return (int)dep; } // end of Estimated Length @@ -2203,7 +2204,7 @@ bool TDBDOS::PrepareWriting(PGLOBAL) } // endif Mode return false; - } // end of WriteDB + } // end of PrepareWriting /***********************************************************************/ /* WriteDB: Data Base write routine for DOS access method. */ @@ -2215,7 +2216,7 @@ int TDBDOS::WriteDB(PGLOBAL g) // Make the line to write if (PrepareWriting(g)) - return true; + return RC_FX; if (trace > 1) htrc("Write: line is='%s'\n", To_Line); diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index fafba6228b9..7d014712bcb 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -755,7 +755,6 @@ int TDBJSN::MakeTopTree(PGLOBAL g, PJSON jsp) } else strcpy(To_Line, s); - Row->Clear(); return false; } else return true; @@ -979,6 +978,7 @@ bool JSONCOL::ParseJpath(PGLOBAL g) if (!stricmp(Name, colp->GetName())) { Nod = colp->Nod; Nodes = colp->Nodes; + Xpd = colp->Xpd; goto fin; } // endif Name @@ -1045,7 +1045,8 @@ void JSONCOL::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) switch (val->GetValType()) { case TYPE_STRG: case TYPE_INTG: - case TYPE_DBL: + case TYPE_BINT: + case TYPE_DBL: vp->SetValue_pval(val->GetValue()); break; case TYPE_BOOL: @@ -1347,6 +1348,11 @@ PJSON JSONCOL::GetRow(PGLOBAL g) /***********************************************************************/ void JSONCOL::WriteColumn(PGLOBAL g) { + if (Xpd && Tjp->Pretty < 2) { + strcpy(g->Message, "Cannot write expanded column when Pretty is not 2"); + longjmp(g->jumper[g->jump_level], 666); + } // endif Xpd + /*********************************************************************/ /* Check whether this node must be written. */ /*********************************************************************/ @@ -1534,7 +1540,7 @@ int TDBJSON::MakeDocument(PGLOBAL g) if (*objpath != '[') { // objpass is a key if (jsp->GetType() != TYPE_JOB) { - strcpy(g->Message, "Table path does no match json file"); + strcpy(g->Message, "Table path does not match the json file"); return RC_FX; } // endif Type @@ -1550,7 +1556,7 @@ int TDBJSON::MakeDocument(PGLOBAL g) } else if (objpath[strlen(objpath)-1] == ']') { if (jsp->GetType() != TYPE_JAR) { - strcpy(g->Message, "Table path does no match json file"); + strcpy(g->Message, "Table path does not match the json file"); return RC_FX; } // endif Type @@ -1831,7 +1837,6 @@ void TDBJSON::CloseDB(PGLOBAL g) // Save the modified document char filename[_MAX_PATH]; PSZ msg; - FILE *fop; Doc->InitArray(g); @@ -1839,11 +1844,7 @@ void TDBJSON::CloseDB(PGLOBAL g) PlugSetPath(filename, ((PJDEF)To_Def)->Fn, GetPath()); // Serialize the modified table - if (!(fop = fopen(filename, "wb"))) { - sprintf(g->Message, MSG(OPEN_MODE_ERROR), - "w", (int)errno, filename); - strcat(strcat(g->Message, ": "), strerror(errno)); - } else if ((msg = Serialize(g, Top, fop, Pretty))) + if ((msg = Serialize(g, Top, filename, Pretty))) puts(msg); } // end of CloseDB diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index b23b981a3f8..e3df28476aa 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -1358,10 +1358,6 @@ void ODBCCOL::ReadColumn(PGLOBAL g) } // endif Buf_Type - // Handle null values - if (Value->IsZero()) - Value->SetNull(Nullable); - if (trace > 1) { char buf[64]; diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 03ec0eb8e40..884ce976a52 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -103,6 +103,7 @@ ulonglong CharToNumber(char *p, int n, ulonglong maxval, if (minus) *minus = false; if (rc) *rc = false; + if (n <= 0) return 0LL; // Eliminate leading blanks or 0 for (p2 = p + n; p < p2 && (*p == ' ' || *p == '0'); p++) ; @@ -705,7 +706,7 @@ bool TYPVAL::SetValue_char(char *p, int n) template <> bool TYPVAL::SetValue_char(char *p, int n) { - if (p) { + if (p && n > 0) { char buf[64]; for (; n > 0 && *p == ' '; p++) @@ -1345,7 +1346,7 @@ bool TYPVAL::SetValue_char(char *p, int n) { bool rc; - if (p) { + if (p && n > 0) { rc = n > Len; if ((n = MY_MIN(n, Len))) { @@ -1804,7 +1805,7 @@ bool DECVAL::SetValue_char(char *p, int n) { bool rc; - if (p) { + if (p && n > 0) { rc = n > Len; if ((n = MY_MIN(n, Len))) { @@ -2095,7 +2096,7 @@ bool BINVAL::SetValue_char(char *p, int n) { bool rc; - if (p) { + if (p && n > 0) { rc = n > Clen; Len = MY_MIN(n, Clen); memcpy(Binp, p, Len); @@ -2672,13 +2673,16 @@ bool DTVAL::SetValue_char(char *p, int n) int ndv; int dval[6]; - // Trim trailing blanks - for (p2 = p + n -1; p < p2 && *p2 == ' '; p2--) ; + if (n > 0) { + // Trim trailing blanks + for (p2 = p + n -1; p < p2 && *p2 == ' '; p2--); - if ((rc = (n = p2 - p + 1) > Len)) - n = Len; + if ((rc = (n = p2 - p + 1) > Len)) + n = Len; + + memcpy(Sdate, p, n); + } // endif n - memcpy(Sdate, p, n); Sdate[n] = '\0'; ndv = ExtractDate(Sdate, Pdtp, DefYear, dval); From 69ce20c4bdcfc32b3e78a4108313031688204cb9 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 18 Aug 2015 12:03:29 +0200 Subject: [PATCH 24/39] Add new json UDF Json_Object_List. modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h --- storage/connect/json.cpp | 25 +++++++++++++ storage/connect/json.h | 9 +++-- storage/connect/jsonudf.cpp | 71 ++++++++++++++++++++++++++++++++----- storage/connect/jsonudf.h | 10 ++++-- 4 files changed, 100 insertions(+), 15 deletions(-) diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 2b339e9e9f6..60c42a7c277 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -892,6 +892,20 @@ PJPR JOBJECT::AddPair(PGLOBAL g, PSZ key) return jpp; } // end of AddPair +/***********************************************************************/ +/* Return all keys as an array. */ +/***********************************************************************/ +PJAR JOBJECT::GetKeyList(PGLOBAL g) +{ + PJAR jarp = new(g) JARRAY(); + + for (PJPR jpp = First; jpp; jpp = jpp->Next) + jarp->AddValue(g, new(g) JVALUE(g, jpp->GetKey())); + + jarp->InitArray(g); + return jarp; +} // end of GetKeyList + /***********************************************************************/ /* Get the value corresponding to the given key. */ /***********************************************************************/ @@ -1106,6 +1120,17 @@ JVALUE::JVALUE(PGLOBAL g, PVAL valp) : JSON() Del = false; } // end of JVALUE constructor +/***********************************************************************/ +/* Constructor for a given string. */ +/***********************************************************************/ +JVALUE::JVALUE(PGLOBAL g, PSZ strp) : JSON() +{ + Jsp = NULL; + Value = AllocateValue(g, strp, TYPE_STRING); + Next = NULL; + Del = false; +} // end of JVALUE constructor + /***********************************************************************/ /* Returns the type of the Value's value. */ /***********************************************************************/ diff --git a/storage/connect/json.h b/storage/connect/json.h index bc45e08acce..28f18404e1c 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -149,10 +149,11 @@ class JSON : public BLOCK { virtual void InitArray(PGLOBAL g) {X} virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL) {X return NULL;} virtual PJPR AddPair(PGLOBAL g, PSZ key) {X return NULL;} - virtual PJVAL GetValue(const char *key) {X return NULL;} + virtual PJAR GetKeyList(PGLOBAL g) {X return NULL;} + virtual PJVAL GetValue(const char *key) {X return NULL;} virtual PJOB GetObject(void) {return NULL;} virtual PJAR GetArray(void) {return NULL;} - virtual PJVAL GetValue(int i) {X return NULL;} + virtual PJVAL GetValue(int i) {X return NULL;} virtual PVAL GetValue(void) {X return NULL;} virtual PJSON GetJson(void) {X return NULL;} virtual PJPR GetFirst(void) {X return NULL;} @@ -193,7 +194,8 @@ class JOBJECT : public JSON { virtual PJPR AddPair(PGLOBAL g, PSZ key); virtual PJOB GetObject(void) {return this;} virtual PJVAL GetValue(const char* key); - virtual PSZ GetText(PGLOBAL g, PSZ text); + virtual PJAR GetKeyList(PGLOBAL g); + virtual PSZ GetText(PGLOBAL g, PSZ text); virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); virtual void DeleteKey(char *k); virtual bool IsNull(void); @@ -245,6 +247,7 @@ class JVALUE : public JSON { JVALUE(PJSON jsp) : JSON() {Jsp = jsp; Value = NULL; Next = NULL; Del = false;} JVALUE(PGLOBAL g, PVAL valp); + JVALUE(PGLOBAL g, PSZ strp); using JSON::GetValue; using JSON::SetValue; diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 300f294595b..f4485124fc9 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -994,7 +994,9 @@ static int IsJson(UDF_ARGS *args, int i) { int n = 0; - if (!strnicmp(args->attributes[i], "Json_", 5)) + if (i >= args->arg_count) + n = 0; + else if (!strnicmp(args->attributes[i], "Json_", 5)) n = 1; // arg is a json item else if (args->arg_type[i] == STRING_RESULT && !strnicmp(args->attributes[i], "Jfile_", 6)) @@ -1138,6 +1140,8 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, { unsigned long rl, ml; + n = MY_MIN(n, args->arg_count); + for (uint i = 0; i < n; i++) if (IsJson(args, i) == 2) { if (CalcLen(args, obj, rl, ml)) @@ -1367,7 +1371,7 @@ my_bool Json_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, false,reslen, memlen); + return JsonInit(initid, message, false, reslen, memlen); } // end of Json_Array_init char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1537,10 +1541,10 @@ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Json_Array_Delete must have at lest 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Aray_Delete first argument must be a json item"); + strcpy(message, "Json_Array_Delete first argument must be a json item"); return true; } else if (args->arg_type[1] != INT_RESULT) { - PUSH_WARNING("Json_Aray_Delete second argument is not an integer (index)"); + strcpy(message, "Json_Array_Delete second argument is not an integer (index)"); return true; } else CalcLen(args, false, reslen, memlen); @@ -1780,6 +1784,55 @@ void Json_Object_Delete_deinit(UDF_INIT* initid) PlugExit((PGLOBAL)initid->ptr); } // end of Json_Object_Delete_deinit +/***********************************************************************/ +/* Returns an array of the Json object keys. */ +/***********************************************************************/ +my_bool Json_Object_List_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count != 1) { + strcpy(message, "Json_Object_List must have 1 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Json_Object_List argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, message, true, reslen, memlen); +} // end of Json_Object_List_init + +char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *str = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!CheckMemory(g, initid, args, 1, false)) { + PJVAL jvp = MakeValue(g, args, 0); + + if (jvp && jvp->GetValType() == TYPE_JOB) { + PJOB jobp = jvp->GetObject(); + PJAR jarp = jobp->GetKeyList(g); + + if (!(str = Serialize(g, jarp, NULL, 0))) + PUSH_WARNING(g->Message); + + } else + PUSH_WARNING("First argument is not an object"); + + } // endif CheckMemory + + *res_length = (str) ? strlen(str) : 0; + return str; +} // end of Json_Object_List + +void Json_Object_List_deinit(UDF_INIT* initid) +{ + PlugExit((PGLOBAL)initid->ptr); +} // end of Json_Object_List_deinit + /***********************************************************************/ /* Make a Json array from values coming from rows. */ /***********************************************************************/ @@ -1964,7 +2017,7 @@ char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, jsp = jvp->GetJson(); path = MakePSZ(g, args, 1); - jsx = new(g)JSNX(g, jsp, TYPE_STRING); + jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length); if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); @@ -2229,10 +2282,10 @@ my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Json_File first argument must be a (string) file name"); return true; } else if (args->arg_count > 1 && args->arg_type[1] != INT_RESULT) { - strcpy(message, "Second argument is not an integer (pretty)"); + strcpy(message, "Second argument is not an integer (check)"); return true; } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { - strcpy(message, "Third argument is not an integer (check)"); + strcpy(message, "Third argument is not an integer (pretty)"); return true; } else if (args->arg_count > 3) { if (args->arg_type[3] != INT_RESULT) { @@ -2262,14 +2315,14 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, PlugSubSet(g, g->Sarea, g->Sarea_Size); fn = MakePSZ(g, args, 0); - if (args->arg_count > 2 && *(longlong*)args->args[2]) { + if (args->arg_count > 1 && *(longlong*)args->args[1]) { char *memory; int len, pretty; HANDLE hFile; MEMMAP mm; PJSON jsp; - pretty = (int)*(longlong*)args->args[1]; + pretty = (args->arg_count > 2) ? (int)*(longlong*)args->args[2] : 3; /*******************************************************************/ /* Create the mapping file object. */ diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index b6991e13941..73ae5c0ccee 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -52,6 +52,10 @@ extern "C" { DllExport char *Json_Array_Delete(UDF_EXEC_ARGS); DllExport void Json_Array_Delete_deinit(UDF_INIT*); + DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Object(UDF_EXEC_ARGS); + DllExport void Json_Object_deinit(UDF_INIT*); + DllExport my_bool Json_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *Json_Object_Nonull(UDF_EXEC_ARGS); DllExport void Json_Object_Nonull_deinit(UDF_INIT*); @@ -64,9 +68,9 @@ extern "C" { DllExport char *Json_Object_Delete(UDF_EXEC_ARGS); DllExport void Json_Object_Delete_deinit(UDF_INIT*); - DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Object(UDF_EXEC_ARGS); - DllExport void Json_Object_deinit(UDF_INIT*); + DllExport my_bool Json_Object_List_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Object_List(UDF_EXEC_ARGS); + DllExport void Json_Object_List_deinit(UDF_INIT*); DllExport my_bool Json_Array_Grp_init(UDF_INIT*, UDF_ARGS*, char*); DllExport void Json_Array_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); From ffc0f5b3de2b322dc05a3646243e0028c6691a1c Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Wed, 19 Aug 2015 17:52:33 +0200 Subject: [PATCH 25/39] Add new UDF noconst. modified: storage/connect/noconst.c Fix a few bugs in json udf's. modified: storage/connect/jsonudf.cpp --- storage/connect/jsonudf.cpp | 82 ++++++++++++++++++++++--------------- storage/connect/noconst.c | 38 +++++++++++++++++ 2 files changed, 86 insertions(+), 34 deletions(-) create mode 100644 storage/connect/noconst.c diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index f4485124fc9..60590e2219f 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -18,9 +18,10 @@ #define MEMFIX 4096 #define PUSH_WARNING(M) \ push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M) +#define M 7 uint GetJsonGrpSize(void); -static int IsJson(UDF_ARGS *args, int i); +static int IsJson(UDF_ARGS *args, uint i); static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i); /* ------------------------------ JSNX ------------------------------- */ @@ -990,7 +991,7 @@ static char *MakeResult(PGLOBAL g, UDF_ARGS *args, PJSON top, int n = 2) /***********************************************************************/ /* Returns not 0 if the argument is a JSON item or file name. */ /***********************************************************************/ -static int IsJson(UDF_ARGS *args, int i) +static int IsJson(UDF_ARGS *args, uint i) { int n = 0; @@ -1030,7 +1031,8 @@ static long GetFileLength(char *fn) /* Calculate the reslen and memlen needed by a function. */ /***********************************************************************/ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, - unsigned long& reslen, unsigned long& memlen) + unsigned long& reslen, unsigned long& memlen, + my_bool mod = false) { char fn[_MAX_PATH]; unsigned long i, k, n; @@ -1050,12 +1052,16 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, switch (args->arg_type[i]) { case STRING_RESULT: if (IsJson(args, i) == 2 && args->args[i]) { - n = MY_MIN(args->lengths[i], sizeof(fn) - 1); - memcpy(fn, args->args[i], n); - fn[n] = 0; - j = i; - fl = GetFileLength(fn); - reslen += fl; + if (!mod) { + n = MY_MIN(args->lengths[i], sizeof(fn) - 1); + memcpy(fn, args->args[i], n); + fn[n] = 0; + j = i; + fl = GetFileLength(fn); + reslen += fl; + } else + reslen += args->lengths[i]; + } else if (IsJson(args, i) == 1) reslen += args->lengths[i]; else @@ -1106,9 +1112,9 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, fl = GetFileLength(fn); } // endif i - memlen += fl * 5; + memlen += fl * M; } else if (IsJson(args, i) == 1) - memlen += args->lengths[i] * 5; // Estimate parse memory + memlen += args->lengths[i] * M; // Estimate parse memory memlen += sizeof(TYPVAL); break; @@ -1129,14 +1135,15 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, } // endfor i - return false; + reslen = MY_MIN(reslen, 65535); // VARCHAR length limit + return false; } // end of CalcLen /***********************************************************************/ /* Check if the calculated memory is enough. */ /***********************************************************************/ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, - uint n, my_bool obj) + uint n, my_bool obj, my_bool mod = false) { unsigned long rl, ml; @@ -1144,7 +1151,7 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, for (uint i = 0; i < n; i++) if (IsJson(args, i) == 2) { - if (CalcLen(args, obj, rl, ml)) + if (CalcLen(args, obj, rl, ml, mod)) return true; else if (ml > g->Sarea_Size) { free(g->Sarea); @@ -1475,7 +1482,7 @@ my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Json_Array_Add first argument must be a json item"); return true; } else - CalcLen(args, false, reslen, memlen); + CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, message, true, reslen, memlen); } // end of Json_Array_Add_init @@ -1486,7 +1493,7 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, 2, false)) { + if (!CheckMemory(g, initid, args, 2, false, true)) { int *x = NULL, n = 2; PJSON top; PJVAL jvp; @@ -1518,11 +1525,13 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory // In case of error or file, return unchanged argument - if (!str) + if (!str) { str = args->args[0]; + *res_length = args->lengths[0]; + } else + *res_length = strlen(str); - *res_length = (str) ? strlen(str) : 0; - return str; + return str; } // end of Json_Array_Add void Json_Array_Add_deinit(UDF_INIT* initid) @@ -1547,7 +1556,7 @@ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Json_Array_Delete second argument is not an integer (index)"); return true; } else - CalcLen(args, false, reslen, memlen); + CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, message, true, reslen, memlen); } // end of Json_Array_Delete_init @@ -1558,7 +1567,7 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, 1, false)) { + if (!CheckMemory(g, initid, args, 1, false, true)) { int n; PJAR arp; PJVAL jvp = MakeValue(g, args, 0); @@ -1578,10 +1587,12 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory // In case of error or file, return unchanged argument - if (!str) + if (!str) { str = args->args[0]; + *res_length = args->lengths[0]; + } else + *res_length = strlen(str); - *res_length = (str) ? strlen(str) : 0; return str; } // end of Json_Array_Delete @@ -1683,7 +1694,7 @@ my_bool Json_Object_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Json_Object_Add first argument must be a json item"); return true; } else - CalcLen(args, false, reslen, memlen); + CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, message, true, reslen, memlen); } // end of Json_Object_Add_init @@ -1694,7 +1705,7 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, char *key, *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, 2, false)) { + if (!CheckMemory(g, initid, args, 2, false, true)) { PJOB jobp; PJVAL jvp = MakeValue(g, args, 0); PJSON top = jvp->GetJson(); @@ -1713,10 +1724,12 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory // In case of error or file, return unchanged argument - if (!str) + if (!str) { str = args->args[0]; + *res_length = args->lengths[0]; + } else + *res_length = strlen(str); - *res_length = (str) ? strlen(str) : 0; return str; } // end of Json_Object_Add @@ -1742,7 +1755,7 @@ my_bool Json_Object_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Json_Object_Delete second argument must be a key string"); return true; } else - CalcLen(args, false, reslen, memlen); + CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, message, true, reslen, memlen); } // end of Json_Object_Delete_init @@ -1753,7 +1766,7 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, 1, false)) { + if (!CheckMemory(g, initid, args, 1, false, true)) { char *key; PJOB jobp; PJVAL jvp = MakeValue(g, args, 0); @@ -1772,10 +1785,12 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory // In case of error or file, return unchanged argument - if (!str) - str = args->args[0]; + if (!str) { + str = args->args[0]; + *res_length = args->lengths[0]; + } else + *res_length = strlen(str); - *res_length = (str) ? strlen(str) : 0; return str; } // end of Json_Object_Delete @@ -2300,7 +2315,7 @@ my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) CalcLen(args, false, reslen, memlen); if (args->arg_count > 2 && *(longlong*)args->args[2]) - more += GetFileLength(args->args[0]) * 5; + more += GetFileLength(args->args[0]) * M; memlen += more; return JsonInit(initid, message, false, reslen, memlen); @@ -2436,4 +2451,3 @@ void Json_Make_File_deinit(UDF_INIT* initid) { PlugExit((PGLOBAL)initid->ptr); } // end of Json_Make_File_deinit - diff --git a/storage/connect/noconst.c b/storage/connect/noconst.c new file mode 100644 index 00000000000..043eae7c54e --- /dev/null +++ b/storage/connect/noconst.c @@ -0,0 +1,38 @@ +/***********************************************************************/ +/* (C) Copyright to the author Olivier BERTRAND 2015 */ +/***********************************************************************/ +#include +#include +#include + +#if defined(__WIN__) +#define DllExport __declspec( dllexport ) +#else // !__WIN__ +#define DllExport +#endif // !__WIN__ + +extern "C" { + DllExport my_bool noconst_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *noconst(UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char*); +} // extern "C" + +/***********************************************************************/ +/* Returns its argument saying it is not a constant. */ +/***********************************************************************/ +my_bool noconst_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + if (args->arg_count != 1 || args->arg_type[0] != STRING_RESULT) { + strcpy(message, "noconst unique argument must be a string"); + return true; + } // endif arg + + initid->const_item = false; // The trick! + return false; +} // end of noconst_init + +char *noconst(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + return args->args[0]; +} // end of noconst + From f741fcc9e52c30b5ddecdea95dac50d2a6110df1 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 22 Aug 2015 12:13:37 +0200 Subject: [PATCH 26/39] Handle constant function and argument modified: storage/connect/jsonudf.cpp Record result of json test modified: storage/connect/mysql-test/connect/r/json.result --- storage/connect/jsonudf.cpp | 532 +++++++++++++----- .../connect/mysql-test/connect/r/json.result | 34 ++ 2 files changed, 418 insertions(+), 148 deletions(-) diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 60590e2219f..d5ec8abc4d4 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -911,10 +911,31 @@ my_bool JSNX::LocateValue(PJVAL jvp) /* ---------------------------- JSON UDF ----------------------------- */ +/***********************************************************************/ +/* Program for SubSet re-initialization of the memory pool. */ +/***********************************************************************/ +static my_bool JsonSubSet(PGLOBAL g) +{ + PPOOLHEADER pph = (PPOOLHEADER)g->Sarea; + + pph->To_Free = (OFFSET)((g->Createas) ? g->Createas : sizeof(POOLHEADER)); + pph->FreeBlk = g->Sarea_Size - pph->To_Free; + return FALSE; +} /* end of JsonSubSet */ + +/***********************************************************************/ +/* Program for saving the status of the memory pools. */ +/***********************************************************************/ +inline void JsonMemSave(PGLOBAL g) +{ + g->Createas = (int)((PPOOLHEADER)g->Sarea)->To_Free; +} /* end of JsonMemSave */ + /***********************************************************************/ /* Allocate and initialise the memory area. */ /***********************************************************************/ -static my_bool JsonInit(UDF_INIT *initid, char *message, my_bool mbn, +static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args, + char *message, my_bool mbn, unsigned long reslen, unsigned long memlen) { PGLOBAL g = PlugInit(NULL, memlen); @@ -929,11 +950,12 @@ static my_bool JsonInit(UDF_INIT *initid, char *message, my_bool mbn, } else initid->ptr = (char*)g; + g->Mrr = (args->arg_count && args->args[0]) ? 1 : 0; + g->Alchecked = (initid->const_item) ? 1 : 0; initid->maybe_null = mbn; - initid->const_item = false; initid->max_length = reslen; return false; -} // end of Json_init +} // end of JsonInit /***********************************************************************/ /* Check if a path was specified and set jvp according to it. */ @@ -1135,7 +1157,6 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, } // endfor i - reslen = MY_MIN(reslen, 65535); // VARCHAR length limit return false; } // end of CalcLen @@ -1163,16 +1184,18 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, strcpy(g->Message, errmsg); g->Sarea_Size = 0; return true; - } else - g->Sarea_Size = ml; + } // endif Alloc + g->Sarea_Size = ml; + g->Createas = 0; + g->Xchk = NULL; initid->max_length = rl; } // endif Size break; } // endif IsJson - PlugSubSet(g, g->Sarea, g->Sarea_Size); + JsonSubSet(g); return false; } // end of CheckMemory @@ -1343,7 +1366,7 @@ my_bool Json_Value_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, false, reslen, memlen); + return JsonInit(initid, args, message, false, reslen, memlen); } // end of Json_Value_init char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1352,16 +1375,22 @@ char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, 1, false)) { - PJVAL jvp = MakeValue(g, args, 0); + if (!g->Xchk) { + if (!CheckMemory(g, initid, args, 1, false)) { + PJVAL jvp = MakeValue(g, args, 0); - if (!(str = Serialize(g, jvp, NULL, 0))) + if (!(str = Serialize(g, jvp, NULL, 0))) + str = strcpy(result, g->Message); + + } else str = strcpy(result, g->Message); + // Keep result of constant function + g->Xchk = (g->Alchecked) ? str : NULL; } else - str = strcpy(result, g->Message); + str = (char*)g->Xchk; - *res_length = strlen(str); + *res_length = strlen(str); return str; } // end of Json_Value @@ -1378,32 +1407,36 @@ my_bool Json_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, false, reslen, memlen); + return JsonInit(initid, args, message, false, reslen, memlen); } // end of Json_Array_init char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { char *str; - uint i; - PJAR arp; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, args->arg_count, false)) { - arp = new(g)JARRAY; + if (!g->Xchk) { + if (!CheckMemory(g, initid, args, args->arg_count, false)) { + PJAR arp = new(g)JARRAY; - for (i = 0; i < args->arg_count; i++) - arp->AddValue(g, MakeValue(g, args, i)); + for (uint i = 0; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); - arp->InitArray(g); + arp->InitArray(g); - if (!(str = Serialize(g, arp, NULL, 0))) + if (!(str = Serialize(g, arp, NULL, 0))) + str = strcpy(result, g->Message); + + } else str = strcpy(result, g->Message); + // Keep result of constant function + g->Xchk = (g->Alchecked) ? str : NULL; } else - str = strcpy(result, g->Message); + str = (char*)g->Xchk; - *res_length = strlen(str); + *res_length = strlen(str); return str; } // end of Json_Array @@ -1428,8 +1461,8 @@ my_bool Json_Array_Add_Values_init(UDF_INIT *initid, UDF_ARGS *args, char *messa } else CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, true, reslen, memlen); -} // end of Json_Array_Add_init + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Json_Array_Add_Values_init char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) @@ -1437,27 +1470,33 @@ char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, args->arg_count, false)) { - PJAR arp; - PJVAL jvp = MakeValue(g, args, 0); + if (!g->Xchk) { + if (!CheckMemory(g, initid, args, args->arg_count, false)) { + PJAR arp; + PJVAL jvp = MakeValue(g, args, 0); + + if (jvp->GetValType() != TYPE_JAR) { + arp = new(g)JARRAY; + arp->AddValue(g, jvp); + } else + arp = jvp->GetArray(); - if (jvp->GetValType() != TYPE_JAR) { - arp = new(g)JARRAY; - arp->AddValue(g, jvp); - } else - arp = jvp->GetArray(); + for (uint i = 1; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); - for (uint i = 1; i < args->arg_count; i++) - arp->AddValue(g, MakeValue(g, args, i)); + arp->InitArray(g); + str = Serialize(g, arp, NULL, 0); + } // endif CheckMemory - arp->InitArray(g); - str = Serialize(g, arp, NULL, 0); - } // endif CheckMemory + if (!str) { + PUSH_WARNING(g->Message); + str = args->args[0]; + } // endif str - if (!str) { - PUSH_WARNING(g->Message); - str = args->args[0]; - } // endif str + // Keep result of constant function + g->Xchk = (g->Alchecked) ? str : NULL; + } else + str = (char*)g->Xchk; *res_length = (str) ? strlen(str) : 0; return str; @@ -1484,7 +1523,7 @@ my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen, true); - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Array_Add_init char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1493,12 +1532,22 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->Xchk) { + // This constant function was recalled + str = (char*)g->Xchk; + *res_length = strlen(str); + return str; + } // endif Xchk + if (!CheckMemory(g, initid, args, 2, false, true)) { int *x = NULL, n = 2; PJSON top; PJVAL jvp; PJAR arp; + jvp = MakeValue(g, args, 0); + top = jvp->GetJson(); + if (args->arg_count > 2) { if (args->arg_type[2] == INT_RESULT) { x = (int*)PlugSubAlloc(g, NULL, sizeof(int)); @@ -1509,9 +1558,6 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif count - jvp = MakeValue(g, args, 0); - top = jvp->GetJson(); - if (CheckPath(g, args, top, jvp, n)) PUSH_WARNING(g->Message); else if (jvp && jvp->GetValType() == TYPE_JAR) { @@ -1525,12 +1571,14 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory // In case of error or file, return unchanged argument - if (!str) { - str = args->args[0]; - *res_length = args->lengths[0]; - } else - *res_length = strlen(str); + if (!str) + str = MakePSZ(g, args, 0); + if (g->Alchecked) + // Keep result of constant function + g->Xchk = str; + + *res_length = strlen(str); return str; } // end of Json_Array_Add @@ -1558,7 +1606,7 @@ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen, true); - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Array_Delete_init char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1567,6 +1615,13 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->Xchk) { + // This constant function was recalled + str = (char*)g->Xchk; + *res_length = strlen(str); + return str; + } // endif Xchk + if (!CheckMemory(g, initid, args, 1, false, true)) { int n; PJAR arp; @@ -1587,13 +1642,15 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory // In case of error or file, return unchanged argument - if (!str) { - str = args->args[0]; - *res_length = args->lengths[0]; - } else - *res_length = strlen(str); + if (!str) + str = MakePSZ(g, args, 0); - return str; + if (g->Alchecked) + // Keep result of constant function + g->Xchk = str; + + *res_length = (str) ? strlen(str) : 0; + return str; } // end of Json_Array_Delete void Json_Array_Delete_deinit(UDF_INIT* initid) @@ -1609,7 +1666,7 @@ my_bool Json_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); - return JsonInit(initid, message, false, reslen, memlen); + return JsonInit(initid, args, message, false, reslen, memlen); } // end of Json_Object_init char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1618,17 +1675,23 @@ char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, args->arg_count, true)) { - PJOB objp = new(g)JOBJECT; + if (!g->Xchk) { + if (!CheckMemory(g, initid, args, args->arg_count, true)) { + PJOB objp = new(g)JOBJECT; - for (uint i = 0; i < args->arg_count; i++) - objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); + for (uint i = 0; i < args->arg_count; i++) + objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); - str = Serialize(g, objp, NULL, 0); - } // endif CheckMemory + str = Serialize(g, objp, NULL, 0); + } // endif CheckMemory - if (!str) - str = strcpy(result, g->Message); + if (!str) + str = strcpy(result, g->Message); + + // Keep result of constant function + g->Xchk = (g->Alchecked) ? str : NULL; + } else + str = (char*)g->Xchk; *res_length = strlen(str); return str; @@ -1648,7 +1711,7 @@ my_bool Json_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); - return JsonInit(initid, message, false, reslen, memlen); + return JsonInit(initid, args, message, false, reslen, memlen); } // end of Json_Object_Nonull_init char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1657,19 +1720,25 @@ char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, args->arg_count, true)) { - PJVAL jvp; - PJOB objp = new(g)JOBJECT; + if (!g->Xchk) { + if (!CheckMemory(g, initid, args, args->arg_count, true)) { + PJVAL jvp; + PJOB objp = new(g)JOBJECT; - for (uint i = 0; i < args->arg_count; i++) - if (!(jvp = MakeValue(g, args, i))->IsNull()) - objp->SetValue(g, jvp, MakeKey(g, args, i)); + for (uint i = 0; i < args->arg_count; i++) + if (!(jvp = MakeValue(g, args, i))->IsNull()) + objp->SetValue(g, jvp, MakeKey(g, args, i)); - str = Serialize(g, objp, NULL, 0); - } // endif CheckMemory + str = Serialize(g, objp, NULL, 0); + } // endif CheckMemory - if (!str) - str = strcpy(result, g->Message); + if (!str) + str = strcpy(result, g->Message); + + // Keep result of constant function + g->Xchk = (g->Alchecked) ? str : NULL; + } else + str = (char*)g->Xchk; *res_length = strlen(str); return str; @@ -1696,7 +1765,7 @@ my_bool Json_Object_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen, true); - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Object_Add_init char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1705,6 +1774,13 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, char *key, *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->Xchk) { + // This constant function was recalled + str = (char*)g->Xchk; + *res_length = strlen(str); + return str; + } // endif Xchk + if (!CheckMemory(g, initid, args, 2, false, true)) { PJOB jobp; PJVAL jvp = MakeValue(g, args, 0); @@ -1724,12 +1800,14 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory // In case of error or file, return unchanged argument - if (!str) { - str = args->args[0]; - *res_length = args->lengths[0]; - } else - *res_length = strlen(str); + if (!str) + str = MakePSZ(g, args, 0); + if (g->Alchecked) + // Keep result of constant function + g->Xchk = str; + + *res_length = strlen(str); return str; } // end of Json_Object_Add @@ -1757,7 +1835,7 @@ my_bool Json_Object_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen, true); - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Object_Delete_init char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1766,6 +1844,13 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->Xchk) { + // This constant function was recalled + str = (char*)g->Xchk; + *res_length = strlen(str); + return str; + } // endif Xchk + if (!CheckMemory(g, initid, args, 1, false, true)) { char *key; PJOB jobp; @@ -1785,12 +1870,14 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory // In case of error or file, return unchanged argument - if (!str) { - str = args->args[0]; - *res_length = args->lengths[0]; - } else - *res_length = strlen(str); + if (!str) + str = MakePSZ(g, args, 0); + if (g->Alchecked) + // Keep result of constant function + g->Xchk = str; + + *res_length = strlen(str); return str; } // end of Json_Object_Delete @@ -1815,7 +1902,7 @@ my_bool Json_Object_List_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Object_List_init char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -1824,20 +1911,31 @@ char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; - if (!CheckMemory(g, initid, args, 1, false)) { - PJVAL jvp = MakeValue(g, args, 0); + if (!g->N) { + if (!CheckMemory(g, initid, args, 1, false)) { + PJVAL jvp = MakeValue(g, args, 0); - if (jvp && jvp->GetValType() == TYPE_JOB) { - PJOB jobp = jvp->GetObject(); - PJAR jarp = jobp->GetKeyList(g); + if (jvp && jvp->GetValType() == TYPE_JOB) { + PJOB jobp = jvp->GetObject(); + PJAR jarp = jobp->GetKeyList(g); - if (!(str = Serialize(g, jarp, NULL, 0))) - PUSH_WARNING(g->Message); + if (!(str = Serialize(g, jarp, NULL, 0))) + PUSH_WARNING(g->Message); - } else - PUSH_WARNING("First argument is not an object"); + } else + PUSH_WARNING("First argument is not an object"); - } // endif CheckMemory + + } // endif CheckMemory + + if (g->Alchecked) { + // Keep result of constant function + g->Xchk = str; + g->N = 1; // str can be NULL + } // endif Alchecked + + } else + str = (char*)g->Xchk; *res_length = (str) ? strlen(str) : 0; return str; @@ -1864,7 +1962,7 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) reslen *= n; memlen += ((memlen - MEMFIX) * (n - 1)); - if (JsonInit(initid, message, false, reslen, memlen)) + if (JsonInit(initid, args, message, false, reslen, memlen)) return true; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1934,7 +2032,7 @@ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) reslen *= n; memlen += ((memlen - MEMFIX) * (n - 1)); - if (JsonInit(initid, message, false, reslen, memlen)) + if (JsonInit(initid, args, message, false, reslen, memlen)) return true; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2005,8 +2103,18 @@ my_bool Json_Get_String_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen); - memlen += 1000; // TODO: calculate this - return JsonInit(initid, message, true, reslen, memlen); + if (IsJson(args, 0) == 2) { + char fn[_MAX_PATH]; + long fl; + + memcpy(fn, args->args[0], args->lengths[0]); + fn[args->lengths[0]] = 0; + fl = GetFileLength(fn); + memlen += fl * 3; + } else + memlen += args->lengths[0] * 3; + + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Get_String_init char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -2015,21 +2123,38 @@ char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->N) { + str = (char*)g->Xchk; + goto fin; + } else if (g->Alchecked) + g->N = 1; + if (!CheckMemory(g, initid, args, 1, false)) { char *p, *path; PJSON jsp; PJSNX jsx; - PJVAL jvp = MakeValue(g, args, 0); + PJVAL jvp; - if ((p = jvp->GetString())) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); + if (!g->Xchk) { + jvp = MakeValue(g, args, 0); - return NULL; - } // endif jsp + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr } else - jsp = jvp->GetJson(); + jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length); @@ -2044,8 +2169,13 @@ char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!jsx->GetValue()->IsNull()) str = jsx->GetValue()->GetCharValue(); + if (g->Alchecked) + // Keep result of constant function + g->Xchk = str; + } // endif CheckMemory + fin: *res_length = (str) ? strlen(str) : 0; return str; } // end of Json_Get_String @@ -2075,7 +2205,7 @@ my_bool Json_Get_Int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) CalcLen(args, false, reslen, memlen); memlen += 1000; // TODO: calculate this - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Get_Int_init long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -2083,22 +2213,37 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, { PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->N) + return (g->Xchk) ? *(long long*)g->Xchk : NULL; + else if (g->Alchecked) + g->N = 1; + if (!CheckMemory(g, initid, args, 1, false)) { - long long n; char *p, *path; + long long n; PJSON jsp; PJSNX jsx; - PJVAL jvp = MakeValue(g, args, 0); + PJVAL jvp; - if ((p = jvp->GetString())) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); + if (!g->Xchk) { + jvp = MakeValue(g, args, 0); - return NULL; - } // endif jsp + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr } else - jsp = jvp->GetJson(); + jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); jsx = new(g)JSNX(g, jsp, TYPE_BIGINT); @@ -2106,7 +2251,7 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); return NULL; - } // endif SetJpath + } // endif SetJpath jsx->ReadValue(g); @@ -2116,6 +2261,14 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif IsNull n = jsx->GetValue()->GetBigintValue(); + + if (g->Alchecked) { + // Keep result of constant function + long long *np = (long long*)PlugSubAlloc(g, NULL, sizeof(long long)); + *np = n; + g->Xchk = np; + } // endif Alchecked + return n; } else return NULL; @@ -2155,7 +2308,7 @@ my_bool Json_Get_Real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) CalcLen(args, false, reslen, memlen); memlen += 1000; // TODO: calculate this - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Get_Real_init double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -2163,21 +2316,37 @@ double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, char *result, { PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->N) + return (g->Xchk) ? *(double*)g->Xchk : NULL; + else if (g->Alchecked) + g->N = 1; + if (!CheckMemory(g, initid, args, 1, false)) { char *p, *path; double d; PJSON jsp; PJSNX jsx; - PJVAL jvp = MakeValue(g, args, 0); + PJVAL jvp; - if ((p = jvp->GetString())) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); - return NULL; - } // endif jsp + if (!g->Xchk) { + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr } else - jsp = jvp->GetJson(); + jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); jsx = new(g)JSNX(g, jsp, TYPE_DOUBLE); @@ -2195,6 +2364,14 @@ double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif IsNull d = jsx->GetValue()->GetFloatValue(); + + if (g->Alchecked) { + // Keep result of constant function + double *dp = (double*)PlugSubAlloc(g, NULL, sizeof(double)); + *dp = d; + g->Xchk = dp; + } // endif Alchecked + return d; } else return NULL; @@ -2228,16 +2405,24 @@ my_bool Json_Locate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) CalcLen(args, false, reslen, memlen); memlen += more; // TODO: calculate this - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Locate_init char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { + char *path = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->N) { + path = (char*)g->Xchk; + *res_length = (path) ? strlen(path) : 0; + return path; + } else if (g->Alchecked) + g->N = 1; + if (!CheckMemory(g, initid, args, 1, false)) { - char *p, *path = NULL; + char *p; int rc; PJVAL jvp; PJSON jsp; @@ -2254,21 +2439,34 @@ char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, goto err; } // endif rc - jvp = MakeValue(g, args, 0); + if (!g->Xchk) { + jvp = MakeValue(g, args, 0); - if ((p = jvp->GetString())) { - if (!(jsp = ParseJson(g, p, strlen(p)))) { - PUSH_WARNING(g->Message); + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); - goto err; - } // endif jsp + goto err; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr } else - jsp = jvp->GetJson(); + jsp = (PJSON)g->Xchk; jsx = new(g)JSNX(g, jsp, TYPE_STRING); path = jsx->Locate(g, jsp, args->args[1], args->arg_type[1], args->lengths[1]); + if (g->Alchecked) + // Keep result of constant function + g->Xchk = path; + err: g->jump_level--; *res_length = (path) ? strlen(path) : 0; @@ -2288,10 +2486,10 @@ void Json_Locate_deinit(UDF_INIT* initid) /***********************************************************************/ my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen, more = 1024; + unsigned long reslen, memlen, fl, more = 1024; - if (args->arg_count > 4) { - strcpy(message, "Json_File cannot accept more than 4 arguments"); + if (args->arg_count < 1 || args->arg_count > 4) { + strcpy(message, "Json_File only accepts 1 to 4 arguments"); return true; } else if (args->arg_type[0] != STRING_RESULT) { strcpy(message, "Json_File first argument must be a (string) file name"); @@ -2313,12 +2511,16 @@ my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) initid->maybe_null = 1; CalcLen(args, false, reslen, memlen); + fl = GetFileLength(args->args[0]); - if (args->arg_count > 2 && *(longlong*)args->args[2]) - more += GetFileLength(args->args[0]) * M; + if (initid->const_item) + more += fl; + + if (args->arg_count > 1 && *(longlong*)args->args[1]) + more += fl * M; memlen += more; - return JsonInit(initid, message, false, reslen, memlen); + return JsonInit(initid, args, message, false, reslen, memlen); } // end of Json_File_init char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -2327,6 +2529,12 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, char *str, *fn; PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->N) { + str = (char*)g->Xchk; + goto fin; + } else if (g->Alchecked) + g->N = 1; + PlugSubSet(g, g->Sarea, g->Sarea_Size); fn = MakePSZ(g, args, 0); @@ -2392,6 +2600,11 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, } else str = GetJsonFile(g, fn); + if (g->Alchecked) + // Keep result of constant function + g->Xchk = str; + + fin: *res_length = (str) ? strlen(str) : 0; return str; } // end of Json_File @@ -2423,7 +2636,7 @@ my_bool Json_Make_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // endifs CalcLen(args, false, reslen, memlen); - return JsonInit(initid, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Make_File_init char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -2434,8 +2647,25 @@ char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, PJVAL jvp; PGLOBAL g = (PGLOBAL)initid->ptr; + if (g->N) { + str = (char*)g->Xchk; + goto fin; + } else if (g->Alchecked) + g->N = 1; + PlugSubSet(g, g->Sarea, g->Sarea_Size); - jvp = MakeValue(g, args, 0); + + if (!g->Xchk) { + jvp = MakeValue(g, args, 0); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jvp; + JsonMemSave(g); + } // endif Mrr + + } else + jvp = (PJVAL)g->Xchk; + fn = MakePSZ(g, args, 1); pretty = (args->arg_count > 2) ? (int)*(longlong*)args->args[2] : 2; @@ -2443,6 +2673,12 @@ char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(msg); str= fn; + + if (g->Alchecked) + // Keep result of constant function + g->Xchk = str; + + fin: *res_length = (str) ? strlen(str) : 0; return str; } // end of Json_Make_File diff --git a/storage/connect/mysql-test/connect/r/json.result b/storage/connect/mysql-test/connect/r/json.result index acb74c38e26..aa6b04c58c7 100644 --- a/storage/connect/mysql-test/connect/r/json.result +++ b/storage/connect/mysql-test/connect/r/json.result @@ -171,6 +171,40 @@ line ] DROP TABLE t1; # +# Testing a pretty=0 file +# +CREATE TABLE t1 +( +ISBN CHAR(15) NOT NULL, +Language CHAR(2) FIELD_FORMAT='LANG', +Subject CHAR(32) FIELD_FORMAT='SUBJECT', +AuthorFN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:FIRSTNAME', +AuthorLN CHAR(128) FIELD_FORMAT='AUTHOR:[X]:LASTNAME', +Title CHAR(32) FIELD_FORMAT='TITLE', +Translation CHAR(32) FIELD_FORMAT='TRANSLATED:PREFIX', +TranslatorFN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:FIRSTNAME', +TranslatorLN CHAR(80) FIELD_FORMAT='TRANSLATED:TRANSLATOR:LASTNAME', +Publisher CHAR(20) FIELD_FORMAT='PUBLISHER:NAME', +Location CHAR(16) FIELD_FORMAT='PUBLISHER:PLACE', +Year int(4) FIELD_FORMAT='DATEPUB', +INDEX IX(ISBN) +) +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0'; +SHOW INDEX FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment +t1 1 IX 1 ISBN A NULL NULL NULL XINDEX +SELECT * FROM t1; +ISBN Language Subject AuthorFN AuthorLN Title Translation TranslatorFN TranslatorLN Publisher Location Year +9782212090819 fr applications Jean-Michel Bernadac Construire une application XML NULL NULL NULL Eyrolles Paris 1999 +9782212090819 fr applications François Knab Construire une application XML NULL NULL NULL Eyrolles Paris 1999 +9782840825685 fr applications William J. Pardi XML en Action adapté de l'anglais par James Guerin Microsoft Press Paris 2001 +DESCRIBE SELECT * FROM t1 WHERE ISBN = '9782212090819'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ref IX IX 15 const 1 Using where +UPDATE t1 SET AuthorFN = 'Philippe' WHERE ISBN = '9782212090819'; +ERROR HY000: Got error 122 'Cannot write expanded column when Pretty is not 2' from CONNECT +DROP TABLE t1; +# # A file with 2 arrays # CREATE TABLE t1 ( From 175ef097e201367f0f5ea98886d8f014584aa586 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 22 Aug 2015 18:11:42 +0200 Subject: [PATCH 27/39] Handle is_null and error arguments Fix wrong calling sequence for RESULT_INT and RESULT_REAL functions. modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h --- storage/connect/jsonudf.cpp | 179 ++++++++++++++++++++++++++---------- storage/connect/jsonudf.h | 4 +- 2 files changed, 131 insertions(+), 52 deletions(-) diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index d5ec8abc4d4..0f2ea5522e4 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -1465,7 +1465,7 @@ my_bool Json_Array_Add_Values_init(UDF_INIT *initid, UDF_ARGS *args, char *messa } // end of Json_Array_Add_Values_init char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *is_null, char *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1498,7 +1498,12 @@ char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, } else str = (char*)g->Xchk; - *res_length = (str) ? strlen(str) : 0; + if (!str) { + *res_length = 0; + *is_null = 1; + } else + *res_length = strlen(str); + return str; } // end of Json_Array_Add_Values @@ -1527,7 +1532,7 @@ my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Array_Add_init char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1565,8 +1570,10 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, arp->AddValue(g, MakeValue(g, args, 1), x); arp->InitArray(g); str = MakeResult(g, args, top, n); - } else + } else { PUSH_WARNING("First argument is not an array"); + if (g->Mrr) *error = 1; + } // endif jvp } // endif CheckMemory @@ -1610,7 +1617,7 @@ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Array_Delete_init char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1636,8 +1643,10 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, arp->DeleteValue(n); arp->InitArray(g); str = MakeResult(g, args, top); - } else + } else { PUSH_WARNING("First argument is not an array"); + if (g->Mrr) *error = 1; + } // endif jvp } // endif CheckMemory @@ -1769,7 +1778,7 @@ my_bool Json_Object_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Object_Add_init char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *error) { char *key, *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1794,8 +1803,10 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, key = MakeKey(g, args, 1); jobp->SetValue(g, jvp, key); str = MakeResult(g, args, top); - } else + } else { PUSH_WARNING("First argument is not an object"); + if (g->Mrr) *error = 1; + } // endif jvp } // endif CheckMemory @@ -1839,7 +1850,7 @@ my_bool Json_Object_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Object_Delete_init char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *, char *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1864,8 +1875,10 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, jobp = jvp->GetObject(); jobp->DeleteKey(key); str = MakeResult(g, args, top); - } else + } else { PUSH_WARNING("First argument is not an object"); + if (g->Mrr) *error = 1; + } // endif jvp } // endif CheckMemory @@ -1906,7 +1919,7 @@ my_bool Json_Object_List_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Object_List_init char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *is_null, char *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1922,9 +1935,10 @@ char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!(str = Serialize(g, jarp, NULL, 0))) PUSH_WARNING(g->Message); - } else + } else { PUSH_WARNING("First argument is not an object"); - + if (g->Mrr) *error = 1; + } // endif jvp } // endif CheckMemory @@ -1937,7 +1951,12 @@ char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, } else str = (char*)g->Xchk; - *res_length = (str) ? strlen(str) : 0; + if (!str) { + *is_null = 1; + *res_length = 0; + } else + *res_length = strlen(str); + return str; } // end of Json_Object_List @@ -2118,7 +2137,7 @@ my_bool Json_Get_String_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Get_String_init char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *is_null, char *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2161,6 +2180,7 @@ char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); + *is_null = 1; return NULL; } // endif SetJpath @@ -2176,7 +2196,12 @@ char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory fin: - *res_length = (str) ? strlen(str) : 0; + if (!str) { + *is_null = 1; + *res_length = 0; + } else + *res_length = strlen(str); + return str; } // end of Json_Get_String @@ -2208,14 +2233,19 @@ my_bool Json_Get_Int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Get_Int_init -long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) +long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, + char *is_null, char *error) { PGLOBAL g = (PGLOBAL)initid->ptr; - if (g->N) - return (g->Xchk) ? *(long long*)g->Xchk : NULL; - else if (g->Alchecked) + if (g->N) { + if (!g->Xchk) { + *is_null = 1; + return 0LL; + } else + return *(long long*)g->Xchk; + + } else if (g->Alchecked) g->N = 1; if (!CheckMemory(g, initid, args, 1, false)) { @@ -2231,7 +2261,9 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, if ((p = jvp->GetString())) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); - return NULL; + if (g->Mrr) *error = 1; + *is_null = 1; + return 0; } // endif jsp } else @@ -2250,14 +2282,16 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); - return NULL; + *is_null = 1; + return 0; } // endif SetJpath jsx->ReadValue(g); if (jsx->GetValue()->IsNull()) { PUSH_WARNING("Value not found"); - return NULL; + *is_null = 1; + return 0; } // endif IsNull n = jsx->GetValue()->GetBigintValue(); @@ -2270,9 +2304,11 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif Alchecked return n; - } else - return NULL; + } // endif CheckMemory + if (g->Mrr) *error = 1; + *is_null = 1; + return 0LL; } // end of Json_Get_Int void Json_Get_Int_deinit(UDF_INIT* initid) @@ -2311,14 +2347,19 @@ my_bool Json_Get_Real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Get_Real_init -double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) +double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, + char *is_null, char *error) { PGLOBAL g = (PGLOBAL)initid->ptr; - if (g->N) - return (g->Xchk) ? *(double*)g->Xchk : NULL; - else if (g->Alchecked) + if (g->N) { + if (!g->Xchk) { + *is_null = 1; + return 0.0; + } else + return *(double*)g->Xchk; + + } else if (g->Alchecked) g->N = 1; if (!CheckMemory(g, initid, args, 1, false)) { @@ -2334,7 +2375,8 @@ double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, char *result, if ((p = jvp->GetString())) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); - return NULL; + *is_null = 1; + return 0.0; } // endif jsp } else @@ -2353,14 +2395,16 @@ double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, char *result, if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); - return NULL; + *is_null = 1; + return 0.0; } // endif SetJpath jsx->ReadValue(g); if (jsx->GetValue()->IsNull()) { PUSH_WARNING("Value not found"); - return NULL; + *is_null = 1; + return 0.0; } // endif IsNull d = jsx->GetValue()->GetFloatValue(); @@ -2373,9 +2417,11 @@ double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif Alchecked return d; - } else - return NULL; + } // endif CheckMemory + if (g->Mrr) *error = 1; + *is_null = 1; + return 0.0; } // end of Json_Get_Real void Json_Get_Real_deinit(UDF_INIT* initid) @@ -2409,15 +2455,22 @@ my_bool Json_Locate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Locate_init char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *is_null, char *error) { char *path = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; if (g->N) { - path = (char*)g->Xchk; - *res_length = (path) ? strlen(path) : 0; - return path; + if (g->Xchk) { + path = (char*)g->Xchk; + *res_length = strlen(path); + return path; + } else { + *res_length = 0; + *is_null = 1; + return NULL; + } // endif Xchk + } else if (g->Alchecked) g->N = 1; @@ -2431,11 +2484,15 @@ char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, // Save stack and allocation environment and prepare error return if (g->jump_level == MAX_JUMP) { PUSH_WARNING(MSG(TOO_MANY_JUMPS)); + *error = 1; + *is_null = 1; return NULL; } // endif jump_level if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { PUSH_WARNING(g->Message); + *error = 1; + path = NULL; goto err; } // endif rc @@ -2445,7 +2502,6 @@ char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, if ((p = jvp->GetString())) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); - goto err; } // endif jsp @@ -2469,11 +2525,19 @@ char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, err: g->jump_level--; - *res_length = (path) ? strlen(path) : 0; - return path; - } else - return NULL; + if (!path) { + *res_length = 0; + *is_null = 1; + } else + *res_length = strlen(path); + + return path; + } // endif CheckMemory + + *error = 1; + *is_null = 1; + return NULL; } // end of Json_Locate void Json_Locate_deinit(UDF_INIT* initid) @@ -2524,7 +2588,7 @@ my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_File_init char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *is_null, char *error) { char *str, *fn; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2559,6 +2623,8 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int)rc, fn); PUSH_WARNING(g->Message); + if (g->Mrr) *error = 1; + *is_null = 1; return NULL; } // endif hFile @@ -2570,12 +2636,15 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!len) { // Empty or deleted file CloseFileHandle(hFile); + *is_null = 1; return NULL; } // endif len if (!memory) { CloseFileHandle(hFile); sprintf(g->Message, MSG(MAP_VIEW_ERROR), fn, GetLastError()); + PUSH_WARNING(g->Message); + *is_null = 1; return NULL; } // endif Memory @@ -2604,8 +2673,13 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, // Keep result of constant function g->Xchk = str; - fin: - *res_length = (str) ? strlen(str) : 0; +fin: + if (!str) { + *res_length = 0; + *is_null = 1; + } else + *res_length = strlen(str); + return str; } // end of Json_File @@ -2640,7 +2714,7 @@ my_bool Json_Make_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of Json_Make_File_init char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, char *is_null, char *) { char *str, *fn, *msg; int pretty; @@ -2679,7 +2753,12 @@ char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, g->Xchk = str; fin: - *res_length = (str) ? strlen(str) : 0; + if (!str) { + *res_length = 0; + *is_null = 1; + } else + *res_length = strlen(str); + return str; } // end of Json_Make_File diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index 73ae5c0ccee..02d751c6690 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -89,11 +89,11 @@ extern "C" { DllExport void Json_Get_String_deinit(UDF_INIT*); DllExport my_bool Json_Get_Int_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long Json_Get_Int(UDF_EXEC_ARGS); + DllExport long long Json_Get_Int(UDF_INIT*, UDF_ARGS*, char*, char*); DllExport void Json_Get_Int_deinit(UDF_INIT*); DllExport my_bool Json_Get_Real_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport double Json_Get_Real(UDF_EXEC_ARGS); + DllExport double Json_Get_Real(UDF_INIT*, UDF_ARGS*, char*, char*); DllExport void Json_Get_Real_deinit(UDF_INIT*); DllExport my_bool Json_Locate_init(UDF_INIT*, UDF_ARGS*, char*); From 7915abffbfa79f9f89b3df0acc99ff8b19625b6b Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 6 Sep 2015 15:51:48 +0200 Subject: [PATCH 28/39] Add experimental Bson_Array function (not documented) Change names of functions not returning Json. modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h modified: storage/connect/mysql-test/connect/r/json_udf.result modified: storage/connect/plugutil.c modified: storage/connect/value.cpp modified: storage/connect/value.h --- storage/connect/json.cpp | 10 +- storage/connect/json.h | 12 +- storage/connect/jsonudf.cpp | 1452 +++++++++-------- storage/connect/jsonudf.h | 136 +- .../mysql-test/connect/r/json_udf.result | 6 +- storage/connect/plugutil.c | 6 +- storage/connect/value.cpp | 6 +- storage/connect/value.h | 2 +- 8 files changed, 892 insertions(+), 738 deletions(-) diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 60c42a7c277..97c27192ecc 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -63,7 +63,7 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) switch (s[i]) { case '[': if (jsp) { - if (pretty < 3) { + if (pretty && pretty < 3) { strcpy(g->Message, "More than one item in file"); goto err; } else @@ -75,7 +75,7 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) break; case '{': if (jsp) { - if (pretty < 3) { + if (pretty && pretty < 3) { strcpy(g->Message, "More than one item in file"); goto err; } else @@ -336,7 +336,6 @@ PJVAL ParseValue(PGLOBAL g, int& i, STRG& src) }; // endswitch s[i] - jvp->Size = 1; return jvp; err: @@ -973,6 +972,7 @@ void JOBJECT::DeleteKey(PSZ key) for (jp = First; jp; jp = jp->Next) if (!strcmp(jp->Key, key)) { *pjp = jp->Next; + Size--; break; } else pjp = &jp->Next; @@ -1246,9 +1246,9 @@ void JVALUE::SetFloat(PGLOBAL g, double f) /***********************************************************************/ /* Set the Value's value as the given string. */ /***********************************************************************/ -void JVALUE::SetString(PGLOBAL g, PSZ s) +void JVALUE::SetString(PGLOBAL g, PSZ s, short c) { - Value = AllocateValue(g, s, TYPE_STRING); + Value = AllocateValue(g, s, TYPE_STRING, c); } // end of SetString /***********************************************************************/ diff --git a/storage/connect/json.h b/storage/connect/json.h index 28f18404e1c..0294a46045b 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -155,7 +155,8 @@ class JSON : public BLOCK { virtual PJAR GetArray(void) {return NULL;} virtual PJVAL GetValue(int i) {X return NULL;} virtual PVAL GetValue(void) {X return NULL;} - virtual PJSON GetJson(void) {X return NULL;} + virtual PJSON GetJsp(void) { X return NULL; } + virtual PJSON GetJson(void) { X return NULL; } virtual PJPR GetFirst(void) {X return NULL;} virtual int GetInteger(void) {X return 0;} virtual double GetFloat() {X return 0.0;} @@ -165,7 +166,7 @@ class JSON : public BLOCK { virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X} virtual void SetValue(PVAL valp) {X} virtual void SetValue(PJSON jsp) {X} - virtual void SetString(PGLOBAL g, PSZ s) {X} + virtual void SetString(PGLOBAL g, PSZ s, short c) {X} virtual void SetInteger(PGLOBAL g, int n) {X} virtual void SetFloat(PGLOBAL g, double f) {X} virtual void DeleteKey(char *k) {X} @@ -258,15 +259,16 @@ class JVALUE : public JSON { virtual PJOB GetObject(void); virtual PJAR GetArray(void); virtual PVAL GetValue(void) {return Value;} - virtual PJSON GetJson(void) {return (Jsp ? Jsp : this);} - virtual int GetInteger(void); + virtual PJSON GetJsp(void) {return Jsp;} + virtual PJSON GetJson(void) { return (Jsp ? Jsp : this); } + virtual int GetInteger(void); virtual long long GetBigint(void); virtual double GetFloat(void); virtual PSZ GetString(void); virtual PSZ GetText(PGLOBAL g, PSZ text); virtual void SetValue(PVAL valp) {Value = valp;} virtual void SetValue(PJSON jsp) {Jsp = jsp;} - virtual void SetString(PGLOBAL g, PSZ s); + virtual void SetString(PGLOBAL g, PSZ s, short c = 0); virtual void SetInteger(PGLOBAL g, int n); virtual void SetBigint(PGLOBAL g, longlong ll); virtual void SetFloat(PGLOBAL g, double f); diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 0f2ea5522e4..71124e644a4 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -1,12 +1,12 @@ -/************* jsonudf C++ Program Source Code File (.CPP) *************/ -/* PROGRAM NAME: jsonudf Version 1.1 */ -/* (C) Copyright to the author Olivier BERTRAND 2015 */ -/* This program are the JSON User Defined Functions . */ -/***********************************************************************/ +/****************** jsonudf C++ Program Source Code File (.CPP) ******************/ +/* PROGRAM NAME: jsonudf Version 1.1 */ +/* (C) Copyright to the author Olivier BERTRAND 2015 */ +/* This program are the JSON User Defined Functions . */ +/*********************************************************************************/ -/***********************************************************************/ -/* Include relevant sections of the MariaDB header file. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Include relevant sections of the MariaDB header file. */ +/*********************************************************************************/ #include #include #include @@ -24,32 +24,38 @@ uint GetJsonGrpSize(void); static int IsJson(UDF_ARGS *args, uint i); static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i); -/* ------------------------------ JSNX ------------------------------- */ +/* ----------------------------------- JSNX ------------------------------------ */ -/***********************************************************************/ -/* JSNX public constructor. */ -/***********************************************************************/ +/*********************************************************************************/ +/* JSNX public constructor. */ +/*********************************************************************************/ JSNX::JSNX(PGLOBAL g, PJSON row, int type, int len, int prec) { Row = row; + Jvalp = NULL; + Jpnp = NULL; + Jp = NULL; + Nodes = NULL; Value = AllocateValue(g, type, len, prec); MulVal = NULL; - Nodes = NULL; - Jp = NULL; Jpath = NULL; Buf_Type = type; Long = len; Prec = prec; Nod = 0; Xnod = -1; + K = 0; + I = -1; + Imax = 9; B = 0; Xpd = false; Parsed = false; + Found = false; } // end of JSNX constructor -/***********************************************************************/ -/* SetJpath: set and parse the json path. */ -/***********************************************************************/ +/*********************************************************************************/ +/* SetJpath: set and parse the json path. */ +/*********************************************************************************/ my_bool JSNX::SetJpath(PGLOBAL g, char *path) { // Check Value was allocated @@ -63,28 +69,9 @@ my_bool JSNX::SetJpath(PGLOBAL g, char *path) return ParseJpath(g); } // end of SetJpath -/***********************************************************************/ -/* Check whether this object is expanded. */ -/***********************************************************************/ -my_bool JSNX::CheckExpand(PGLOBAL g, int i, PSZ nm, my_bool b) -{ -#if 0 - if ((Tjp->Xcol && nm && !strcmp(nm, Tjp->Xcol) && - (Tjp->Xval < 0 || Tjp->Xval == i)) || Xpd) { - Xpd = true; // Expandable object - Nodes[i].Op = OP_EXP; - } else if (b) { - strcpy(g->Message, "Cannot expand more than one branch"); - return true; - } // endif Xcol -#endif // 0 - - return false; -} // end of CheckExpand - -/***********************************************************************/ -/* Analyse array processing options. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Analyse array processing options. */ +/*********************************************************************************/ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) { int n = (int)strlen(p); @@ -97,9 +84,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) p++; } else { // Wrong array specification - sprintf(g->Message, -// "Invalid array specification %s for %s", p, Name); - "Invalid array specification %s", p); + sprintf(g->Message, "Invalid array specification %s", p); return true; } // endif p @@ -112,9 +97,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) if (!n) { // Default specifications - if (CheckExpand(g, i, nm, false)) - return true; - else if (jnp->Op != OP_EXP) { + if (jnp->Op != OP_EXP) { if (b) { // Return 1st value (B is the index base) jnp->Rank = B; @@ -144,21 +127,8 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) case 'X': // Expand this array strcpy(g->Message, "Expand not supported by this function"); return true; -#if 0 - if (!Tjp->Xcol && nm) { - Xpd = true; - jnp->Op = OP_EXP; - Tjp->Xval = i; - Tjp->Xcol = nm; - } else if (CheckExpand(g, i, nm, true)) - return true; - - break; -#endif // 0 default: - sprintf(g->Message, -// "Invalid function specification %c for %s", *p, Name); - "Invalid function specification %c", *p); + sprintf(g->Message, "Invalid function specification %c", *p); return true; } // endswitch *p @@ -173,7 +143,6 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) } // endif n } else { -// sprintf(g->Message, "Wrong array specification for %s", Name); strcpy(g->Message, "Wrong array specification"); return true; } // endif's @@ -213,12 +182,12 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) return false; } // end of SetArrayOptions -/***********************************************************************/ -/* Parse the eventual passed Jpath information. */ -/* This information can be specified in the Fieldfmt column option */ -/* when creating the table. It permits to indicate the position of */ -/* the node corresponding to that column. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Parse the eventual passed Jpath information. */ +/* This information can be specified in the Fieldfmt column option when */ +/* creating the table. It permits to indicate the position of the node */ +/* corresponding to that column. */ +/*********************************************************************************/ my_bool JSNX::ParseJpath(PGLOBAL g) { char *p, *p2 = NULL, *pbuf = NULL; @@ -227,28 +196,10 @@ my_bool JSNX::ParseJpath(PGLOBAL g) if (Parsed) return false; // Already done - //else if (InitValue(g)) - // return true; else if (!Jpath) // Jpath = Name; return true; -#if 0 - if (To_Tdb->GetOrig()) { - // This is an updated column, get nodes from origin - for (PJCOL colp = (PJCOL)Tjp->GetColumns(); colp; - colp = (PJCOL)colp->GetNext()) - if (!stricmp(Name, colp->GetName())) { - Nod = colp->Nod; - Nodes = colp->Nodes; - goto fin; - } // endif Name - - sprintf(g->Message, "Cannot parse updated column %s", Name); - return true; - } // endif To_Orig -#endif // 0 - pbuf = PlugDup(g, Jpath); // The Jpath must be analyzed @@ -279,15 +230,14 @@ my_bool JSNX::ParseJpath(PGLOBAL g) } // endfor i, p -//fin: MulVal = AllocateValue(g, Value); Parsed = true; return false; } // end of ParseJpath -/***********************************************************************/ -/* MakeJson: Serialize the json item and set value to it. */ -/***********************************************************************/ +/*********************************************************************************/ +/* MakeJson: Serialize the json item and set value to it. */ +/*********************************************************************************/ PVAL JSNX::MakeJson(PGLOBAL g, PJSON jsp) { if (Value->IsTypeNum()) { @@ -299,9 +249,9 @@ PVAL JSNX::MakeJson(PGLOBAL g, PJSON jsp) return Value; } // end of MakeJson -/***********************************************************************/ -/* SetValue: Set a value from a JVALUE contains. */ -/***********************************************************************/ +/*********************************************************************************/ +/* SetValue: Set a value from a JVALUE contains. */ +/*********************************************************************************/ void JSNX::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) { if (val) { @@ -339,99 +289,38 @@ void JSNX::SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n) } // end of SetJsonValue -/***********************************************************************/ -/* GetJson: */ -/***********************************************************************/ +/*********************************************************************************/ +/* GetJson: */ +/*********************************************************************************/ PJVAL JSNX::GetJson(PGLOBAL g) { return GetValue(g, Row, 0); } // end of GetJson -/***********************************************************************/ -/* ReadValue: */ -/***********************************************************************/ +/*********************************************************************************/ +/* ReadValue: */ +/*********************************************************************************/ void JSNX::ReadValue(PGLOBAL g) { -//if (!Tjp->SameRow || Xnod >= Tjp->SameRow) -// Value->SetValue_pval(GetColumnValue(g, Tjp->Row, 0)); - Value->SetValue_pval(GetColumnValue(g, Row, 0)); - - // Set null when applicable -//if (Nullable) -// Value->SetNull(Value->IsZero()); - + Value->SetValue_pval(GetColumnValue(g, Row, 0)); } // end of ReadValue -/***********************************************************************/ -/* GetColumnValue: */ -/***********************************************************************/ +/*********************************************************************************/ +/* GetColumnValue: */ +/*********************************************************************************/ PVAL JSNX::GetColumnValue(PGLOBAL g, PJSON row, int i) { int n = Nod - 1; -//my_bool expd = false; -//PJAR arp; PJVAL val = NULL; -#if 0 - for (; i < Nod && row; i++) { - if (Nodes[i].Op == OP_NUM) { - Value->SetValue(row->GetType() == TYPE_JAR ? row->size() : 1); - return(Value); - } else if (Nodes[i].Op == OP_XX) { - return MakeJson(g, row); - } else switch (row->GetType()) { - case TYPE_JOB: - if (!Nodes[i].Key) { - // Expected Array was not there - if (i < Nod-1) - continue; - else - val = new(g)JVALUE(row); - - } else - val = ((PJOB)row)->GetValue(Nodes[i].Key); - - break; - case TYPE_JAR: - arp = (PJAR)row; - - if (!Nodes[i].Key) { - if (Nodes[i].Op == OP_EQ) - val = arp->GetValue(Nodes[i].Rank); - else if (Nodes[i].Op == OP_EXP) - return ExpandArray(g, arp, i); - else - return CalculateArray(g, arp, i); - - } else if (i < Nod-1) { - strcpy(g->Message, "Unexpected array"); - val = NULL; // Not an expected array - } else - val = arp->GetValue(0); - - break; - case TYPE_JVAL: - val = (PJVAL)row; - break; - default: - sprintf(g->Message, "Invalid row JSON type %d", row->GetType()); - val = NULL; - } // endswitch Type - - if (i < Nod-1) - row = (val) ? val->GetJson() : NULL; - - } // endfor i -#endif // 0 - val = GetValue(g, row, i); SetJsonValue(g, Value, val, n); return Value; } // end of GetColumnValue -/***********************************************************************/ -/* GetValue: */ -/***********************************************************************/ +/*********************************************************************************/ +/* GetValue: */ +/*********************************************************************************/ PJVAL JSNX::GetValue(PGLOBAL g, PJSON row, int i) { //int n = Nod - 1; @@ -494,48 +383,18 @@ PJVAL JSNX::GetValue(PGLOBAL g, PJSON row, int i) return val; } // end of GetValue -/***********************************************************************/ -/* ExpandArray: */ -/***********************************************************************/ +/*********************************************************************************/ +/* ExpandArray: */ +/*********************************************************************************/ PVAL JSNX::ExpandArray(PGLOBAL g, PJAR arp, int n) { -#if 0 - int ars; - PJVAL jvp; - JVALUE jval; - - ars = MY_MIN(Tjp->Limit, arp->size()); - - if (!(jvp = arp->GetValue((Nodes[n].Rx = Nodes[n].Nx)))) { - strcpy(g->Message, "Logical error expanding array"); - longjmp(g->jumper[g->jump_level], 666); - } // endif jvp - - if (n < Nod - 1 && jvp->GetJson()) { - jval.SetValue(GetColumnValue(g, jvp->GetJson(), n + 1)); - jvp = &jval; - } // endif n - - if (n >= Tjp->NextSame) { - if (++Nodes[n].Nx == ars) { - Nodes[n].Nx = 0; - Xnod = 0; - } else - Xnod = n; - - Tjp->NextSame = Xnod; - } // endif NextSame - - SetJsonValue(g, Value, jvp, n); - return Value; -#endif // 0 strcpy(g->Message, "Expand cannot be done by this function"); return NULL; } // end of ExpandArray -/***********************************************************************/ -/* CalculateArray: */ -/***********************************************************************/ +/*********************************************************************************/ +/* CalculateArray: */ +/*********************************************************************************/ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) { //int i, ars, nv = 0, nextsame = Tjp->NextSame; @@ -614,174 +473,10 @@ PVAL JSNX::CalculateArray(PGLOBAL g, PJAR arp, int n) return vp; } // end of CalculateArray -#if 0 -/***********************************************************************/ -/* GetRow: Get the object containing this column. */ -/***********************************************************************/ -PJSON JSNX::GetRow(PGLOBAL g) -{ - PJVAL val = NULL; - PJAR arp; -//PJSON nwr, row = Tjp->Row; - PJSON nwr, row = Row; - - for (int i = 0; i < Nod-1 && row; i++) { - if (Nodes[i+1].Op == OP_XX) - break; - else switch (row->GetType()) { - case TYPE_JOB: - if (!Nodes[i].Key) - // Expected Array was not there - continue; - - val = ((PJOB)row)->GetValue(Nodes[i].Key); - break; - case TYPE_JAR: - if (!Nodes[i].Key) { - arp = (PJAR)row; - - if (Nodes[i].Op == OP_EQ) - val = arp->GetValue(Nodes[i].Rank); - else - val = arp->GetValue(Nodes[i].Rx); - - } else { - strcpy(g->Message, "Unexpected array"); - val = NULL; // Not an expected array - } // endif Nodes - - break; - case TYPE_JVAL: - val = (PJVAL)row; - break; - default: - sprintf(g->Message, "Invalid row JSON type %d", row->GetType()); - val = NULL; - } // endswitch Type - - if (val) { - row = val->GetJson(); - } else { - // Construct missing objects - for (i++; row && i < Nod; i++) { - if (Nodes[i].Op == OP_XX) - break; - else if (!Nodes[i].Key) - // Construct intermediate array - nwr = new(g)JARRAY; - else - nwr = new(g)JOBJECT; - - if (row->GetType() == TYPE_JOB) { - ((PJOB)row)->SetValue(g, new(g)JVALUE(nwr), Nodes[i-1].Key); - } else if (row->GetType() == TYPE_JAR) { - ((PJAR)row)->AddValue(g, new(g)JVALUE(nwr)); - ((PJAR)row)->InitArray(g); - } else { - strcpy(g->Message, "Wrong type when writing new row"); - nwr = NULL; - } // endif's - - row = nwr; - } // endfor i - - break; - } // endelse - - } // endfor i - - return row; -} // end of GetRow - -/***********************************************************************/ -/* WriteColumn: */ -/***********************************************************************/ -void JSNX::WriteColumn(PGLOBAL g) -{ - /*********************************************************************/ - /* Check whether this node must be written. */ - /*********************************************************************/ - if (Value != To_Val) - Value->SetValue_pval(To_Val, FALSE); // Convert the updated value - - /*********************************************************************/ - /* On INSERT Null values are represented by no node. */ - /*********************************************************************/ - if (Value->IsNull() && Tjp->Mode == MODE_INSERT) - return; - - char *s; - PJOB objp = NULL; - PJAR arp = NULL; - PJVAL jvp = NULL; - PJSON jsp, row = GetRow(g); - JTYP type = row->GetType(); - - switch (row->GetType()) { - case TYPE_JOB: objp = (PJOB)row; break; - case TYPE_JAR: arp = (PJAR)row; break; - case TYPE_JVAL: jvp = (PJVAL)row; break; - default: row = NULL; // ??????????????????????????? - } // endswitch Type - - if (row) switch (Buf_Type) { - case TYPE_STRING: - if (Nodes[Nod-1].Op == OP_XX) { - s = Value->GetCharValue(); - - if (!(jsp = ParseJson(g, s, (int)strlen(s)))) { - strcpy(g->Message, s); - longjmp(g->jumper[g->jump_level], 666); - } // endif jsp - - if (arp) { - if (Nod > 1 && Nodes[Nod-2].Op == OP_EQ) - arp->SetValue(g, new(g)JVALUE(jsp), Nodes[Nod-2].Rank); - else - arp->AddValue(g, new(g)JVALUE(jsp)); - - arp->InitArray(g); - } else if (objp) { - if (Nod > 1 && Nodes[Nod-2].Key) - objp->SetValue(g, new(g)JVALUE(jsp), Nodes[Nod-2].Key); - - } else if (jvp) - jvp->SetValue(jsp); - - break; - } // endif Op - - // Passthru - case TYPE_DATE: - case TYPE_INT: - case TYPE_DOUBLE: - if (arp) { - if (Nodes[Nod-1].Op == OP_EQ) - arp->SetValue(g, new(g)JVALUE(g, Value), Nodes[Nod-1].Rank); - else - arp->AddValue(g, new(g)JVALUE(g, Value)); - - arp->InitArray(g); - } else if (objp) { - if (Nodes[Nod-1].Key) - objp->SetValue(g, new(g)JVALUE(g, Value), Nodes[Nod-1].Key); - - } else if (jvp) - jvp->SetValue(Value); - - break; - default: // ?????????? - sprintf(g->Message, "Invalid column type %d", Buf_Type); - } // endswitch Type - -} // end of WriteColumn -#endif // 0 - -/***********************************************************************/ -/* Locate a value in a JSON tree: */ -/***********************************************************************/ -PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, char *what, -enum Item_result type, unsigned long len) +/*********************************************************************************/ +/* Locate a value in a JSON tree: */ +/*********************************************************************************/ +PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) { my_bool b = false, err = true; @@ -790,8 +485,12 @@ enum Item_result type, unsigned long len) if (!jsp) { strcpy(g->Message, "Null json tree"); return NULL; - } else // Write to the path string - Jp = new(g)JOUTPATH(g, what, type, len); + } // endif jsp + + // Write to the path string + Jp = new(g) JOUTSTR(g); + Jvalp = jvp; + K = k; switch (jsp->GetType()) { case TYPE_JAR: @@ -811,7 +510,7 @@ enum Item_result type, unsigned long len) if (!g->Message[0]) strcpy(g->Message, "Invalid json tree"); - } else if (Jp->Found) { + } else if (Found) { Jp->WriteChr('\0'); PlugSubAlloc(g, NULL, Jp->N); return Jp->Strp; @@ -820,15 +519,15 @@ enum Item_result type, unsigned long len) return NULL; } // end of Locate -/***********************************************************************/ -/* Locate in a JSON Array. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Locate in a JSON Array. */ +/*********************************************************************************/ my_bool JSNX::LocateArray(PJAR jarp) { char s[16]; size_t m = Jp->N; - for (int i = 0; i < jarp->size() && !Jp->Found; i++) { + for (int i = 0; i < jarp->size() && !Found; i++) { Jp->N = m; sprintf(s, "[%d]", i + B); @@ -843,14 +542,14 @@ my_bool JSNX::LocateArray(PJAR jarp) return false; } // end of LocateArray -/***********************************************************************/ -/* Locate in a JSON Object. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Locate in a JSON Object. */ +/*********************************************************************************/ my_bool JSNX::LocateObject(PJOB jobp) { size_t m = Jp->N; - for (PJPR pair = jobp->First; pair && !Jp->Found; pair = pair->Next) { + for (PJPR pair = jobp->First; pair && !Found; pair = pair->Next) { Jp->N = m; if (Jp->WriteStr(pair->Key)) @@ -864,56 +563,248 @@ my_bool JSNX::LocateObject(PJOB jobp) return false; } // end of LocateObject -/***********************************************************************/ -/* Locate a JSON Value. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Locate a JSON Value. */ +/*********************************************************************************/ my_bool JSNX::LocateValue(PJVAL jvp) { - char *p, buf[32]; - PJAR jap; - PJOB jop; - PVAL valp; - - if ((jap = jvp->GetArray())) { + if (CompareTree(Jvalp, jvp)) { + Found = (--K == 0); + } else if (jvp->GetArray()) { if (Jp->WriteChr(':')) return true; - return LocateArray(jap); - } else if ((jop = jvp->GetObject())) { + return LocateArray(jvp->GetArray()); + } else if (jvp->GetObject()) { if (Jp->WriteChr(':')) return true; - return LocateObject(jop); - } else if (!(valp = jvp->Value) || valp->IsNull()) - return false; - else switch (Jp->Type) { - case STRING_RESULT: - p = valp->GetCharString(buf); - Jp->Found = (strlen(p) == Jp->Len && - !strncmp(Jp->What, valp->GetCharString(buf), Jp->Len)); - break; - case INT_RESULT: - Jp->Found = *(longlong*)Jp->What == valp->GetBigintValue(); - break; - case DECIMAL_RESULT: - Jp->Found = atof(Jp->What) == valp->GetFloatValue(); - break; - case REAL_RESULT: - Jp->Found = *(double*)Jp->What == valp->GetFloatValue(); - break; - default: - sprintf(Jp->g->Message, "Invalid type %d", Buf_Type); - return true; - } // endswitch Type + return LocateObject(jvp->GetObject()); + } // endif's return false; } // end of LocateValue -/* ---------------------------- JSON UDF ----------------------------- */ +/*********************************************************************************/ +/* Locate all occurrences of a value in a JSON tree: */ +/*********************************************************************************/ +PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) +{ + my_bool b = false, err = true; + PJPN jnp = (PJPN)PlugSubAlloc(g, NULL, sizeof(JPN) * mx); -/***********************************************************************/ -/* Program for SubSet re-initialization of the memory pool. */ -/***********************************************************************/ + memset(jnp, 0, sizeof(JPN) * mx); + g->Message[0] = 0; + + if (!jsp) { + strcpy(g->Message, "Null json tree"); + return NULL; + } // endif jsp + + // Write to the path string + Jp = new(g)JOUTSTR(g); + Jvalp = jvp; + Imax = mx - 1; + Jpnp = jnp; + Jp->WriteChr('['); + + switch (jsp->GetType()) { + case TYPE_JAR: + err = LocateArrayAll((PJAR)jsp); + break; + case TYPE_JOB: + err = LocateObjectAll((PJOB)jsp); + break; + case TYPE_JVAL: + err = LocateValueAll((PJVAL)jsp); + break; + default: + err = true; + } // endswitch Type + + if (err) { + if (!g->Message[0]) + strcpy(g->Message, "Invalid json tree"); + + } else { + if (Jp->N > 1) + Jp->N--; + + Jp->WriteChr(']'); + Jp->WriteChr('\0'); + PlugSubAlloc(g, NULL, Jp->N); + return Jp->Strp; + } // endif's + + return NULL; +} // end of LocateAll + +/*********************************************************************************/ +/* Locate in a JSON Array. */ +/*********************************************************************************/ +my_bool JSNX::LocateArrayAll(PJAR jarp) +{ + if (I < Imax) { + Jpnp[++I].Type = TYPE_JAR; + + for (int i = 0; i < jarp->size(); i++) { + Jpnp[I].N = i; + + if (LocateValueAll(jarp->GetValue(i))) + return true; + + } // endfor i + + I--; + } // endif I + + return false; +} // end of LocateArrayAll + +/*********************************************************************************/ +/* Locate in a JSON Object. */ +/*********************************************************************************/ +my_bool JSNX::LocateObjectAll(PJOB jobp) +{ + if (I < Imax) { + Jpnp[++I].Type = TYPE_JOB; + + for (PJPR pair = jobp->First; pair; pair = pair->Next) { + Jpnp[I].Key = pair->Key; + + if (LocateValueAll(pair->Val)) + return true; + + } // endfor i + + I--; + } // endif I + + return false; +} // end of LocateObjectAll + +/*********************************************************************************/ +/* Locate a JSON Value. */ +/*********************************************************************************/ +my_bool JSNX::LocateValueAll(PJVAL jvp) +{ + if (CompareTree(Jvalp, jvp)) + return AddPath(); + else if (jvp->GetArray()) + return LocateArrayAll(jvp->GetArray()); + else if (jvp->GetObject()) + return LocateObjectAll(jvp->GetObject()); + + return false; +} // end of LocateValueAll + +/*********************************************************************************/ +/* Compare two JSON trees. */ +/*********************************************************************************/ +my_bool JSNX::CompareTree(PJSON jp1, PJSON jp2) +{ + if (!jp1 || !jp2 || jp1->GetType() != jp2->GetType() + || jp1->size() != jp2->size()) + return false; + + my_bool found = true; + + if (jp1->GetType() == TYPE_JVAL) { + PVAL v1 = jp1->GetValue(), v2 = jp2->GetValue(); + + if (v1 && v2) { + if (v1->GetType() == v2->GetType()) + found = !v1->CompareValue(v2); + else + found = false; + + } else + found = CompareTree(jp1->GetJsp(), jp2->GetJsp()); + + } else if (jp1->GetType() == TYPE_JAR) { + for (int i = 0; found && i < jp1->size(); i++) + found = (CompareTree(jp1->GetValue(i), jp2->GetValue(i))); + + } else if (jp1->GetType() == TYPE_JOB) { + PJPR p1 = jp1->GetFirst(), p2 = jp2->GetFirst(); + + for (; found && p1 && p2; p1 = p1->Next, p2 = p2->Next) + found = CompareTree(p1->Val, p2->Val); + + } else + found = false; + + return found; +} // end of CompareTree + +/*********************************************************************************/ +/* Add the found path to the list. */ +/*********************************************************************************/ +my_bool JSNX::AddPath(void) +{ + char s[16]; + my_bool b = false; + + if (Jp->WriteChr('"')) + return true; + + for (int i = 0; i <= I; i++) { + if (b) { + if (Jp->WriteChr(':')) return true; + } else + b = true; + + if (Jpnp[i].Type == TYPE_JAR) { + sprintf(s, "[%d]", Jpnp[i].N + B); + + if (Jp->WriteStr(s)) + return true; + + } else if (Jp->WriteStr(Jpnp[i].Key)) + return true; + + } // endfor i + + if (Jp->WriteStr("\",")) + return true; + + return false; +} // end of AddPath + +/* --------------------------------- JSON UDF ---------------------------------- */ + +typedef struct BSON *PBSON; + +/*********************************************************************************/ +/* Structure used to return binary json. */ +/*********************************************************************************/ +struct BSON { + char Msg[140]; + void *Memp; + ulong Reslen; + my_bool Changed; + PJSON Jsp; +}; // end of struct BSON + +/*********************************************************************************/ +/* Allocate and initialize a BSON structure. */ +/*********************************************************************************/ +static PBSON BsonAlloc(PGLOBAL g, ulong len, PJSON jsp) +{ + PBSON bsp = (PBSON)PlugSubAlloc(g, NULL, sizeof(BSON)); + + strcpy(bsp->Msg, "Binary Json"); + bsp->Msg[139] = 0; + bsp->Memp = g->Sarea; + bsp->Reslen = len; + bsp->Changed = false; + bsp->Jsp = jsp; + return bsp; +} /* end of BsonAlloc */ + +/*********************************************************************************/ +/* Program for SubSet re-initialization of the memory pool. */ +/*********************************************************************************/ static my_bool JsonSubSet(PGLOBAL g) { PPOOLHEADER pph = (PPOOLHEADER)g->Sarea; @@ -923,17 +814,28 @@ static my_bool JsonSubSet(PGLOBAL g) return FALSE; } /* end of JsonSubSet */ -/***********************************************************************/ -/* Program for saving the status of the memory pools. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Program for saving the status of the memory pools. */ +/*********************************************************************************/ inline void JsonMemSave(PGLOBAL g) { g->Createas = (int)((PPOOLHEADER)g->Sarea)->To_Free; } /* end of JsonMemSave */ -/***********************************************************************/ -/* Allocate and initialise the memory area. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Program for freeing the memory pools. */ +/*********************************************************************************/ +inline void JsonMemFree(PGLOBAL g) +{ + if (g->Alchecked) + g->Sarea = NULL; + + PlugExit(g); +} /* end of JsonMemFree */ + +/*********************************************************************************/ +/* Allocate and initialise the memory area. */ +/*********************************************************************************/ static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args, char *message, my_bool mbn, unsigned long reslen, unsigned long memlen) @@ -944,22 +846,25 @@ static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args, strcpy(message, "Allocation error"); return true; } else if (g->Sarea_Size == 0) { - strcpy(message, g->Message); - PlugExit(g); - return true; - } else - initid->ptr = (char*)g; + if (memlen) { + strcpy(message, g->Message); + PlugExit(g); + return true; + } else + assert(IsJson(args, 0) == 3); + + } // endif g g->Mrr = (args->arg_count && args->args[0]) ? 1 : 0; - g->Alchecked = (initid->const_item) ? 1 : 0; initid->maybe_null = mbn; initid->max_length = reslen; - return false; + initid->ptr = (char*)g; + return false; } // end of JsonInit -/***********************************************************************/ -/* Check if a path was specified and set jvp according to it. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Check if a path was specified and set jvp according to it. */ +/*********************************************************************************/ static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON top, PJVAL& jvp, int n) { for (uint i = n; i < args->arg_count; i++) @@ -982,9 +887,9 @@ static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON top, PJVAL& jvp, int n return false; } // end of CheckPath -/***********************************************************************/ -/* Make the result according to the first argument type. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make the result according to the first argument type. */ +/*********************************************************************************/ static char *MakeResult(PGLOBAL g, UDF_ARGS *args, PJSON top, int n = 2) { char *str; @@ -1004,33 +909,40 @@ static char *MakeResult(PGLOBAL g, UDF_ARGS *args, PJSON top, int n = 2) PUSH_WARNING(msg); str = NULL; - } else if (!(str = Serialize(g, top, NULL, 0))) - PUSH_WARNING(g->Message); + } else { + if (!(str = Serialize(g, top, NULL, 0))) + PUSH_WARNING(g->Message); + + if (IsJson(args, 0) == 3) + ((PBSON)args->args[0])->Changed = 1; + + } // endif IsJson return str; } // end of MakeResult -/***********************************************************************/ -/* Returns not 0 if the argument is a JSON item or file name. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Returns not 0 if the argument is a JSON item or file name. */ +/*********************************************************************************/ static int IsJson(UDF_ARGS *args, uint i) { int n = 0; - if (i >= args->arg_count) + if (i >= args->arg_count || args->arg_type[i] != STRING_RESULT) n = 0; else if (!strnicmp(args->attributes[i], "Json_", 5)) n = 1; // arg is a json item - else if (args->arg_type[i] == STRING_RESULT && - !strnicmp(args->attributes[i], "Jfile_", 6)) + else if (!strnicmp(args->attributes[i], "Jfile_", 6)) n = 2; // arg is a json file name + else if (!strnicmp(args->attributes[i], "Bson_", 5)) + n = 3; // arg is a binary json item return n; } // end of IsJson -/***********************************************************************/ -/* GetFileLength: returns file size in number of bytes. */ -/***********************************************************************/ +/*********************************************************************************/ +/* GetFileLength: returns file size in number of bytes. */ +/*********************************************************************************/ static long GetFileLength(char *fn) { int h; @@ -1049,21 +961,23 @@ static long GetFileLength(char *fn) return len; } // end of GetFileLength -/***********************************************************************/ -/* Calculate the reslen and memlen needed by a function. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Calculate the reslen and memlen needed by a function. */ +/*********************************************************************************/ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, unsigned long& reslen, unsigned long& memlen, my_bool mod = false) { char fn[_MAX_PATH]; - unsigned long i, k, n; + unsigned long i, k, m, n; long fl, j = -1; reslen = args->arg_count + 2; // Calculate the result max length for (i = 0; i < args->arg_count; i++) { + n = IsJson(args, i); + if (obj) { if (!(k = args->attribute_lengths[i])) k = strlen(args->attributes[i]); @@ -1073,18 +987,20 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, switch (args->arg_type[i]) { case STRING_RESULT: - if (IsJson(args, i) == 2 && args->args[i]) { + if (n == 2 && args->args[i]) { if (!mod) { - n = MY_MIN(args->lengths[i], sizeof(fn) - 1); - memcpy(fn, args->args[i], n); - fn[n] = 0; + m = MY_MIN(args->lengths[i], sizeof(fn) - 1); + memcpy(fn, args->args[i], m); + fn[m] = 0; j = i; fl = GetFileLength(fn); reslen += fl; } else reslen += args->lengths[i]; - } else if (IsJson(args, i) == 1) + } else if (n == 3 && args->args[i]) + reslen += ((PBSON)args->args[i])->Reslen; + else if (n == 1) reslen += args->lengths[i]; else reslen += (args->lengths[i] + 1) * 2; // Pessimistic ! @@ -1109,11 +1025,15 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, } // endfor i - // Calculate the amount of memory needed - memlen = MEMFIX + sizeof(JOUTSTR) + reslen; + if (IsJson(args, 0) == 3) { + memlen = 0L; // We'll use arg memory + return false; + } else // Calculate the amount of memory needed + memlen = MEMFIX + sizeof(JOUTSTR) + reslen; for (i = 0; i < args->arg_count; i++) { - memlen += (args->lengths[i] + sizeof(JVALUE)); + n = IsJson(args, i); + memlen += (args->lengths[i] + sizeof(JVALUE)); if (obj) { if (!(k = args->attribute_lengths[i])) @@ -1125,17 +1045,19 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, switch (args->arg_type[i]) { case STRING_RESULT: - if (IsJson(args, i) == 2 && args->args[i]) { + if (n == 2 && args->args[i]) { if ((signed)i != j) { - n = MY_MIN(args->lengths[i], sizeof(fn) - 1); - memcpy(fn, args->args[i], n); - fn[n] = 0; + m = MY_MIN(args->lengths[i], sizeof(fn) - 1); + memcpy(fn, args->args[i], m); + fn[m] = 0; j = -1; fl = GetFileLength(fn); } // endif i memlen += fl * M; - } else if (IsJson(args, i) == 1) + } else if (IsJson(args, i) == 3) + memlen += sizeof(JVALUE); + else if (IsJson(args, i) == 1) memlen += args->lengths[i] * M; // Estimate parse memory memlen += sizeof(TYPVAL); @@ -1160,14 +1082,26 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, return false; } // end of CalcLen -/***********************************************************************/ -/* Check if the calculated memory is enough. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Check if the calculated memory is enough. */ +/*********************************************************************************/ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n, my_bool obj, my_bool mod = false) { unsigned long rl, ml; + if (IsJson(args, 0) == 3) { + if (!g->Sarea) { + PPOOLHEADER p = (PPOOLHEADER)((PBSON)args->args[0])->Memp; + + g->Sarea = p; + g->Sarea_Size = p->To_Free + p->FreeBlk; + g->Alchecked = 1; + } // endif Sarea + + return false; + } // endif IsJson + n = MY_MIN(n, args->arg_count); for (uint i = 0; i < n; i++) @@ -1199,9 +1133,9 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, return false; } // end of CheckMemory -/***********************************************************************/ -/* Make a zero terminated string from the passed argument. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a zero terminated string from the passed argument. */ +/*********************************************************************************/ static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i) { if (args->arg_count > (unsigned)i && args->args[i]) { @@ -1216,9 +1150,9 @@ static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i) } // end of MakePSZ -/***********************************************************************/ -/* Make a valid key from the passed argument. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a valid key from the passed argument. */ +/*********************************************************************************/ static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) { if (args->arg_count > (unsigned)i) { @@ -1257,9 +1191,9 @@ static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) return "Key"; } // end of MakeKey -/***********************************************************************/ -/* Return a json file contains. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Return a json file contains. */ +/*********************************************************************************/ static char *GetJsonFile(PGLOBAL g, char *fn) { char *str; @@ -1290,13 +1224,14 @@ static char *GetJsonFile(PGLOBAL g, char *fn) return str; } // end of GetJsonFile -/***********************************************************************/ -/* Make a JSON value from the passed argument. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a JSON value from the passed argument. */ +/*********************************************************************************/ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) { char *sap = (args->arg_count > i) ? args->args[i] : NULL; int n, len; + short c; long long bigint; PJSON jsp; PJVAL jvp = new(g) JVALUE; @@ -1304,26 +1239,33 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) if (sap) switch (args->arg_type[i]) { case STRING_RESULT: if ((len = args->lengths[i])) { - sap = MakePSZ(g, args, i); + if ((n = IsJson(args, i)) < 3) + sap = MakePSZ(g, args, i); - if ((n = IsJson(args, i))) { - if (n == 2) { - if (!(sap = GetJsonFile(g, sap))) + if (n) { + if (n == 3) { + jsp = ((PBSON)sap)->Jsp; + } else { + if (n == 2) { + if (!(sap = GetJsonFile(g, sap))) + PUSH_WARNING(g->Message); + + len = (sap) ? strlen(sap) : 0; + } // endif n + + if (!(jsp = ParseJson(g, sap, len, 3))) PUSH_WARNING(g->Message); - - len = (sap) ? strlen(sap) : 0; - } // endif n - - if (!(jsp = ParseJson(g, sap, len, 3))) - PUSH_WARNING(g->Message); + } // endif's n if (jsp && jsp->GetType() == TYPE_JVAL) jvp = (PJVAL)jsp; else jvp->SetValue(jsp); - } else - jvp->SetString(g, sap); + } else { + c = (strnicmp(args->attributes[i], "ci", 2)) ? 0 : 1; + jvp->SetString(g, sap, c); + } // endif n } // endif len @@ -1353,9 +1295,9 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) return jvp; } // end of MakeValue -/***********************************************************************/ -/* Make a Json value containing the parameter. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a Json value containing the parameter. */ +/*********************************************************************************/ my_bool Json_Value_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1386,7 +1328,7 @@ char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, str = strcpy(result, g->Message); // Keep result of constant function - g->Xchk = (g->Alchecked) ? str : NULL; + g->Xchk = (initid->const_item) ? str : NULL; } else str = (char*)g->Xchk; @@ -1396,12 +1338,12 @@ char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Value_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Value_deinit -/***********************************************************************/ -/* Make a Json array containing all the parameters. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a Json array containing all the parameters. */ +/*********************************************************************************/ my_bool Json_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1432,7 +1374,7 @@ char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, str = strcpy(result, g->Message); // Keep result of constant function - g->Xchk = (g->Alchecked) ? str : NULL; + g->Xchk = (initid->const_item) ? str : NULL; } else str = (char*)g->Xchk; @@ -1442,12 +1384,12 @@ char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Array_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Array_deinit -/***********************************************************************/ -/* Add one or several values to a Json array. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Add one or several values to a Json array. */ +/*********************************************************************************/ my_bool Json_Array_Add_Values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1494,7 +1436,7 @@ char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif str // Keep result of constant function - g->Xchk = (g->Alchecked) ? str : NULL; + g->Xchk = (initid->const_item) ? str : NULL; } else str = (char*)g->Xchk; @@ -1509,12 +1451,12 @@ char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Array_Add_Values_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Array_Add_Values_deinit -/***********************************************************************/ -/* Add one value to a Json array. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Add one value to a Json array. */ +/*********************************************************************************/ my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1581,7 +1523,7 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!str) str = MakePSZ(g, args, 0); - if (g->Alchecked) + if (initid->const_item) // Keep result of constant function g->Xchk = str; @@ -1591,12 +1533,12 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Array_Add_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Array_Add_deinit -/***********************************************************************/ -/* Delete a value from a Json array. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Delete a value from a Json array. */ +/*********************************************************************************/ my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1654,7 +1596,7 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!str) str = MakePSZ(g, args, 0); - if (g->Alchecked) + if (initid->const_item) // Keep result of constant function g->Xchk = str; @@ -1664,12 +1606,12 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Array_Delete_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Array_Delete_deinit -/***********************************************************************/ -/* Make a Json Oject containing all the parameters. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a Json Oject containing all the parameters. */ +/*********************************************************************************/ my_bool Json_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1698,7 +1640,7 @@ char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, str = strcpy(result, g->Message); // Keep result of constant function - g->Xchk = (g->Alchecked) ? str : NULL; + g->Xchk = (initid->const_item) ? str : NULL; } else str = (char*)g->Xchk; @@ -1708,12 +1650,12 @@ char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Object_deinit -/***********************************************************************/ -/* Make a Json Oject containing all not null parameters. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a Json Oject containing all not null parameters. */ +/*********************************************************************************/ my_bool Json_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { @@ -1745,7 +1687,7 @@ char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, str = strcpy(result, g->Message); // Keep result of constant function - g->Xchk = (g->Alchecked) ? str : NULL; + g->Xchk = (initid->const_item) ? str : NULL; } else str = (char*)g->Xchk; @@ -1755,12 +1697,12 @@ char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_Nonull_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Object_nonull_deinit -/***********************************************************************/ -/* Add or replace a value in a Json Object. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Add or replace a value in a Json Object. */ +/*********************************************************************************/ my_bool Json_Object_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1814,7 +1756,7 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!str) str = MakePSZ(g, args, 0); - if (g->Alchecked) + if (initid->const_item) // Keep result of constant function g->Xchk = str; @@ -1824,12 +1766,12 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_Add_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Object_Add_deinit -/***********************************************************************/ -/* Delete a value from a Json object. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Delete a value from a Json object. */ +/*********************************************************************************/ my_bool Json_Object_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1886,7 +1828,7 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!str) str = MakePSZ(g, args, 0); - if (g->Alchecked) + if (initid->const_item) // Keep result of constant function g->Xchk = str; @@ -1896,12 +1838,12 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_Delete_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Object_Delete_deinit -/***********************************************************************/ -/* Returns an array of the Json object keys. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Returns an array of the Json object keys. */ +/*********************************************************************************/ my_bool Json_Object_List_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; @@ -1942,11 +1884,11 @@ char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif CheckMemory - if (g->Alchecked) { + if (initid->const_item) { // Keep result of constant function g->Xchk = str; g->N = 1; // str can be NULL - } // endif Alchecked + } // endif const_item } else str = (char*)g->Xchk; @@ -1962,12 +1904,12 @@ char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_List_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Object_List_deinit -/***********************************************************************/ -/* Make a Json array from values coming from rows. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a Json array from values coming from rows. */ +/*********************************************************************************/ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, n = GetJsonGrpSize(); @@ -1975,7 +1917,10 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) if (args->arg_count != 1) { strcpy(message, "Json_Array_Grp can only accept 1 argument"); return true; - } else + } else if (IsJson(args, 0) == 3) { + strcpy(message, "Json_Array_Grp does not support Bson argument"); + return true; + } else CalcLen(args, false, reslen, memlen); reslen *= n; @@ -2032,20 +1977,23 @@ void Json_Array_Grp_clear(UDF_INIT *initid, char*, char*) void Json_Array_Grp_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Array_Grp_deinit -/***********************************************************************/ -/* Make a Json object from values coming from rows. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Make a Json object from values coming from rows. */ +/*********************************************************************************/ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, n = GetJsonGrpSize(); if (args->arg_count != 2) { - strcpy(message, "Json_Array_Grp can only accept 2 arguments"); + strcpy(message, "Json_Object_Grp can only accept 2 arguments"); return true; - } else + } else if (IsJson(args, 0) == 3) { + strcpy(message, "Json_Object_Grp does not support Bson arguments"); + return true; + } else CalcLen(args, true, reslen, memlen); reslen *= n; @@ -2100,21 +2048,22 @@ void Json_Object_Grp_clear(UDF_INIT *initid, char*, char*) void Json_Object_Grp_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_Object_Grp_deinit -/***********************************************************************/ -/* Get a string value from a Json item. */ -/***********************************************************************/ -my_bool Json_Get_String_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +/*********************************************************************************/ +/* Get a string value from a Json item. */ +/*********************************************************************************/ +my_bool JsonGetString_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; + int n = IsJson(args, 0); if (args->arg_count < 2) { - strcpy(message, "Json_Get_String must have at least 2 arguments"); + strcpy(message, "JsonGetString must have at least 2 arguments"); return true; - } else if (!IsJson(args, 0) && args->arg_type[1] != STRING_RESULT) { - strcpy(message, "Json_Get_String first argument must be a json item"); + } else if (!n && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "JsonGetString first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a (jpath) string"); @@ -2122,7 +2071,7 @@ my_bool Json_Get_String_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen); - if (IsJson(args, 0) == 2) { + if (n == 2) { char fn[_MAX_PATH]; long fl; @@ -2130,13 +2079,13 @@ my_bool Json_Get_String_init(UDF_INIT *initid, UDF_ARGS *args, char *message) fn[args->lengths[0]] = 0; fl = GetFileLength(fn); memlen += fl * 3; - } else + } else if (n != 3) memlen += args->lengths[0] * 3; return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Get_String_init +} // end of JsonGetString_init -char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *JsonGetString(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *str = NULL; @@ -2145,7 +2094,7 @@ char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, if (g->N) { str = (char*)g->Xchk; goto fin; - } else if (g->Alchecked) + } else if (initid->const_item) g->N = 1; if (!CheckMemory(g, initid, args, 1, false)) { @@ -2189,7 +2138,7 @@ char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!jsx->GetValue()->IsNull()) str = jsx->GetValue()->GetCharValue(); - if (g->Alchecked) + if (initid->const_item) // Keep result of constant function g->Xchk = str; @@ -2203,25 +2152,25 @@ char *Json_Get_String(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Get_String +} // end of JsonGetString -void Json_Get_String_deinit(UDF_INIT* initid) +void JsonGetString_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); -} // end of Json_Get_String_deinit + JsonMemFree((PGLOBAL)initid->ptr); +} // end of JsonGetString_deinit -/***********************************************************************/ -/* Get an integer value from a Json item. */ -/***********************************************************************/ -my_bool Json_Get_Int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +/*********************************************************************************/ +/* Get an integer value from a Json item. */ +/*********************************************************************************/ +my_bool JsonGetInt_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count != 2) { - strcpy(message, "Json_Get_Int must have 2 arguments"); + strcpy(message, "JsonGetInt must have 2 arguments"); return true; - } else if (!IsJson(args, 0) && args->arg_type[1] != STRING_RESULT) { - strcpy(message, "Json_Get_Int first argument must be a json item"); + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "JsonGetInt first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a (jpath) string"); @@ -2229,11 +2178,13 @@ my_bool Json_Get_Int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else CalcLen(args, false, reslen, memlen); - memlen += 1000; // TODO: calculate this - return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Get_Int_init + if (IsJson(args, 0) != 3) + memlen += 1000; // TODO: calculate this -long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of JsonGetInt_init + +long long JsonGetInt(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2245,7 +2196,7 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, } else return *(long long*)g->Xchk; - } else if (g->Alchecked) + } else if (initid->const_item) g->N = 1; if (!CheckMemory(g, initid, args, 1, false)) { @@ -2296,12 +2247,12 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, n = jsx->GetValue()->GetBigintValue(); - if (g->Alchecked) { + if (initid->const_item) { // Keep result of constant function long long *np = (long long*)PlugSubAlloc(g, NULL, sizeof(long long)); *np = n; g->Xchk = np; - } // endif Alchecked + } // endif const_item return n; } // endif CheckMemory @@ -2309,25 +2260,25 @@ long long Json_Get_Int(UDF_INIT *initid, UDF_ARGS *args, if (g->Mrr) *error = 1; *is_null = 1; return 0LL; -} // end of Json_Get_Int +} // end of JsonGetInt -void Json_Get_Int_deinit(UDF_INIT* initid) +void JsonGetInt_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); -} // end of Json_Get_Int_deinit + JsonMemFree((PGLOBAL)initid->ptr); +} // end of JsonGetInt_deinit -/***********************************************************************/ -/* Get a double value from a Json item. */ -/***********************************************************************/ -my_bool Json_Get_Real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +/*********************************************************************************/ +/* Get a double value from a Json item. */ +/*********************************************************************************/ +my_bool JsonGetReal_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Json_Get_Real must have at least 2 arguments"); + strcpy(message, "JsonGetReal must have at least 2 arguments"); return true; - } else if (!IsJson(args, 0) && args->arg_type[1] != STRING_RESULT) { - strcpy(message, "Json_Get_Real first argument must be a json item"); + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "JsonGetReal first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a (jpath) string"); @@ -2343,11 +2294,14 @@ my_bool Json_Get_Real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) initid->decimals = 15; CalcLen(args, false, reslen, memlen); - memlen += 1000; // TODO: calculate this - return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Get_Real_init -double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, + if (IsJson(args, 0) != 3) + memlen += 1000; // TODO: calculate this + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of JsonGetReal_init + +double JsonGetReal(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2359,7 +2313,7 @@ double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, } else return *(double*)g->Xchk; - } else if (g->Alchecked) + } else if (initid->const_item) g->N = 1; if (!CheckMemory(g, initid, args, 1, false)) { @@ -2409,12 +2363,12 @@ double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, d = jsx->GetValue()->GetFloatValue(); - if (g->Alchecked) { + if (initid->const_item) { // Keep result of constant function double *dp = (double*)PlugSubAlloc(g, NULL, sizeof(double)); *dp = d; g->Xchk = dp; - } // endif Alchecked + } // endif const_item return d; } // endif CheckMemory @@ -2422,17 +2376,17 @@ double Json_Get_Real(UDF_INIT *initid, UDF_ARGS *args, if (g->Mrr) *error = 1; *is_null = 1; return 0.0; -} // end of Json_Get_Real +} // end of JsonGetReal -void Json_Get_Real_deinit(UDF_INIT* initid) +void JsonGetReal_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); -} // end of Json_Get_Real_deinit + JsonMemFree((PGLOBAL)initid->ptr); +} // end of JsonGetReal_deinit -/***********************************************************************/ -/* Locate a value in a Json tree. */ -/***********************************************************************/ -my_bool Json_Locate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +/*********************************************************************************/ +/* Locate a value in a Json tree. */ +/*********************************************************************************/ +my_bool JsonLocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, more = 1000; @@ -2442,19 +2396,25 @@ my_bool Json_Locate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { strcpy(message, "Json_Locate first argument must be a json item"); return true; - } else if (args->arg_count > 2) - if (args->arg_type[2] != INT_RESULT) { - strcpy(message, "Third argument is not an integer (memory)"); + } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { + strcpy(message, "Third argument is not an integer (rank)"); + return true; + } else if (args->arg_count > 3) + if (args->arg_type[3] != INT_RESULT) { + strcpy(message, "Fourth argument is not an integer (memory)"); return true; } else more = (ulong)*(longlong*)args->args[2]; CalcLen(args, false, reslen, memlen); - memlen += more; // TODO: calculate this - return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Locate_init -char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, + if (IsJson(args, 0) != 3) + memlen += 1000; // TODO: calculate this + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of JsonLocate_init + +char *JsonLocate(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *path = NULL; @@ -2471,13 +2431,13 @@ char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, return NULL; } // endif Xchk - } else if (g->Alchecked) + } else if (initid->const_item) g->N = 1; if (!CheckMemory(g, initid, args, 1, false)) { char *p; - int rc; - PJVAL jvp; + int k, rc; + PJVAL jvp, jvp2; PJSON jsp; PJSNX jsx; @@ -2516,10 +2476,15 @@ char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, } else jsp = (PJSON)g->Xchk; - jsx = new(g)JSNX(g, jsp, TYPE_STRING); - path = jsx->Locate(g, jsp, args->args[1], args->arg_type[1], args->lengths[1]); + // The item to locate + jvp2 = MakeValue(g, args, 1); - if (g->Alchecked) + k = (args->arg_count > 2) ? (int)*(long long*)args->args[2] : 1; + + jsx = new(g)JSNX(g, jsp, TYPE_STRING); + path = jsx->Locate(g, jsp, jvp2, k); + + if (initid->const_item) // Keep result of constant function g->Xchk = path; @@ -2538,16 +2503,145 @@ char *Json_Locate(UDF_INIT *initid, UDF_ARGS *args, char *result, *error = 1; *is_null = 1; return NULL; -} // end of Json_Locate +} // end of JsonLocate void Json_Locate_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); -} // end of Json_Locate_deinit + JsonMemFree((PGLOBAL)initid->ptr); +} // end of JsonLocate_deinit -/***********************************************************************/ -/* Returns a json file as a string. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Locate all occurences of a value in a Json tree. */ +/*********************************************************************************/ +my_bool Json_Locate_All_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, more = 1000; + + if (args->arg_count < 2) { + strcpy(message, "Json_Locate must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "Json_Locate first argument must be a json item"); + return true; + } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { + strcpy(message, "Third argument is not an integer (Depth)"); + return true; + } else if (args->arg_count > 3) + if (args->arg_type[3] != INT_RESULT) { + strcpy(message, "Fourth argument is not an integer (memory)"); + return true; + } else + more = (ulong)*(longlong*)args->args[2]; + + CalcLen(args, false, reslen, memlen); + + if (IsJson(args, 0) != 3) + memlen += 1000; // TODO: calculate this + + return JsonInit(initid, args, message, false, reslen, memlen); +} // end of Json_Locate_All_init + +char *Json_Locate_All(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *path = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (g->N) { + if (g->Xchk) { + path = (char*)g->Xchk; + *res_length = strlen(path); + return path; + } else { + *error = 1; + *res_length = 0; + *is_null = 1; + return NULL; + } // endif Xchk + + } else if (initid->const_item) + g->N = 1; + + if (!CheckMemory(g, initid, args, 1, false)) { + char *p; + int rc, mx = 10; + PJVAL jvp, jvp2; + PJSON jsp; + PJSNX jsx; + + // Save stack and allocation environment and prepare error return + if (g->jump_level == MAX_JUMP) { + PUSH_WARNING(MSG(TOO_MANY_JUMPS)); + *error = 1; + *is_null = 1; + return NULL; + } // endif jump_level + + if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { + PUSH_WARNING(g->Message); + *error = 1; + path = NULL; + goto err; + } // endif rc + + if (!g->Xchk) { + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + goto err; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr + + } else + jsp = (PJSON)g->Xchk; + + // The item to locate + jvp2 = MakeValue(g, args, 1); + + if (args->arg_count > 2) + mx = (int)*(long long*)args->args[2]; + + jsx = new(g)JSNX(g, jsp, TYPE_STRING); + path = jsx->LocateAll(g, jsp, jvp2, mx); + + if (initid->const_item) + // Keep result of constant function + g->Xchk = path; + + err: + g->jump_level--; + + if (!path) { + *res_length = 0; + *is_null = 1; + } else + *res_length = strlen(path); + + return path; + } // endif CheckMemory + + *error = 1; + *is_null = 1; + return NULL; +} // end of Json_Locate_All + +void Json_Locate_All_deinit(UDF_INIT* initid) +{ + JsonMemFree((PGLOBAL)initid->ptr); +} // end of Json_Locate_All_deinit + +/*********************************************************************************/ +/* Returns a json file as a json string. */ +/*********************************************************************************/ my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, fl, more = 1024; @@ -2596,7 +2690,7 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, if (g->N) { str = (char*)g->Xchk; goto fin; - } else if (g->Alchecked) + } else if (initid->const_item) g->N = 1; PlugSubSet(g, g->Sarea, g->Sarea_Size); @@ -2611,9 +2705,9 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, pretty = (args->arg_count > 2) ? (int)*(longlong*)args->args[2] : 3; - /*******************************************************************/ - /* Create the mapping file object. */ - /*******************************************************************/ + /*****************************************************************************/ + /* Create the mapping file object. */ + /*****************************************************************************/ hFile = CreateFileMap(g, fn, &mm, MODE_READ, false); if (hFile == INVALID_HANDLE_VALUE) { @@ -2628,9 +2722,9 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, return NULL; } // endif hFile - /*******************************************************************/ - /* Get the file size (assuming file is smaller than 4 GB) */ - /*******************************************************************/ + /*****************************************************************************/ + /* Get the file size (assuming file is smaller than 4 GB) */ + /*****************************************************************************/ len = mm.lenL; memory = (char *)mm.memory; @@ -2651,9 +2745,9 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, CloseFileHandle(hFile); // Not used anymore hFile = INVALID_HANDLE_VALUE; // For Fblock - /*********************************************************************/ - /* Parse the json file and allocate its tree structure. */ - /*********************************************************************/ + /*******************************************************************************/ + /* Parse the json file and allocate its tree structure. */ + /*******************************************************************************/ g->Message[0] = 0; if (!(jsp = ParseJson(g, memory, len, pretty))) { @@ -2669,7 +2763,7 @@ char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, } else str = GetJsonFile(g, fn); - if (g->Alchecked) + if (initid->const_item) // Keep result of constant function g->Xchk = str; @@ -2685,21 +2779,21 @@ fin: void Json_File_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); + JsonMemFree((PGLOBAL)initid->ptr); } // end of Json_File_deinit -/***********************************************************************/ -/* Make a json file from a json item. */ -/***********************************************************************/ -my_bool Json_Make_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +/*********************************************************************************/ +/* Make a json file from a json item. */ +/*********************************************************************************/ +my_bool JsonMakeFile_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, more = 1024; if (args->arg_count < 2 || args->arg_count > 3) { - strcpy(message, "Json_Make_File only accepts 2 or 3 arguments"); + strcpy(message, "JsonMakeFile only accepts 2 or 3 arguments"); return true; - } else if (IsJson(args, 0) != 1) { - strcpy(message, "Json_Make_File first argument must be a json item"); + } else if (!IsJson(args, 0) || IsJson(args, 0) > 2) { + strcpy(message, "JsonMakeFile first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument must be a (string) file name"); @@ -2711,9 +2805,9 @@ my_bool Json_Make_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Make_File_init +} // end of JsonMakeFile_init -char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *JsonMakeFile(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *str, *fn, *msg; @@ -2724,7 +2818,7 @@ char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, if (g->N) { str = (char*)g->Xchk; goto fin; - } else if (g->Alchecked) + } else if (initid->const_item) g->N = 1; PlugSubSet(g, g->Sarea, g->Sarea_Size); @@ -2748,7 +2842,7 @@ char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, str= fn; - if (g->Alchecked) + if (initid->const_item) // Keep result of constant function g->Xchk = str; @@ -2760,9 +2854,55 @@ char *Json_Make_File(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Make_File +} // end of JsonMakeFile -void Json_Make_File_deinit(UDF_INIT* initid) +void JsonMakeFile_deinit(UDF_INIT* initid) { - PlugExit((PGLOBAL)initid->ptr); -} // end of Json_Make_File_deinit + JsonMemFree((PGLOBAL)initid->ptr); +} // end of JsonMakeFile_deinit + +/*********************************************************************************/ +/* Make and return a binary Json array containing all the parameters. */ +/*********************************************************************************/ +my_bool Bson_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + CalcLen(args, false, reslen, memlen); + memlen *= 2; // TODO: Make this adjustable + return JsonInit(initid, args, message, false, reslen, memlen); +} // end of Bson_Array_init + +char *Bson_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (!bsp || bsp->Changed) { + if (!CheckMemory(g, initid, args, args->arg_count, false)) { + PJAR arp = new(g)JARRAY; + + for (uint i = 0; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); + + arp->InitArray(g); + bsp = BsonAlloc(g, initid->max_length, arp); + strcat(bsp->Msg, " array"); + } else { + bsp = BsonAlloc(g, initid->max_length, NULL); + strncpy(bsp->Msg, g->Message, 139); + } // endif CheckMemory + + // Keep result of constant function + g->Xchk = (initid->const_item) ? bsp : NULL; + } // endif bsp + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Bson_Array + +void Bson_Array_deinit(UDF_INIT* initid) +{ + JsonMemFree((PGLOBAL)initid->ptr); +} // end of Bson_Array_deinit diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index 02d751c6690..a215844d6d6 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -1,10 +1,10 @@ -/*************** tabjson H Declares Source Code File (.H) **************/ -/* Name: jsonudf.h Version 1.1 */ -/* */ -/* (C) Copyright to the author Olivier BERTRAND 2015 */ -/* */ -/* This file contains the JSON UDF function and classe declares. */ -/***********************************************************************/ +/******************** tabjson H Declares Source Code File (.H) *******************/ +/* Name: jsonudf.h Version 1.1 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2015 */ +/* */ +/* This file contains the JSON UDF function and class declares. */ +/*********************************************************************************/ #include "global.h" #include "plgdbsem.h" #include "block.h" @@ -15,9 +15,9 @@ #define UDF_EXEC_ARGS \ UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* -/***********************************************************************/ -/* The JSON tree node. Can be an Object or an Array. */ -/***********************************************************************/ +/*********************************************************************************/ +/* The JSON tree node. Can be an Object or an Array. */ +/*********************************************************************************/ typedef struct _jnode { PSZ Key; // The key used for object OPVAL Op; // Operator used for this node @@ -28,8 +28,9 @@ typedef struct _jnode { int Nx; // Next to read row number } JNODE, *PJNODE; -typedef class JSNX *PJSNX; +typedef class JSNX *PJSNX; typedef class JOUTPATH *PJTP; +typedef class JOUTALL *PJTA; extern "C" { DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*); @@ -84,34 +85,51 @@ extern "C" { DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *); DllExport void Json_Object_Grp_deinit(UDF_INIT*); - DllExport my_bool Json_Get_String_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Get_String(UDF_EXEC_ARGS); - DllExport void Json_Get_String_deinit(UDF_INIT*); + DllExport my_bool JsonGetString_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *JsonGetString(UDF_EXEC_ARGS); + DllExport void JsonGetString_deinit(UDF_INIT*); - DllExport my_bool Json_Get_Int_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long Json_Get_Int(UDF_INIT*, UDF_ARGS*, char*, char*); - DllExport void Json_Get_Int_deinit(UDF_INIT*); + DllExport my_bool JsonGetInt_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport long long JsonGetInt(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport void JsonGetInt_deinit(UDF_INIT*); - DllExport my_bool Json_Get_Real_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport double Json_Get_Real(UDF_INIT*, UDF_ARGS*, char*, char*); - DllExport void Json_Get_Real_deinit(UDF_INIT*); + DllExport my_bool JsonGetReal_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport double JsonGetReal(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport void JsonGetReal_deinit(UDF_INIT*); - DllExport my_bool Json_Locate_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Locate(UDF_EXEC_ARGS); - DllExport void Json_Locate_deinit(UDF_INIT*); + DllExport my_bool JsonLocate_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *JsonLocate(UDF_EXEC_ARGS); + DllExport void JsonLocate_deinit(UDF_INIT*); + + DllExport my_bool Json_Locate_All_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Locate_All(UDF_EXEC_ARGS); + DllExport void Json_Locate_All_deinit(UDF_INIT*); DllExport my_bool Json_File_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *Json_File(UDF_EXEC_ARGS); DllExport void Json_File_deinit(UDF_INIT*); - DllExport my_bool Json_Make_File_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Make_File(UDF_EXEC_ARGS); - DllExport void Json_Make_File_deinit(UDF_INIT*); + DllExport my_bool JsonMakeFile_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *JsonMakeFile(UDF_EXEC_ARGS); + DllExport void JsonMakeFile_deinit(UDF_INIT*); + + DllExport my_bool Bson_Array_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Bson_Array(UDF_EXEC_ARGS); + DllExport void Bson_Array_deinit(UDF_INIT*); } // extern "C" -/***********************************************************************/ -/* Class JSNX: JSON access method. */ -/***********************************************************************/ +/*********************************************************************************/ +/* Structure JPN. Used to make the locate path. */ +/*********************************************************************************/ +typedef struct _jpn { + enum JTYP Type; + PSZ Key; + int N; +} JPN, *PJPN; + +/*********************************************************************************/ +/* Class JSNX: JSON access method. */ +/*********************************************************************************/ class JSNX : public BLOCK { public: // Constructors @@ -126,11 +144,10 @@ public: my_bool ParseJpath(PGLOBAL g); void ReadValue(PGLOBAL g); PJVAL GetJson(PGLOBAL g); - char *Locate(PGLOBAL g, PJSON jsp, char *what, - enum Item_result type, unsigned long len); + char *Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k = 1); + char *LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx = 10); protected: - my_bool CheckExpand(PGLOBAL g, int i, PSZ nm, my_bool b); my_bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); PVAL GetColumnValue(PGLOBAL g, PJSON row, int i); PJVAL GetValue(PGLOBAL g, PJSON row, int i); @@ -138,42 +155,37 @@ protected: PVAL CalculateArray(PGLOBAL g, PJAR arp, int n); PVAL MakeJson(PGLOBAL g, PJSON jsp); void SetJsonValue(PGLOBAL g, PVAL vp, PJVAL val, int n); -//PJSON GetRow(PGLOBAL g); my_bool LocateArray(PJAR jarp); my_bool LocateObject(PJOB jobp); my_bool LocateValue(PJVAL jvp); + my_bool LocateArrayAll(PJAR jarp); + my_bool LocateObjectAll(PJOB jobp); + my_bool LocateValueAll(PJVAL jvp); + my_bool CompareTree(PJSON jp1, PJSON jp2); + my_bool AddPath(void); // Default constructor not to be used JSNX(void) {} // Members - PJSON Row; - PVAL Value; - PVAL MulVal; // To value used by multiple column - PJTP Jp; - JNODE *Nodes; // The intermediate objects - char *Jpath; // The json path - int Buf_Type; - int Long; - int Prec; - int Nod; // The number of intermediate objects - int Xnod; // Index of multiple values - int B; // Index base - my_bool Xpd; // True for expandable column - my_bool Parsed; // True when parsed + PJSON Row; + PJVAL Jvalp; + PJPN Jpnp; + JOUTSTR *Jp; + JNODE *Nodes; // The intermediate objects + PVAL Value; + PVAL MulVal; // To value used by multiple column + char *Jpath; // The json path + int Buf_Type; + int Long; + int Prec; + int Nod; // The number of intermediate objects + int Xnod; // Index of multiple values + int K; // Kth item to locate + int I; // Index of JPN + int Imax; // Max number of JPN's + int B; // Index base + my_bool Xpd; // True for expandable column + my_bool Parsed; // True when parsed + my_bool Found; // Item found by locate }; // end of class JSNX - -/***********************************************************************/ -/* Class JOUTPATH. Used to make the locate path. */ -/***********************************************************************/ -class JOUTPATH : public JOUTSTR { -public: - JOUTPATH(PGLOBAL g, char *w, enum Item_result type, unsigned long len) - : JOUTSTR(g) {What = w; Type = type; Len = len; Found = false;} - - // Members - enum Item_result Type; - unsigned long Len; - char *What; - my_bool Found; -}; // end of class JOUTPATH diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result index be3b6df0479..bf31ba00c91 100644 --- a/storage/connect/mysql-test/connect/r/json_udf.result +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -20,14 +20,14 @@ Array [56,3.141600,"foo",null,"One more"] SELECT Json_Array_Add(Json_Value('one value'),'One more'); Json_Array_Add(Json_Value('one value'),'One more') -"one value" +NULL Warnings: Warning 1105 First argument is not an array SELECT Json_Array_Add('one value','One more'); ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add first argument must be a json item SELECT Json_Array_Add('one value' json_,'One more'); Json_Array_Add('one value' json_,'One more') -one value +NULL Warnings: Warning 1105 Unexpected character 'o' near one value Warning 1105 First argument is not an array @@ -147,7 +147,7 @@ Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY {"DEPARTMENT":"2452","TITLE":"SCIENTIST","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","SALARY":8000.000000},{"SERIALNO":"36666","NAME":"BIGHORN","SALARY":11000.000000}]} {"DEPARTMENT":"2452","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"11111","NAME":"CHERRY","SALARY":4500.000000}]} SELECT Json_Object_Grp(SALARY) FROM t1; -ERROR HY000: Can't initialize function 'Json_Object_Grp'; Json_Array_Grp can only accept 2 arguments +ERROR HY000: Can't initialize function 'Json_Object_Grp'; Json_Object_Grp can only accept 2 arguments SELECT Json_Object_Grp(SALARY, NAME) FROM t1; Json_Object_Grp(SALARY, NAME) {"BANCROFT":9600.000000,"SMITH":9000.000000,"MERCHANT":8700.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"BIGHEAD":8000.000000,"SHRINKY":7500.000000,"WALTER":7400.000000,"FODDERMAN":7000.000000,"TONGHO":6800.000000,"SHORTSIGHT":5500.000000,"MESSIFUL":5000.500000,"HONEY":4900.000000,"GOOSEPEN":4700.000000,"CHERRY":4500.000000,"MONAPENNY":3800.000000,"KITTY":3000.450000,"PLUMHEAD":2800.000000,"STRONG":23000.000000,"BULLOZER":14800.000000,"WERTHER":14500.000000,"QUINN":14000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"BROWNY":10500.000000,"WHEELFOR":10030.000000,"MARTIN":10000.000000} diff --git a/storage/connect/plugutil.c b/storage/connect/plugutil.c index c0e249adf12..38e28a171b2 100644 --- a/storage/connect/plugutil.c +++ b/storage/connect/plugutil.c @@ -143,7 +143,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) fprintf(stderr, MSG(GLOBAL_ERROR), (int)sizeof(GLOBAL)); return NULL; } else { - g->Sarea_Size = worksize; + g->Sarea = NULL; g->Createas = 0; g->Alchecked = 0; g->Mrr = 0; @@ -155,7 +155,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) /*******************************************************************/ /* Allocate the main work segment. */ /*******************************************************************/ - if (!(g->Sarea = PlugAllocMem(g, worksize))) { + if (worksize && !(g->Sarea = PlugAllocMem(g, worksize))) { char errmsg[256]; sprintf(errmsg, MSG(WORK_AREA), g->Message); strcpy(g->Message, errmsg); @@ -163,7 +163,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) } else g->Sarea_Size = worksize; - } /* endif g */ + } /* endif g */ g->jump_level = -1; /* New setting to allow recursive call of Plug */ return(g); diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 884ce976a52..60471c9b0d8 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -340,7 +340,7 @@ PVAL AllocateValue(PGLOBAL g, void *value, short type, short prec) switch (type) { case TYPE_STRING: - valp = new(g) TYPVAL((PSZ)value); + valp = new(g) TYPVAL((PSZ)value, prec); break; case TYPE_SHORT: valp = new(g) TYPVAL(*(short*)value, TYPE_SHORT); @@ -1209,12 +1209,12 @@ void TYPVAL::Print(PGLOBAL g, char *ps, uint z) /***********************************************************************/ /* STRING public constructor from a constant string. */ /***********************************************************************/ -TYPVAL::TYPVAL(PSZ s) : VALUE(TYPE_STRING) +TYPVAL::TYPVAL(PSZ s, short c) : VALUE(TYPE_STRING) { Strp = s; Len = strlen(s); Clen = Len; - Ci = false; + Ci = (c == 1); } // end of STRING constructor /***********************************************************************/ diff --git a/storage/connect/value.h b/storage/connect/value.h index 780917c9962..0cd0846ac7c 100644 --- a/storage/connect/value.h +++ b/storage/connect/value.h @@ -216,7 +216,7 @@ template <> class DllExport TYPVAL: public VALUE { public: // Constructors - TYPVAL(PSZ s); + TYPVAL(PSZ s, short c = 0); TYPVAL(PGLOBAL g, PSZ s, int n, int c); // Implementation From 8a154ecde0baba4bf9fa3bb2bf6821efad4984aa Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Mon, 7 Sep 2015 18:53:25 +0200 Subject: [PATCH 29/39] Add Json_Get_Item (and Bson_File?) functions modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h --- storage/connect/jsonudf.cpp | 432 ++++++++++++++++++++++++++++++------ storage/connect/jsonudf.h | 20 +- 2 files changed, 374 insertions(+), 78 deletions(-) diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 71124e644a4..677fd93cbfc 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -56,14 +56,26 @@ JSNX::JSNX(PGLOBAL g, PJSON row, int type, int len, int prec) /*********************************************************************************/ /* SetJpath: set and parse the json path. */ /*********************************************************************************/ -my_bool JSNX::SetJpath(PGLOBAL g, char *path) +my_bool JSNX::SetJpath(PGLOBAL g, char *path, my_bool jb) { // Check Value was allocated if (!Value) return true; Value->SetNullable(true); - Jpath = path; + + if (jb) { + // Path must return a Json item + size_t n = strlen(path); + + if (!n || path[n - 1] != '*') { + Jpath = (char*)PlugSubAlloc(g, NULL, n + 3); + strcat(strcpy(Jpath, path), (n) ? ":*" : "*"); + } else + Jpath = path; + + } else + Jpath = path; // Parse the json path return ParseJpath(g); @@ -780,7 +792,8 @@ typedef struct BSON *PBSON; /*********************************************************************************/ struct BSON { char Msg[140]; - void *Memp; + char *Filename; + int Pretty; ulong Reslen; my_bool Changed; PJSON Jsp; @@ -795,7 +808,8 @@ static PBSON BsonAlloc(PGLOBAL g, ulong len, PJSON jsp) strcpy(bsp->Msg, "Binary Json"); bsp->Msg[139] = 0; - bsp->Memp = g->Sarea; + bsp->Filename = NULL; + bsp->Pretty = 2; bsp->Reslen = len; bsp->Changed = false; bsp->Jsp = jsp; @@ -825,13 +839,10 @@ inline void JsonMemSave(PGLOBAL g) /*********************************************************************************/ /* Program for freeing the memory pools. */ /*********************************************************************************/ -inline void JsonMemFree(PGLOBAL g) +inline void JsonFreeMem(PGLOBAL g) { - if (g->Alchecked) - g->Sarea = NULL; - PlugExit(g); -} /* end of JsonMemFree */ +} /* end of JsonFreeMem */ /*********************************************************************************/ /* Allocate and initialise the memory area. */ @@ -846,13 +857,9 @@ static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args, strcpy(message, "Allocation error"); return true; } else if (g->Sarea_Size == 0) { - if (memlen) { - strcpy(message, g->Message); - PlugExit(g); - return true; - } else - assert(IsJson(args, 0) == 3); - + strcpy(message, g->Message); + PlugExit(g); + return true; } // endif g g->Mrr = (args->arg_count && args->args[0]) ? 1 : 0; @@ -909,14 +916,23 @@ static char *MakeResult(PGLOBAL g, UDF_ARGS *args, PJSON top, int n = 2) PUSH_WARNING(msg); str = NULL; - } else { - if (!(str = Serialize(g, top, NULL, 0))) + } else if (IsJson(args, 0) == 3) { + PBSON bsp = (PBSON)args->args[0]; + + if (bsp->Filename) { + // Make the change in the json file + char *msg; + + if ((msg = Serialize(g, top, bsp->Filename, bsp->Pretty))) + PUSH_WARNING(msg); + + str = bsp->Filename; + } else if (!(str = Serialize(g, top, NULL, 0))) PUSH_WARNING(g->Message); - if (IsJson(args, 0) == 3) - ((PBSON)args->args[0])->Changed = 1; - - } // endif IsJson + bsp->Changed = 1; + } else if (!(str = Serialize(g, top, NULL, 0))) + PUSH_WARNING(g->Message); return str; } // end of MakeResult @@ -1025,11 +1041,8 @@ static my_bool CalcLen(UDF_ARGS *args, my_bool obj, } // endfor i - if (IsJson(args, 0) == 3) { - memlen = 0L; // We'll use arg memory - return false; - } else // Calculate the amount of memory needed - memlen = MEMFIX + sizeof(JOUTSTR) + reslen; + // Calculate the amount of memory needed + memlen = MEMFIX + sizeof(JOUTSTR) + reslen; for (i = 0; i < args->arg_count; i++) { n = IsJson(args, i); @@ -1090,18 +1103,6 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, { unsigned long rl, ml; - if (IsJson(args, 0) == 3) { - if (!g->Sarea) { - PPOOLHEADER p = (PPOOLHEADER)((PBSON)args->args[0])->Memp; - - g->Sarea = p; - g->Sarea_Size = p->To_Free + p->FreeBlk; - g->Alchecked = 1; - } // endif Sarea - - return false; - } // endif IsJson - n = MY_MIN(n, args->arg_count); for (uint i = 0; i < n; i++) @@ -1338,7 +1339,7 @@ char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Value_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Value_deinit /*********************************************************************************/ @@ -1384,7 +1385,7 @@ char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Array_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Array_deinit /*********************************************************************************/ @@ -1451,7 +1452,7 @@ char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Array_Add_Values_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Array_Add_Values_deinit /*********************************************************************************/ @@ -1533,7 +1534,7 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Array_Add_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Array_Add_deinit /*********************************************************************************/ @@ -1606,7 +1607,7 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Array_Delete_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Array_Delete_deinit /*********************************************************************************/ @@ -1650,7 +1651,7 @@ char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Object_deinit /*********************************************************************************/ @@ -1697,7 +1698,7 @@ char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_Nonull_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Object_nonull_deinit /*********************************************************************************/ @@ -1766,7 +1767,7 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_Add_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Object_Add_deinit /*********************************************************************************/ @@ -1838,7 +1839,7 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_Delete_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Object_Delete_deinit /*********************************************************************************/ @@ -1904,7 +1905,7 @@ char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Object_List_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Object_List_deinit /*********************************************************************************/ @@ -1977,7 +1978,7 @@ void Json_Array_Grp_clear(UDF_INIT *initid, char*, char*) void Json_Array_Grp_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Array_Grp_deinit /*********************************************************************************/ @@ -2048,25 +2049,25 @@ void Json_Object_Grp_clear(UDF_INIT *initid, char*, char*) void Json_Object_Grp_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Object_Grp_deinit /*********************************************************************************/ -/* Get a string value from a Json item. */ +/* Get a Json item from a Json document. */ /*********************************************************************************/ -my_bool JsonGetString_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool Json_Get_Item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; int n = IsJson(args, 0); if (args->arg_count < 2) { - strcpy(message, "JsonGetString must have at least 2 arguments"); + strcpy(message, "Json_Get_Item must have at least 2 arguments"); return true; } else if (!n && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "JsonGetString first argument must be a json item"); + strcpy(message, "Json_Get_Item first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { - strcpy(message, "Second argument is not a (jpath) string"); + strcpy(message, "Second argument is not a string (jpath)"); return true; } else CalcLen(args, false, reslen, memlen); @@ -2083,9 +2084,9 @@ my_bool JsonGetString_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += args->lengths[0] * 3; return JsonInit(initid, args, message, true, reslen, memlen); -} // end of JsonGetString_init +} // end of Json_Get_Item_init -char *JsonGetString(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *Json_Get_Item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *str = NULL; @@ -2127,7 +2128,7 @@ char *JsonGetString(UDF_INIT *initid, UDF_ARGS *args, char *result, path = MakePSZ(g, args, 1); jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length); - if (jsx->SetJpath(g, path)) { + if (jsx->SetJpath(g, path, true)) { PUSH_WARNING(g->Message); *is_null = 1; return NULL; @@ -2151,12 +2152,120 @@ char *JsonGetString(UDF_INIT *initid, UDF_ARGS *args, char *result, } else *res_length = strlen(str); + return str; +} // end of Json_Get_Item + +void Json_Get_Item_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Json_Get_Item_deinit + +/*********************************************************************************/ +/* Get a string value from a Json item. */ +/*********************************************************************************/ +my_bool JsonGetString_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + int n = IsJson(args, 0); + + if (args->arg_count < 2) { + strcpy(message, "JsonGetString must have at least 2 arguments"); + return true; + } else if (!n && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "JsonGetString first argument must be a json item"); + return true; + } else if (args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Second argument is not a string (jpath)"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + if (n == 2) { + char fn[_MAX_PATH]; + long fl; + + memcpy(fn, args->args[0], args->lengths[0]); + fn[args->lengths[0]] = 0; + fl = GetFileLength(fn); + memlen += fl * 3; + } else if (n != 3) + memlen += args->lengths[0] * 3; + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of JsonGetString_init + +char *JsonGetString(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *) +{ + char *str = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (g->N) { + str = (char*)g->Xchk; + goto fin; + } else if (initid->const_item) + g->N = 1; + + if (!CheckMemory(g, initid, args, 1, false)) { + char *p, *path; + PJSON jsp; + PJSNX jsx; + PJVAL jvp; + + if (!g->Xchk) { + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr + + } else + jsp = (PJSON)g->Xchk; + + path = MakePSZ(g, args, 1); + jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length); + + if (jsx->SetJpath(g, path)) { + PUSH_WARNING(g->Message); + *is_null = 1; + return NULL; + } // endif SetJpath + + jsx->ReadValue(g); + + if (!jsx->GetValue()->IsNull()) + str = jsx->GetValue()->GetCharValue(); + + if (initid->const_item) + // Keep result of constant function + g->Xchk = str; + + } // endif CheckMemory + +fin: + if (!str) { + *is_null = 1; + *res_length = 0; + } else + *res_length = strlen(str); + return str; } // end of JsonGetString void JsonGetString_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of JsonGetString_deinit /*********************************************************************************/ @@ -2264,7 +2373,7 @@ long long JsonGetInt(UDF_INIT *initid, UDF_ARGS *args, void JsonGetInt_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of JsonGetInt_deinit /*********************************************************************************/ @@ -2380,7 +2489,7 @@ double JsonGetReal(UDF_INIT *initid, UDF_ARGS *args, void JsonGetReal_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of JsonGetReal_deinit /*********************************************************************************/ @@ -2507,7 +2616,7 @@ char *JsonLocate(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Locate_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of JsonLocate_deinit /*********************************************************************************/ @@ -2636,7 +2745,7 @@ char *Json_Locate_All(UDF_INIT *initid, UDF_ARGS *args, char *result, void Json_Locate_All_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Locate_All_deinit /*********************************************************************************/ @@ -2779,13 +2888,13 @@ fin: void Json_File_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_File_deinit /*********************************************************************************/ /* Make a json file from a json item. */ /*********************************************************************************/ -my_bool JsonMakeFile_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool Jfile_Make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, more = 1024; @@ -2805,9 +2914,9 @@ my_bool JsonMakeFile_init(UDF_INIT *initid, UDF_ARGS *args, char *message) CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of JsonMakeFile_init +} // end of Jfile_Make_init -char *JsonMakeFile(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *Jfile_Make(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *str, *fn, *msg; @@ -2854,12 +2963,12 @@ char *JsonMakeFile(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of JsonMakeFile +} // end of Jfile_Make -void JsonMakeFile_deinit(UDF_INIT* initid) +void Jfile_Make_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); -} // end of JsonMakeFile_deinit + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jfile_Make_deinit /*********************************************************************************/ /* Make and return a binary Json array containing all the parameters. */ @@ -2869,7 +2978,6 @@ my_bool Bson_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; CalcLen(args, false, reslen, memlen); - memlen *= 2; // TODO: Make this adjustable return JsonInit(initid, args, message, false, reslen, memlen); } // end of Bson_Array_init @@ -2904,5 +3012,181 @@ char *Bson_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, void Bson_Array_deinit(UDF_INIT* initid) { - JsonMemFree((PGLOBAL)initid->ptr); + JsonFreeMem((PGLOBAL)initid->ptr); } // end of Bson_Array_deinit + +/*********************************************************************************/ +/* Make a Json Oject containing all the parameters. */ +/*********************************************************************************/ +my_bool Bson_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + CalcLen(args, true, reslen, memlen); + return JsonInit(initid, args, message, false, reslen, memlen); +} // end of Bson_Object_init + +char *Bson_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (!bsp || bsp->Changed) { + if (!CheckMemory(g, initid, args, args->arg_count, true)) { + PJOB objp = new(g)JOBJECT; + + for (uint i = 0; i < args->arg_count; i++) + objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); + + bsp = BsonAlloc(g, initid->max_length, objp); + strcat(bsp->Msg, " object"); + } else { + bsp = BsonAlloc(g, initid->max_length, NULL); + strncpy(bsp->Msg, g->Message, 139); + } // endif CheckMemory + + // Keep result of constant function + g->Xchk = (initid->const_item) ? bsp : NULL; + } // endif bsp + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Bson_Object + +void Bson_Object_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Bson_Object_deinit + +/*********************************************************************************/ +/* Returns a json file as a json item. */ +/*********************************************************************************/ +my_bool Bson_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen, fl, more = 1024; + + if (args->arg_count < 1 || args->arg_count > 3) { + strcpy(message, "Bson_File only accepts 1 to 3 arguments"); + return true; + } else if (args->arg_type[0] != STRING_RESULT || !args->args[0]) { + strcpy(message, "Bson_File first argument must be a constant string (file name)"); + return true; + } else if (args->arg_count > 1 && args->arg_type[1] != INT_RESULT) { + strcpy(message, "Second argument is not an integer (pretty)"); + return true; + } else if (args->arg_count > 2) { + if (args->arg_type[2] != INT_RESULT) { + strcpy(message, "Third argument is not an integer (memory)"); + return true; + } else + more += (ulong)*(longlong*)args->args[2]; + + } // endifs + + initid->maybe_null = 1; + CalcLen(args, false, reslen, memlen); + fl = GetFileLength(args->args[0]); + more += fl * M; + memlen += more; + return JsonInit(initid, args, message, false, reslen, memlen); +} // end of Bson_File_init + +char *Bson_File(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + char *fn, *memory; + int len, pretty; + HANDLE hFile; + MEMMAP mm; + PJSON jsp; + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (bsp && !bsp->Changed) + goto fin; + + PlugSubSet(g, g->Sarea, g->Sarea_Size); + g->Xchk = NULL; + fn = MakePSZ(g, args, 0); + pretty = (args->arg_count > 1) ? (int)*(longlong*)args->args[1] : 3; + + /*******************************************************************************/ + /* Create the mapping file object. */ + /*******************************************************************************/ + hFile = CreateFileMap(g, fn, &mm, MODE_READ, false); + + if (hFile == INVALID_HANDLE_VALUE) { + DWORD rc = GetLastError(); + + if (!(*g->Message)) + sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int)rc, fn); + + PUSH_WARNING(g->Message); + if (g->Mrr) *error = 1; + *is_null = 1; + return NULL; + } // endif hFile + + /*******************************************************************************/ + /* Get the file size (assuming file is smaller than 4 GB) */ + /*******************************************************************************/ + len = mm.lenL; + memory = (char *)mm.memory; + + if (!len) { // Empty or deleted file + CloseFileHandle(hFile); + *is_null = 1; + return NULL; + } // endif len + + if (!memory) { + CloseFileHandle(hFile); + sprintf(g->Message, MSG(MAP_VIEW_ERROR), fn, GetLastError()); + PUSH_WARNING(g->Message); + *is_null = 1; + if (g->Mrr) *error = 1; + return NULL; + } // endif Memory + + CloseFileHandle(hFile); // Not used anymore + hFile = INVALID_HANDLE_VALUE; // For Fblock + + /*********************************************************************************/ + /* Parse the json file and allocate its tree structure. */ + /*********************************************************************************/ + g->Message[0] = 0; + + if (!(jsp = ParseJson(g, memory, len, pretty))) { + PUSH_WARNING(g->Message); + if (g->Mrr) *error = 1; + } // endif jsp + + CloseMemMap(memory, len); + + if (jsp) { + bsp = BsonAlloc(g, len, jsp); + strcat(bsp->Msg, " file"); + bsp->Filename = fn; + bsp->Pretty = pretty; + } else + bsp = NULL; + + if (initid->const_item) + // Keep result of constant function + g->Xchk = bsp; + +fin: + if (!bsp) { + *res_length = 0; + *is_null = 1; + } else + *res_length = sizeof(BSON); + + return (char*)bsp; +} // end of Bson_File + +void Bson_File_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Bson_File_deinit diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index a215844d6d6..be9bde95da3 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -85,6 +85,10 @@ extern "C" { DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *); DllExport void Json_Object_Grp_deinit(UDF_INIT*); + DllExport my_bool Json_Get_Item_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Get_Item(UDF_EXEC_ARGS); + DllExport void Json_Get_Item_deinit(UDF_INIT*); + DllExport my_bool JsonGetString_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *JsonGetString(UDF_EXEC_ARGS); DllExport void JsonGetString_deinit(UDF_INIT*); @@ -109,13 +113,21 @@ extern "C" { DllExport char *Json_File(UDF_EXEC_ARGS); DllExport void Json_File_deinit(UDF_INIT*); - DllExport my_bool JsonMakeFile_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *JsonMakeFile(UDF_EXEC_ARGS); - DllExport void JsonMakeFile_deinit(UDF_INIT*); + DllExport my_bool Jfile_Make_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jfile_Make(UDF_EXEC_ARGS); + DllExport void Jfile_Make_deinit(UDF_INIT*); DllExport my_bool Bson_Array_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *Bson_Array(UDF_EXEC_ARGS); DllExport void Bson_Array_deinit(UDF_INIT*); + + DllExport my_bool Bson_Object_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Bson_Object(UDF_EXEC_ARGS); + DllExport void Bson_Object_deinit(UDF_INIT*); + + DllExport my_bool Bson_File_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Bson_File(UDF_EXEC_ARGS); + DllExport void Bson_File_deinit(UDF_INIT*); } // extern "C" /*********************************************************************************/ @@ -140,7 +152,7 @@ public: PVAL GetValue(void) {return Value;} // Methods - my_bool SetJpath(PGLOBAL g, char *path); + my_bool SetJpath(PGLOBAL g, char *path, my_bool jb = false); my_bool ParseJpath(PGLOBAL g); void ReadValue(PGLOBAL g); PJVAL GetJson(PGLOBAL g); From f4fe138321092c8dcd02caf22bdbad9698ee6829 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 15 Sep 2015 20:42:51 +0200 Subject: [PATCH 30/39] Fix assert error for where clause with UDF's was fixed in HA_CONNECT::CondFilter moving res= pval->val_str(&tmp) but this was wrong. Now res is only used for strings. Change version number modified: storage/connect/ha_connect.cc Add some new UDF's modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h Fix change in tests json_udf modified: storage/connect/mysql-test/connect/r/json_udf.result modified: storage/connect/mysql-test/connect/t/json_udf.inc modified: storage/connect/mysql-test/connect/t/json_udf.test --- storage/connect/ha_connect.cc | 18 +- storage/connect/json.cpp | 39 +- storage/connect/json.h | 9 +- storage/connect/jsonudf.cpp | 953 ++++++++++++++++-- storage/connect/jsonudf.h | 72 +- .../mysql-test/connect/r/json_udf.result | 32 +- .../connect/mysql-test/connect/t/json_udf.inc | 29 +- .../mysql-test/connect/t/json_udf.test | 15 +- 8 files changed, 1033 insertions(+), 134 deletions(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 9d67904dfb2..ed34c1541e2 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -169,9 +169,9 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.04.0001 June 29, 2015"; + char version[]= "Version 1.04.0003 September 15, 2015"; #if defined(__WIN__) - char compver[]= "Version 1.04.0001 " __DATE__ " " __TIME__; + char compver[]= "Version 1.04.0003 " __DATE__ " " __TIME__; char slash= '\\'; #else // !__WIN__ char slash= '/'; @@ -2544,12 +2544,10 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) if (!i && (ismul)) return NULL; - if ((res= pval->val_str(&tmp)) == NULL) - return NULL; // To be clarified - - switch (args[i]->real_type()) { + switch (args[i]->real_type()) { case COND::STRING_ITEM: - pp->Value= PlugSubAllocStr(g, NULL, res->ptr(), res->length()); + res= pval->val_str(&tmp); + pp->Value= PlugSubAllocStr(g, NULL, res->ptr(), res->length()); pp->Type= (pp->Value) ? TYPE_STRING : TYPE_ERROR; break; case COND::INT_ITEM: @@ -2578,8 +2576,8 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) return NULL; } // endswitch type - if (trace) - htrc("Value=%.*s\n", res->length(), res->ptr()); + if (trace) + htrc("Value type=%hd\n", pp->Type); // Append the value to the argument list if (pprec) @@ -6722,7 +6720,7 @@ maria_declare_plugin(connect) 0x0104, /* version number (1.04) */ NULL, /* status variables */ connect_system_variables, /* system variables */ - "1.04.0001", /* string version */ + "1.04.0003", /* string version */ MariaDB_PLUGIN_MATURITY_BETA /* maturity */ } maria_declare_plugin_end; diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 97c27192ecc..5158b71086f 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -942,12 +942,30 @@ PSZ JOBJECT::GetText(PGLOBAL g, PSZ text) return text + n; } // end of GetValue; +/***********************************************************************/ +/* Merge two objects. */ +/***********************************************************************/ +bool JOBJECT::Merge(PGLOBAL g, PJSON jsp) +{ + if (jsp->GetType() != TYPE_JOB) { + strcpy(g->Message, "Second argument is not an object"); + return true; + } // endif Type + + PJOB jobp = (PJOB)jsp; + + for (PJPR jpp = jobp->First; jpp; jpp = jpp->Next) + SetValue(g, jpp->GetVal(), jpp->GetKey()); + + return false; +} // end of Marge; + /***********************************************************************/ /* Set or add a value corresponding to the given key. */ /***********************************************************************/ void JOBJECT::SetValue(PGLOBAL g, PJVAL jvp, PSZ key) { - PJPR jp; + PJPR jp; for (jp = First; jp; jp = jp->Next) if (!strcmp(jp->Key, key)) { @@ -1063,6 +1081,25 @@ PJVAL JARRAY::AddValue(PGLOBAL g, PJVAL jvp, int *x) return jvp; } // end of AddValue +/***********************************************************************/ +/* Merge two arrays. */ +/***********************************************************************/ +bool JARRAY::Merge(PGLOBAL g, PJSON jsp) +{ + if (jsp->GetType() != TYPE_JAR) { + strcpy(g->Message, "Second argument is not an array"); + return true; + } // endif Type + + PJAR arp = (PJAR)jsp; + + for (int i = 0; i < jsp->size(); i++) + AddValue(g, arp->GetValue(i)); + + InitArray(g); + return false; +} // end of Merge + /***********************************************************************/ /* Set the nth Value of the Array Value list. */ /***********************************************************************/ diff --git a/storage/connect/json.h b/storage/connect/json.h index 0294a46045b..bc0ef4e861b 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -162,7 +162,8 @@ class JSON : public BLOCK { virtual double GetFloat() {X return 0.0;} virtual PSZ GetString() {X return NULL;} virtual PSZ GetText(PGLOBAL g, PSZ text) {X return NULL;} - virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) {X return true;} + virtual bool Merge(PGLOBAL g, PJSON jsp) { X return true; } + virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i) { X return true; } virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key) {X} virtual void SetValue(PVAL valp) {X} virtual void SetValue(PJSON jsp) {X} @@ -197,7 +198,8 @@ class JOBJECT : public JSON { virtual PJVAL GetValue(const char* key); virtual PJAR GetKeyList(PGLOBAL g); virtual PSZ GetText(PGLOBAL g, PSZ text); - virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); + virtual bool Merge(PGLOBAL g, PJSON jsp); + virtual void SetValue(PGLOBAL g, PJVAL jvp, PSZ key); virtual void DeleteKey(char *k); virtual bool IsNull(void); @@ -222,7 +224,8 @@ class JARRAY : public JSON { virtual PJVAL AddValue(PGLOBAL g, PJVAL jvp = NULL, int *x = NULL); virtual void InitArray(PGLOBAL g); virtual PJVAL GetValue(int i); - virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); + virtual bool Merge(PGLOBAL g, PJSON jsp); + virtual bool SetValue(PGLOBAL g, PJVAL jvp, int i); virtual bool DeleteValue(int n); virtual bool IsNull(void); diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 677fd93cbfc..1304366b83a 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -1,5 +1,5 @@ /****************** jsonudf C++ Program Source Code File (.CPP) ******************/ -/* PROGRAM NAME: jsonudf Version 1.1 */ +/* PROGRAM NAME: jsonudf Version 1.3 */ /* (C) Copyright to the author Olivier BERTRAND 2015 */ /* This program are the JSON User Defined Functions . */ /*********************************************************************************/ @@ -333,7 +333,7 @@ PVAL JSNX::GetColumnValue(PGLOBAL g, PJSON row, int i) /*********************************************************************************/ /* GetValue: */ /*********************************************************************************/ -PJVAL JSNX::GetValue(PGLOBAL g, PJSON row, int i) +PJVAL JSNX::GetValue(PGLOBAL g, PJSON row, int i, my_bool b) { //int n = Nod - 1; my_bool expd = false; @@ -346,7 +346,11 @@ PJVAL JSNX::GetValue(PGLOBAL g, PJSON row, int i) val = new(g) JVALUE(g, Value); return val; } else if (Nodes[i].Op == OP_XX) { - return new(g) JVALUE(g, MakeJson(g, row)); + if (b) + return new(g)JVALUE(g, MakeJson(g, row)); + else + return new(g)JVALUE(row); + } else switch (row->GetType()) { case TYPE_JOB: if (!Nodes[i].Key) { @@ -785,36 +789,50 @@ my_bool JSNX::AddPath(void) /* --------------------------------- JSON UDF ---------------------------------- */ +#define BMX (_MAX_PATH - 1) typedef struct BSON *PBSON; /*********************************************************************************/ /* Structure used to return binary json. */ /*********************************************************************************/ struct BSON { - char Msg[140]; + char Msg[_MAX_PATH]; char *Filename; int Pretty; ulong Reslen; my_bool Changed; PJSON Jsp; + PBSON Bsp; }; // end of struct BSON /*********************************************************************************/ /* Allocate and initialize a BSON structure. */ /*********************************************************************************/ -static PBSON BsonAlloc(PGLOBAL g, ulong len, PJSON jsp) +static PBSON JbinAlloc(PGLOBAL g, UDF_ARGS *args, ulong len, PJSON jsp) { PBSON bsp = (PBSON)PlugSubAlloc(g, NULL, sizeof(BSON)); strcpy(bsp->Msg, "Binary Json"); - bsp->Msg[139] = 0; + bsp->Msg[BMX] = 0; bsp->Filename = NULL; bsp->Pretty = 2; bsp->Reslen = len; bsp->Changed = false; bsp->Jsp = jsp; + bsp->Bsp = (IsJson(args, 0) == 3) ? (PBSON)args->args[0] : NULL; return bsp; -} /* end of BsonAlloc */ +} /* end of JbinAlloc */ + +/*********************************************************************************/ +/* Set the BSON chain as changed. */ +/*********************************************************************************/ +static void SetChanged(PBSON bsp) +{ + if (bsp->Bsp) + SetChanged(bsp->Bsp); + + bsp->Changed = true; +} /* end of SetChanged */ /*********************************************************************************/ /* Program for SubSet re-initialization of the memory pool. */ @@ -930,13 +948,47 @@ static char *MakeResult(PGLOBAL g, UDF_ARGS *args, PJSON top, int n = 2) } else if (!(str = Serialize(g, top, NULL, 0))) PUSH_WARNING(g->Message); - bsp->Changed = 1; + SetChanged(bsp); } else if (!(str = Serialize(g, top, NULL, 0))) PUSH_WARNING(g->Message); return str; } // end of MakeResult +/*********************************************************************************/ +/* Make the binary result according to the first argument type. */ +/*********************************************************************************/ +static PBSON MakeBinResult(PGLOBAL g, UDF_ARGS *args, PJSON top, ulong len, int n = 2) +{ + PBSON bsnp = JbinAlloc(g, args, len, top); + + if (IsJson(args, 0) == 2) { + int pretty = 2; + + for (uint i = n; i < args->arg_count; i++) + if (args->arg_type[i] == INT_RESULT) { + pretty = (int)*(longlong*)args->args[i]; + break; + } // endif type + + bsnp->Pretty = pretty; + bsnp->Filename = (char*)args->args[0]; + strncpy(bsnp->Msg, (char*)args->args[0], BMX); + } else if (IsJson(args, 0) == 3) { + PBSON bsp = (PBSON)args->args[0]; + + if (bsp->Filename) { + bsnp->Filename = bsp->Filename; + strncpy(bsnp->Msg, bsp->Filename, BMX); + } else + strcpy(bsnp->Msg, "Json Binary item"); + + } else + strcpy(bsnp->Msg, "Json Binary item"); + + return bsnp; +} // end of MakeBinResult + /*********************************************************************************/ /* Returns not 0 if the argument is a JSON item or file name. */ /*********************************************************************************/ @@ -944,14 +996,21 @@ static int IsJson(UDF_ARGS *args, uint i) { int n = 0; - if (i >= args->arg_count || args->arg_type[i] != STRING_RESULT) - n = 0; - else if (!strnicmp(args->attributes[i], "Json_", 5)) - n = 1; // arg is a json item - else if (!strnicmp(args->attributes[i], "Jfile_", 6)) - n = 2; // arg is a json file name - else if (!strnicmp(args->attributes[i], "Bson_", 5)) - n = 3; // arg is a binary json item + if (i >= args->arg_count || args->arg_type[i] != STRING_RESULT) { + } else if (!strnicmp(args->attributes[i], "Json_", 5)) { + if (!args->args[i] || *args->args[i] == '[' || *args->args[i] == '{') + n = 1; // arg is a json item + else + n = 2; // A file name may have been returned + + } else if (!strnicmp(args->attributes[i], "Jbin_", 5)) { + if (args->lengths[i] == sizeof(BSON)) + n = 3; // arg is a binary json item + else + n = 2; // A file name may have been returned + + } else if (!strnicmp(args->attributes[i], "Jfile_", 6)) + n = 2; // arg is a json file name return n; } // end of IsJson @@ -1157,7 +1216,7 @@ static PSZ MakePSZ(PGLOBAL g, UDF_ARGS *args, int i) static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) { if (args->arg_count > (unsigned)i) { - int n = args->attribute_lengths[i]; + int j = 0, n = args->attribute_lengths[i]; my_bool b; // true if attribute is zero terminated PSZ p, s = args->attributes[i]; @@ -1165,9 +1224,12 @@ static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) if ((b = (!n || !s[n]))) n = strlen(s); - if (n > 5 && IsJson(args, i)) { - s += 5; - n -= 5; + if (IsJson(args, i)) + j = strchr(s, '_') - s + 1; + + if (j && n > j) { + s += j; + n -= j; } else if (*s == '\'' && s[n-1] == '\'') { s++; n -= 2; @@ -1299,20 +1361,20 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) /*********************************************************************************/ /* Make a Json value containing the parameter. */ /*********************************************************************************/ -my_bool Json_Value_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool JsonValue_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count > 1) { - strcpy(message, "Json_Value cannot accept more than 1 argument"); + strcpy(message, "JsonValue cannot accept more than 1 argument"); return true; } else CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Json_Value_init +} // end of JsonValue_init -char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *JsonValue(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { char *str; @@ -1335,12 +1397,12 @@ char *Json_Value(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Value +} // end of JsonValue -void Json_Value_deinit(UDF_INIT* initid) +void JsonValue_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Value_deinit +} // end of JsonValue_deinit /*********************************************************************************/ /* Make a Json array containing all the parameters. */ @@ -1398,7 +1460,7 @@ my_bool Json_Array_Add_Values_init(UDF_INIT *initid, UDF_ARGS *args, char *messa if (args->arg_count < 2) { strcpy(message, "Json_Array_Add must have at least 2 arguments"); return true; - } else if (IsJson(args, 0) != 1) { + } else if (!IsJson(args, 0)) { strcpy(message, "Json_Array_Add first argument must be a json string"); return true; } else @@ -1919,7 +1981,7 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Json_Array_Grp can only accept 1 argument"); return true; } else if (IsJson(args, 0) == 3) { - strcpy(message, "Json_Array_Grp does not support Bson argument"); + strcpy(message, "Json_Array_Grp does not support Jbin argument"); return true; } else CalcLen(args, false, reslen, memlen); @@ -1992,7 +2054,7 @@ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Json_Object_Grp can only accept 2 arguments"); return true; } else if (IsJson(args, 0) == 3) { - strcpy(message, "Json_Object_Grp does not support Bson arguments"); + strcpy(message, "Json_Object_Grp does not support Jbin arguments"); return true; } else CalcLen(args, true, reslen, memlen); @@ -2052,6 +2114,85 @@ void Json_Object_Grp_deinit(UDF_INIT* initid) JsonFreeMem((PGLOBAL)initid->ptr); } // end of Json_Object_Grp_deinit +/*********************************************************************************/ +/* Merge two arrays or objects. */ +/*********************************************************************************/ +my_bool Json_Item_Merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Json_Item_Merge must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Json_Item_Merge first argument must be a json item"); + return true; + } else if (!IsJson(args, 1)) { + strcpy(message, "Json_Item_Merge second argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen, true); + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Json_Item_Merge_init + +char *Json_Item_Merge(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *error) +{ + char *str = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (g->Xchk) { + // This constant function was recalled + str = (char*)g->Xchk; + *res_length = strlen(str); + return str; + } // endif Xchk + + if (!CheckMemory(g, initid, args, 2, false, true)) { + PJSON top; + PJVAL jvp; + PJSON jsp[2] = {NULL, NULL}; + + for (int i = 0; i < 2; i++) { + jvp = MakeValue(g, args, i); + if (!i) top = jvp->GetJson(); + + if (jvp->GetValType() != TYPE_JAR && jvp->GetValType() != TYPE_JOB) { + sprintf(g->Message, "Argument %d is not an array or object", i); + PUSH_WARNING(g->Message); + } else + jsp[i] = jvp->GetJsp(); + + } // endfor i + + if (jsp[0]) { + if (jsp[0]->Merge(g, jsp[1])) + PUSH_WARNING(g->Message); + else + str = MakeResult(g, args, top); + + } // endif jsp + + } // endif CheckMemory + + // In case of error or file, return unchanged argument + if (!str) + str = MakePSZ(g, args, 0); + + if (initid->const_item) + // Keep result of constant function + g->Xchk = str; + + *res_length = strlen(str); + return str; +} // end of Json_Item_Merge + +void Json_Item_Merge_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Json_Item_Merge_deinit + /*********************************************************************************/ /* Get a Json item from a Json document. */ /*********************************************************************************/ @@ -2627,10 +2768,10 @@ my_bool Json_Locate_All_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen, more = 1000; if (args->arg_count < 2) { - strcpy(message, "Json_Locate must have at least 2 arguments"); + strcpy(message, "Json_Locate_All must have at least 2 arguments"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "Json_Locate first argument must be a json item"); + strcpy(message, "Json_Locate_All first argument must be a json item"); return true; } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { strcpy(message, "Third argument is not an integer (Depth)"); @@ -2647,7 +2788,7 @@ my_bool Json_Locate_All_init(UDF_INIT *initid, UDF_ARGS *args, char *message) if (IsJson(args, 0) != 3) memlen += 1000; // TODO: calculate this - return JsonInit(initid, args, message, false, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of Json_Locate_All_init char *Json_Locate_All(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -2901,7 +3042,7 @@ my_bool Jfile_Make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) if (args->arg_count < 2 || args->arg_count > 3) { strcpy(message, "JsonMakeFile only accepts 2 or 3 arguments"); return true; - } else if (!IsJson(args, 0) || IsJson(args, 0) > 2) { + } else if (!IsJson(args, 0)) { strcpy(message, "JsonMakeFile first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { @@ -2973,15 +3114,15 @@ void Jfile_Make_deinit(UDF_INIT* initid) /*********************************************************************************/ /* Make and return a binary Json array containing all the parameters. */ /*********************************************************************************/ -my_bool Bson_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool Jbin_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Bson_Array_init +} // end of Jbin_Array_init -char *Bson_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *Jbin_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2995,10 +3136,10 @@ char *Bson_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, arp->AddValue(g, MakeValue(g, args, i)); arp->InitArray(g); - bsp = BsonAlloc(g, initid->max_length, arp); + bsp = JbinAlloc(g, args, initid->max_length, arp); strcat(bsp->Msg, " array"); } else { - bsp = BsonAlloc(g, initid->max_length, NULL); + bsp = JbinAlloc(g, args, initid->max_length, NULL); strncpy(bsp->Msg, g->Message, 139); } // endif CheckMemory @@ -3008,25 +3149,237 @@ char *Bson_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Bson_Array +} // end of Jbin_Array -void Bson_Array_deinit(UDF_INIT* initid) +void Jbin_Array_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Bson_Array_deinit +} // end of Jbin_Array_deinit + +/*********************************************************************************/ +/* Add one or several values to a Json array. */ +/*********************************************************************************/ +my_bool Jbin_Array_Add_Values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Jbin_Array_Add must have at least 2 arguments"); + return true; + } else if (IsJson(args, 0) != 1) { + strcpy(message, "Jbin_Array_Add first argument must be a json string"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Jbin_Array_Add_Values_init + +char *Jbin_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (!bsp || bsp->Changed) { + if (!CheckMemory(g, initid, args, args->arg_count, false)) { + PJAR arp; + PJVAL jvp = MakeValue(g, args, 0); + + if (jvp->GetValType() != TYPE_JAR) { + arp = new(g)JARRAY; + arp->AddValue(g, jvp); + } else + arp = jvp->GetArray(); + + for (uint i = 1; i < args->arg_count; i++) + arp->AddValue(g, MakeValue(g, args, i)); + + arp->InitArray(g); + bsp = JbinAlloc(g, args, initid->max_length, arp); + strcat(bsp->Msg, " array"); + } else { + bsp = JbinAlloc(g, args, initid->max_length, NULL); + strncpy(bsp->Msg, g->Message, BMX); + } // endif CheckMemory + + // Keep result of constant function + g->Xchk = (initid->const_item) ? bsp : NULL; + } // endif bsp + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Jbin_Array_Add_Values + +void Jbin_Array_Add_Values_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Array_Add_Values_deinit + +/*********************************************************************************/ +/* Add one value to a Json array. */ +/*********************************************************************************/ +my_bool Jbin_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Jbin_Array_Add must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Jbin_Array_Add first argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen, true); + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Jbin_Array_Add_init + +char *Jbin_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *error) +{ + int n = 2; + PJSON top = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (bsp && !bsp->Changed) { + // This constant function was recalled + *res_length = sizeof(BSON); + return (char*)bsp; + } // endif bsp + + if (!CheckMemory(g, initid, args, 2, false, true)) { + int *x = NULL; + PJVAL jvp; + PJAR arp; + + jvp = MakeValue(g, args, 0); + top = jvp->GetJson(); + + if (args->arg_count > 2) { + if (args->arg_type[2] == INT_RESULT) { + x = (int*)PlugSubAlloc(g, NULL, sizeof(int)); + *x = (int)*(longlong*)args->args[2]; + n = 3; + } else if (!args->args[2]) + n = 3; + + } // endif count + + if (CheckPath(g, args, top, jvp, n)) + PUSH_WARNING(g->Message); + else if (jvp && jvp->GetValType() == TYPE_JAR) { + arp = jvp->GetArray(); + arp->AddValue(g, MakeValue(g, args, 1), x); + arp->InitArray(g); + } else { + PUSH_WARNING("First argument is not an array"); + if (g->Mrr) *error = 1; + } // endif jvp + + } // endif CheckMemory + + // In case of error unchanged argument will be returned + bsp = MakeBinResult(g, args, top, initid->max_length, n); + + if (initid->const_item) + // Keep result of constant function + g->Xchk = bsp; + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Jbin_Array_Add + +void Jbin_Array_Add_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Array_Add_deinit + +/*********************************************************************************/ +/* Delete a value from a Json array. */ +/*********************************************************************************/ +my_bool Jbin_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Jbin_Array_Delete must have at lest 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Jbin_Array_Delete first argument must be a json item"); + return true; + } else if (args->arg_type[1] != INT_RESULT) { + strcpy(message, "Jbin_Array_Delete second argument is not an integer (index)"); + return true; + } else + CalcLen(args, false, reslen, memlen, true); + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Jbin_Array_Delete_init + +char *Jbin_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *error) +{ + PJSON top = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (bsp && !bsp->Changed) { + // This constant function was recalled + *res_length = sizeof(BSON); + return (char*)bsp; + } // endif bsp + + if (!CheckMemory(g, initid, args, 1, false, true)) { + int n; + PJAR arp; + PJVAL jvp = MakeValue(g, args, 0); + + top = jvp->GetJson(); + + if (CheckPath(g, args, top, jvp, 2)) + PUSH_WARNING(g->Message); + else if (jvp && jvp->GetValType() == TYPE_JAR) { + n = *(int*)args->args[1]; + arp = jvp->GetArray(); + arp->DeleteValue(n); + arp->InitArray(g); + } else { + PUSH_WARNING("First argument is not an array"); + if (g->Mrr) *error = 1; + } // endif jvp + + } // endif CheckMemory + + // In case of error unchanged argument will be returned + bsp = MakeBinResult(g, args, top, initid->max_length); + + if (initid->const_item) + // Keep result of constant function + g->Xchk = bsp; + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Jbin_Array_Delete + +void Jbin_Array_Delete_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Array_Delete_deinit /*********************************************************************************/ /* Make a Json Oject containing all the parameters. */ /*********************************************************************************/ -my_bool Bson_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool Jbin_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Bson_Object_init +} // end of Jbin_Object_init -char *Bson_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *Jbin_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3039,11 +3392,11 @@ char *Bson_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, for (uint i = 0; i < args->arg_count; i++) objp->SetValue(g, MakeValue(g, args, i), MakeKey(g, args, i)); - bsp = BsonAlloc(g, initid->max_length, objp); + bsp = JbinAlloc(g, args, initid->max_length, objp); strcat(bsp->Msg, " object"); } else { - bsp = BsonAlloc(g, initid->max_length, NULL); - strncpy(bsp->Msg, g->Message, 139); + bsp = JbinAlloc(g, args, initid->max_length, NULL); + strncpy(bsp->Msg, g->Message, BMX); } // endif CheckMemory // Keep result of constant function @@ -3052,25 +3405,458 @@ char *Bson_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Bson_Object +} // end of Jbin_Object -void Bson_Object_deinit(UDF_INIT* initid) +void Jbin_Object_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Bson_Object_deinit +} // end of Jbin_Object_deinit + +/*********************************************************************************/ +/* Make a Json Oject containing all not null parameters. */ +/*********************************************************************************/ +my_bool Jbin_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + CalcLen(args, true, reslen, memlen); + return JsonInit(initid, args, message, false, reslen, memlen); +} // end of Jbin_Object_Nonull_init + +char *Jbin_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (!bsp || bsp->Changed) { + if (!CheckMemory(g, initid, args, args->arg_count, true)) { + PJVAL jvp; + PJOB objp = new(g)JOBJECT; + + for (uint i = 0; i < args->arg_count; i++) + if (!(jvp = MakeValue(g, args, i))->IsNull()) + objp->SetValue(g, jvp, MakeKey(g, args, i)); + + bsp = JbinAlloc(g, args, initid->max_length, objp); + strcat(bsp->Msg, " object"); + } else { + bsp = JbinAlloc(g, args, initid->max_length, NULL); + strncpy(bsp->Msg, g->Message, BMX); + } // endif CheckMemory + + // Keep result of constant function + g->Xchk = (initid->const_item) ? bsp : NULL; + } // endif bsp + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Jbin_Object_Nonull + +void Jbin_Object_Nonull_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Object_nonull_deinit + +/*********************************************************************************/ +/* Add or replace a value in a Json Object. */ +/*********************************************************************************/ +my_bool Jbin_Object_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Jbin_Object_Add must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Jbin_Object_Add first argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen, true); + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Jbin_Object_Add_init + +char *Jbin_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *error) +{ + PJSON top = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (bsp && !bsp->Changed) { + // This constant function was recalled + bsp = (PBSON)g->Xchk; + *res_length = sizeof(BSON); + return (char*)bsp; + } // endif bsp + + if (!CheckMemory(g, initid, args, 2, false, true)) { + char *key; + PJOB jobp; + PJVAL jvp = MakeValue(g, args, 0); + + top = jvp->GetJson(); + + if (CheckPath(g, args, top, jvp, 2)) + PUSH_WARNING(g->Message); + else if (jvp && jvp->GetValType() == TYPE_JOB) { + jobp = jvp->GetObject(); + jvp = MakeValue(g, args, 1); + key = MakeKey(g, args, 1); + jobp->SetValue(g, jvp, key); + } else { + PUSH_WARNING("First argument is not an object"); + if (g->Mrr) *error = 1; + } // endif jvp + + } // endif CheckMemory + + // In case of error unchanged argument will be returned + bsp = MakeBinResult(g, args, top, initid->max_length); + + if (initid->const_item) + // Keep result of constant function + g->Xchk = bsp; + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Jbin_Object_Add + +void Jbin_Object_Add_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Object_Add_deinit + +/*********************************************************************************/ +/* Delete a value from a Json object. */ +/*********************************************************************************/ +my_bool Jbin_Object_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Jbin_Object_Delete must have 2 or 3 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Jbin_Object_Delete first argument must be a json item"); + return true; + } else if (args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Jbin_Object_Delete second argument must be a key string"); + return true; + } else + CalcLen(args, false, reslen, memlen, true); + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Jbin_Object_Delete_init + +char *Jbin_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *error) +{ + PJSON top = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (bsp && !bsp->Changed) { + // This constant function was recalled + bsp = (PBSON)g->Xchk; + *res_length = sizeof(BSON); + return (char*)bsp; + } // endif bsp + + if (!CheckMemory(g, initid, args, 1, false, true)) { + char *key; + PJOB jobp; + PJVAL jvp = MakeValue(g, args, 0); + + top = jvp->GetJson(); + + if (CheckPath(g, args, top, jvp, 2)) + PUSH_WARNING(g->Message); + else if (jvp && jvp->GetValType() == TYPE_JOB) { + key = MakeKey(g, args, 1); + jobp = jvp->GetObject(); + jobp->DeleteKey(key); + } else { + PUSH_WARNING("First argument is not an object"); + if (g->Mrr) *error = 1; + } // endif jvp + + } // endif CheckMemory + + // In case of error unchanged argument will be returned + bsp = MakeBinResult(g, args, top, initid->max_length); + + if (initid->const_item) + // Keep result of constant function + g->Xchk = bsp; + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Jbin_Object_Delete + +void Jbin_Object_Delete_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Object_Delete_deinit + +/*********************************************************************************/ +/* Returns an array of the Json object keys. */ +/*********************************************************************************/ +my_bool Jbin_Object_List_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count != 1) { + strcpy(message, "Jbin_Object_List must have 1 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Jbin_Object_List argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, args, message, false, reslen, memlen); +} // end of Jbin_Object_List_init + +char *Jbin_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *error) +{ + PJAR jarp = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (!bsp || bsp->Changed) { + if (!CheckMemory(g, initid, args, 1, false)) { + PJVAL jvp = MakeValue(g, args, 0); + + if (jvp && jvp->GetValType() == TYPE_JOB) { + PJOB jobp = jvp->GetObject(); + + jarp = jobp->GetKeyList(g); + } else { + PUSH_WARNING("First argument is not an object"); + if (g->Mrr) *error = 1; + } // endif jvp + + } // endif CheckMemory + + bsp = JbinAlloc(g, args, initid->max_length, jarp); + strcat(bsp->Msg, " array"); + + // Keep result of constant function + g->Xchk = (initid->const_item) ? bsp : NULL; + } // endif bsp + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Jbin_Object_List + +void Jbin_Object_List_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Object_List_deinit + +/*********************************************************************************/ +/* Get a Json item from a Json document. */ +/*********************************************************************************/ +my_bool Jbin_Get_Item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + int n = IsJson(args, 0); + + if (args->arg_count < 2) { + strcpy(message, "Jbin_Get_Item must have at least 2 arguments"); + return true; + } else if (!n && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "Jbin_Get_Item first argument must be a json item"); + return true; + } else if (args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Second argument is not a string (jpath)"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + if (n == 2) { + char fn[_MAX_PATH]; + long fl; + + memcpy(fn, args->args[0], args->lengths[0]); + fn[args->lengths[0]] = 0; + fl = GetFileLength(fn); + memlen += fl * 3; + } else if (n != 3) + memlen += args->lengths[0] * 3; + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Jbin_Get_Item_init + +char *Jbin_Get_Item(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *is_null, char *) +{ + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = NULL; + + if (g->N) { + bsp = (PBSON)g->Xchk; + goto fin; + } else if (initid->const_item) + g->N = 1; + + if (!CheckMemory(g, initid, args, 1, false)) { + char *p, *path; + PJSON jsp; + PJSNX jsx; + PJVAL jvp; + + if (!g->Xchk) { + jvp = MakeValue(g, args, 0); + + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (g->Mrr) { // First argument is a constant + g->Xchk = jsp; + JsonMemSave(g); + } // endif Mrr + + } else + jsp = (PJSON)g->Xchk; + + path = MakePSZ(g, args, 1); + jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length); + + if (jsx->SetJpath(g, path, true)) { + PUSH_WARNING(g->Message); + *is_null = 1; + return NULL; + } // endif SetJpath + + // Get the json tree + jvp = jsx->GetValue(g, jsp, 0, false); + + if (jvp->GetJsp()) { + bsp = JbinAlloc(g, args, initid->max_length, jvp->GetJsp()); + strcat(bsp->Msg, " item"); + } // end of Jsp + + if (initid->const_item) + // Keep result of constant function + g->Xchk = bsp; + + } // endif CheckMemory + +fin: + if (!bsp) { + *is_null = 1; + *res_length = 0; + } else + *res_length = sizeof(BSON); + + return (char*)bsp; +} // end of Jbin_Get_Item + +void Jbin_Get_Item_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Get_Item_deinit + +/*********************************************************************************/ +/* Merge two arrays or objects. */ +/*********************************************************************************/ +my_bool Jbin_Item_Merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count < 2) { + strcpy(message, "Jbin_Item_Merge must have at least 2 arguments"); + return true; + } else if (!IsJson(args, 0)) { + strcpy(message, "Jbin_Item_Merge first argument must be a json item"); + return true; + } else if (!IsJson(args, 1)) { + strcpy(message, "Jbin_Item_Merge second argument must be a json item"); + return true; + } else + CalcLen(args, false, reslen, memlen, true); + + return JsonInit(initid, args, message, true, reslen, memlen); +} // end of Jbin_Item_Merge_init + +char *Jbin_Item_Merge(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *error) +{ + PJSON top = NULL; + PGLOBAL g = (PGLOBAL)initid->ptr; + PBSON bsp = (PBSON)g->Xchk; + + if (bsp && !bsp->Changed) { + // This constant function was recalled + *res_length = sizeof(BSON); + return (char*)bsp; + } // endif bsp + + if (!CheckMemory(g, initid, args, 2, false, true)) { + PJVAL jvp; + PJSON jsp[2] ={ NULL, NULL }; + + for (int i = 0; i < 2; i++) { + jvp = MakeValue(g, args, i); + if (!i) top = jvp->GetJson(); + + if (jvp->GetValType() != TYPE_JAR && jvp->GetValType() != TYPE_JOB) { + sprintf(g->Message, "Argument %d is not an array or object", i); + PUSH_WARNING(g->Message); + } else + jsp[i] = jvp->GetJsp(); + + } // endfor i + + if (jsp[0]) { + if (jsp[0]->Merge(g, jsp[1])) + PUSH_WARNING(g->Message); + else + MakeBinResult(g, args, top, initid->max_length); + + } // endif jsp + + } // endif CheckMemory + + // In case of error unchanged first argument will be returned + bsp = MakeBinResult(g, args, top, initid->max_length); + + if (initid->const_item) + // Keep result of constant function + g->Xchk = bsp; + + *res_length = sizeof(BSON); + return (char*)bsp; +} // end of Jbin_Item_Merge + +void Jbin_Item_Merge_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Jbin_Item_Merge_deinit /*********************************************************************************/ /* Returns a json file as a json item. */ /*********************************************************************************/ -my_bool Bson_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool Jbin_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, fl, more = 1024; if (args->arg_count < 1 || args->arg_count > 3) { - strcpy(message, "Bson_File only accepts 1 to 3 arguments"); + strcpy(message, "Jbin_File only accepts 1 to 3 arguments"); return true; } else if (args->arg_type[0] != STRING_RESULT || !args->args[0]) { - strcpy(message, "Bson_File first argument must be a constant string (file name)"); + strcpy(message, "Jbin_File first argument must be a constant string (file name)"); return true; } else if (args->arg_count > 1 && args->arg_type[1] != INT_RESULT) { strcpy(message, "Second argument is not an integer (pretty)"); @@ -3090,9 +3876,9 @@ my_bool Bson_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) more += fl * M; memlen += more; return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Bson_File_init +} // end of Jbin_File_init -char *Bson_File(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *Jbin_File(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *fn, *memory; @@ -3165,7 +3951,7 @@ char *Bson_File(UDF_INIT *initid, UDF_ARGS *args, char *result, CloseMemMap(memory, len); if (jsp) { - bsp = BsonAlloc(g, len, jsp); + bsp = JbinAlloc(g, args, len, jsp); strcat(bsp->Msg, " file"); bsp->Filename = fn; bsp->Pretty = pretty; @@ -3184,9 +3970,56 @@ fin: *res_length = sizeof(BSON); return (char*)bsp; -} // end of Bson_File +} // end of Jbin_File -void Bson_File_deinit(UDF_INIT* initid) +void Jbin_File_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Bson_File_deinit +} // end of Jbin_File_deinit + +/*********************************************************************************/ +/* Serialize a Json document. . */ +/*********************************************************************************/ +my_bool Json_Serialize_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +{ + unsigned long reslen, memlen; + + if (args->arg_count != 1) { + strcpy(message, "Json_Serialize must have 1 argument"); + return true; + } else if (IsJson(args, 0) != 3) { + strcpy(message, "Json_Serialize argument must be a Jbin tree"); + return true; + } else + CalcLen(args, false, reslen, memlen); + + return JsonInit(initid, args, message, false, reslen, memlen); +} // end of Json_Serialize_init + +char *Json_Serialize(UDF_INIT *initid, UDF_ARGS *args, char *result, + unsigned long *res_length, char *, char *) +{ + char *str; + PGLOBAL g = (PGLOBAL)initid->ptr; + + if (!g->Xchk) { + PBSON bsp = (PBSON)args->args[0]; + + JsonSubSet(g); + + if (!(str = Serialize(g, bsp->Jsp, NULL, 0))) + str = strcpy(result, g->Message); + + // Keep result of constant function + g->Xchk = (initid->const_item) ? str : NULL; + } else + str = (char*)g->Xchk; + + *res_length = strlen(str); + return str; +} // end of Json_Serialize + +void Json_Serialize_deinit(UDF_INIT* initid) +{ + JsonFreeMem((PGLOBAL)initid->ptr); +} // end of Json_Serialize_deinit diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index be9bde95da3..c7eba1375d2 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -1,5 +1,5 @@ /******************** tabjson H Declares Source Code File (.H) *******************/ -/* Name: jsonudf.h Version 1.1 */ +/* Name: jsonudf.h Version 1.2 */ /* */ /* (C) Copyright to the author Olivier BERTRAND 2015 */ /* */ @@ -33,9 +33,9 @@ typedef class JOUTPATH *PJTP; typedef class JOUTALL *PJTA; extern "C" { - DllExport my_bool Json_Value_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Value(UDF_EXEC_ARGS); - DllExport void Json_Value_deinit(UDF_INIT*); + DllExport my_bool JsonValue_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *JsonValue(UDF_EXEC_ARGS); + DllExport void JsonValue_deinit(UDF_INIT*); DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *Json_Array(UDF_EXEC_ARGS); @@ -89,6 +89,10 @@ extern "C" { DllExport char *Json_Get_Item(UDF_EXEC_ARGS); DllExport void Json_Get_Item_deinit(UDF_INIT*); + DllExport my_bool Json_Item_Merge_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Item_Merge(UDF_EXEC_ARGS); + DllExport void Json_Item_Merge_deinit(UDF_INIT*); + DllExport my_bool JsonGetString_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *JsonGetString(UDF_EXEC_ARGS); DllExport void JsonGetString_deinit(UDF_INIT*); @@ -117,17 +121,57 @@ extern "C" { DllExport char *Jfile_Make(UDF_EXEC_ARGS); DllExport void Jfile_Make_deinit(UDF_INIT*); - DllExport my_bool Bson_Array_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Bson_Array(UDF_EXEC_ARGS); - DllExport void Bson_Array_deinit(UDF_INIT*); + DllExport my_bool Jbin_Array_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Array(UDF_EXEC_ARGS); + DllExport void Jbin_Array_deinit(UDF_INIT*); - DllExport my_bool Bson_Object_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Bson_Object(UDF_EXEC_ARGS); - DllExport void Bson_Object_deinit(UDF_INIT*); + DllExport my_bool Jbin_Array_Add_Values_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Array_Add_Values(UDF_EXEC_ARGS); + DllExport void Jbin_Array_Add_Values_deinit(UDF_INIT*); - DllExport my_bool Bson_File_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Bson_File(UDF_EXEC_ARGS); - DllExport void Bson_File_deinit(UDF_INIT*); + DllExport my_bool Jbin_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Array_Add(UDF_EXEC_ARGS); + DllExport void Jbin_Array_Add_deinit(UDF_INIT*); + + DllExport my_bool Jbin_Array_Delete_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Array_Delete(UDF_EXEC_ARGS); + DllExport void Jbin_Array_Delete_deinit(UDF_INIT*); + + DllExport my_bool Jbin_Object_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Object(UDF_EXEC_ARGS); + DllExport void Jbin_Object_deinit(UDF_INIT*); + + DllExport my_bool Jbin_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Object_Nonull(UDF_EXEC_ARGS); + DllExport void Jbin_Object_Nonull_deinit(UDF_INIT*); + + DllExport my_bool Jbin_Object_Add_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Object_Add(UDF_EXEC_ARGS); + DllExport void Jbin_Object_Add_deinit(UDF_INIT*); + + DllExport my_bool Jbin_Object_Delete_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Object_Delete(UDF_EXEC_ARGS); + DllExport void Jbin_Object_Delete_deinit(UDF_INIT*); + + DllExport my_bool Jbin_Object_List_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Object_List(UDF_EXEC_ARGS); + DllExport void Jbin_Object_List_deinit(UDF_INIT*); + + DllExport my_bool Jbin_Get_Item_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Get_Item(UDF_EXEC_ARGS); + DllExport void Jbin_Get_Item_deinit(UDF_INIT*); + + DllExport my_bool Jbin_Item_Merge_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_Item_Merge(UDF_EXEC_ARGS); + DllExport void Jbin_Item_Merge_deinit(UDF_INIT*); + + DllExport my_bool Jbin_File_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Jbin_File(UDF_EXEC_ARGS); + DllExport void Jbin_File_deinit(UDF_INIT*); + + DllExport my_bool Json_Serialize_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *Json_Serialize(UDF_EXEC_ARGS); + DllExport void Json_Serialize_deinit(UDF_INIT*); } // extern "C" /*********************************************************************************/ @@ -155,6 +199,7 @@ public: my_bool SetJpath(PGLOBAL g, char *path, my_bool jb = false); my_bool ParseJpath(PGLOBAL g); void ReadValue(PGLOBAL g); + PJVAL GetValue(PGLOBAL g, PJSON row, int i, my_bool b = true); PJVAL GetJson(PGLOBAL g); char *Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k = 1); char *LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx = 10); @@ -162,7 +207,6 @@ public: protected: my_bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); PVAL GetColumnValue(PGLOBAL g, PJSON row, int i); - PJVAL GetValue(PGLOBAL g, PJSON row, int i); PVAL ExpandArray(PGLOBAL g, PJAR arp, int n); PVAL CalculateArray(PGLOBAL g, PJAR arp, int n); PVAL MakeJson(PGLOBAL g, PJSON jsp); diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result index bf31ba00c91..f130d7b5f04 100644 --- a/storage/connect/mysql-test/connect/r/json_udf.result +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -18,32 +18,30 @@ ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add must hav SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; Array [56,3.141600,"foo",null,"One more"] -SELECT Json_Array_Add(Json_Value('one value'),'One more'); -Json_Array_Add(Json_Value('one value'),'One more') -NULL -Warnings: -Warning 1105 First argument is not an array +SELECT Json_Array_Add(JsonValue('one value'),'One more'); +ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add first argument must be a json item SELECT Json_Array_Add('one value','One more'); ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add first argument must be a json item SELECT Json_Array_Add('one value' json_,'One more'); Json_Array_Add('one value' json_,'One more') NULL Warnings: -Warning 1105 Unexpected character 'o' near one value +Warning 1105 Error 2 opening one value +Warning 1105 Void JSON object Warning 1105 First argument is not an array -SELECT Json_Value(56,3.1416,'foo',NULL); -ERROR HY000: Can't initialize function 'Json_Value'; Json_Value cannot accept more than 1 argument -SELECT Json_Value(3.1416); -Json_Value(3.1416) +SELECT JsonValue(56,3.1416,'foo',NULL); +ERROR HY000: Can't initialize function 'JsonValue'; JsonValue cannot accept more than 1 argument +SELECT JsonValue(3.1416); +JsonValue(3.1416) 3.141600 -SELECT Json_Value('foo'); -Json_Value('foo') +SELECT JsonValue('foo'); +JsonValue('foo') "foo" -SELECT Json_Value(NULL); -Json_Value(NULL) +SELECT JsonValue(NULL); +JsonValue(NULL) null -SELECT Json_Value(); -Json_Value() +SELECT JsonValue(); +JsonValue() null SELECT Json_Object(); Json_Object() @@ -165,6 +163,6 @@ DROP FUNCTION Json_Array; DROP FUNCTION Json_Array_Add; DROP FUNCTION Json_Object; DROP FUNCTION Json_Object_Nonull; -DROP FUNCTION Json_Value; +DROP FUNCTION JsonValue; DROP FUNCTION Json_Array_Grp; DROP FUNCTION Json_Object_Grp; diff --git a/storage/connect/mysql-test/connect/t/json_udf.inc b/storage/connect/mysql-test/connect/t/json_udf.inc index 098fff3663e..0a47d4b690b 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.inc +++ b/storage/connect/mysql-test/connect/t/json_udf.inc @@ -9,28 +9,13 @@ if (!$HA_CONNECT_SO) { --skip Needs a dynamically built ha_connect.so } -let $is_win = `select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows")`; +CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION JsonValue RETURNS STRING SONAME 'ha_connect'; +CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect'; +CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect'; -if ($is_win) -{ ---eval CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect.dll'; ---eval CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect.dll'; ---eval CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect.dll'; ---eval CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect.dll'; ---eval CREATE FUNCTION Json_Value returns STRING SONAME 'ha_connect.dll'; ---eval CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect.dll'; ---eval CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect.dll'; -} - -if (!$is_win) -{ ---eval CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect.so'; ---eval CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect.so'; ---eval CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect.so'; ---eval CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect.so'; ---eval CREATE FUNCTION Json_Value returns STRING SONAME 'ha_connect.so'; ---eval CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect.so'; ---eval CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect.so'; -} --enable_query_log diff --git a/storage/connect/mysql-test/connect/t/json_udf.test b/storage/connect/mysql-test/connect/t/json_udf.test index b4427517ca5..e322a175bf6 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.test +++ b/storage/connect/mysql-test/connect/t/json_udf.test @@ -15,16 +15,17 @@ SELECT Json_Array(56,3.1416,'My name is "Foo"',NULL); --error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL)) Array; SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; -SELECT Json_Array_Add(Json_Value('one value'),'One more'); +--error ER_CANT_INITIALIZE_UDF +SELECT Json_Array_Add(JsonValue('one value'),'One more'); --error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add('one value','One more'); SELECT Json_Array_Add('one value' json_,'One more'); --error ER_CANT_INITIALIZE_UDF -SELECT Json_Value(56,3.1416,'foo',NULL); -SELECT Json_Value(3.1416); -SELECT Json_Value('foo'); -SELECT Json_Value(NULL); -SELECT Json_Value(); +SELECT JsonValue(56,3.1416,'foo',NULL); +SELECT JsonValue(3.1416); +SELECT JsonValue('foo'); +SELECT JsonValue(NULL); +SELECT JsonValue(); SELECT Json_Object(); SELECT Json_Object(Json_Array(56,3.1416,'foo'),NULL); SELECT Json_Array(Json_Array(56,3.1416,'foo'),NULL); @@ -82,7 +83,7 @@ DROP FUNCTION Json_Array; DROP FUNCTION Json_Array_Add; DROP FUNCTION Json_Object; DROP FUNCTION Json_Object_Nonull; -DROP FUNCTION Json_Value; +DROP FUNCTION JsonValue; DROP FUNCTION Json_Array_Grp; DROP FUNCTION Json_Object_Grp; From a575d90fe1f5680cc35339d4c903003d886aaea5 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Mon, 21 Sep 2015 21:14:18 +0200 Subject: [PATCH 31/39] Fold all json UDF names to lower case modified: storage/connect/jsonudf.cpp modified: storage/connect/jsonudf.h modified: storage/connect/mysql-test/connect/r/json_udf.result modified: storage/connect/mysql-test/connect/t/json_udf.inc modified: storage/connect/value.cpp --- storage/connect/jsonudf.cpp | 562 +++++++++--------- storage/connect/jsonudf.h | 212 +++---- .../mysql-test/connect/r/json_udf.result | 12 +- .../connect/mysql-test/connect/t/json_udf.inc | 14 +- storage/connect/value.cpp | 8 + 5 files changed, 410 insertions(+), 398 deletions(-) diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 08b555ebd71..fc66e754881 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -16,8 +16,12 @@ #include "jsonudf.h" #define MEMFIX 4096 +#if defined(connect_EXPORTS) #define PUSH_WARNING(M) \ push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M) +#else +#define PUSH_WARNING(M) htrc(M) +#endif #define M 7 uint GetJsonGrpSize(void); @@ -855,7 +859,7 @@ inline void JsonMemSave(PGLOBAL g) } /* end of JsonMemSave */ /*********************************************************************************/ -/* Program for freeing the memory pools. */ +/* Program for freeing the memory pools. */ /*********************************************************************************/ inline void JsonFreeMem(PGLOBAL g) { @@ -896,7 +900,7 @@ static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON top, PJVAL& jvp, int n if (args->arg_type[i] == STRING_RESULT) { // A path to a subset of the json tree is given char *path = MakePSZ(g, args, i); - PJSNX jsx = new(g)JSNX(g, top, TYPE_STRING); + PJSNX jsx = new(g) JSNX(g, top, TYPE_STRING); if (jsx->SetJpath(g, path)) return true; @@ -1358,20 +1362,20 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) /*********************************************************************************/ /* Make a Json value containing the parameter. */ /*********************************************************************************/ -my_bool JsonValue_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jsonvalue_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count > 1) { - strcpy(message, "JsonValue cannot accept more than 1 argument"); + strcpy(message, "jsonvalue cannot accept more than 1 argument"); return true; } else CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of JsonValue_init +} // end of jsonvalue_init -char *JsonValue(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jsonvalue(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { char *str; @@ -1399,20 +1403,20 @@ char *JsonValue(UDF_INIT *initid, UDF_ARGS *args, char *result, void JsonValue_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of JsonValue_deinit +} // end of jsonvalue_deinit /*********************************************************************************/ /* Make a Json array containing all the parameters. */ /*********************************************************************************/ -my_bool Json_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Json_Array_init +} // end of json_array_init -char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_array(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { char *str; @@ -1440,33 +1444,33 @@ char *Json_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Array +} // end of json_array -void Json_Array_deinit(UDF_INIT* initid) +void json_array_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Array_deinit +} // end of json_array_deinit /*********************************************************************************/ /* Add one or several values to a Json array. */ /*********************************************************************************/ -my_bool Json_Array_Add_Values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_array_add_values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Json_Array_Add must have at least 2 arguments"); + strcpy(message, "json_array_add_values must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Array_Add first argument must be a json string"); + strcpy(message, "json_array_add_values first argument must be a json string"); return true; } else CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Array_Add_Values_init +} // end of json_array_add_values_init -char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *str = NULL; @@ -1507,33 +1511,33 @@ char *Json_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Array_Add_Values +} // end of json_array_add_values -void Json_Array_Add_Values_deinit(UDF_INIT* initid) +void json_array_add_values_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Array_Add_Values_deinit +} // end of json_array_add_values_deinit /*********************************************************************************/ /* Add one value to a Json array. */ /*********************************************************************************/ -my_bool Json_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Json_Array_Add must have at least 2 arguments"); + strcpy(message, "json_array_add must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Array_Add first argument must be a json item"); + strcpy(message, "json_array_add first argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Array_Add_init +} // end of json_array_add_init -char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { char *str = NULL; @@ -1589,36 +1593,36 @@ char *Json_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Array_Add +} // end of json_array_add -void Json_Array_Add_deinit(UDF_INIT* initid) +void json_array_add_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Array_Add_deinit +} // end of json_array_add_deinit /*********************************************************************************/ /* Delete a value from a Json array. */ /*********************************************************************************/ -my_bool Json_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Json_Array_Delete must have at lest 2 arguments"); + strcpy(message, "json_array_delete must have at lest 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Array_Delete first argument must be a json item"); + strcpy(message, "json_array_delete first argument must be a json item"); return true; } else if (args->arg_type[1] != INT_RESULT) { - strcpy(message, "Json_Array_Delete second argument is not an integer (index)"); + strcpy(message, "json_array_delete second argument is not an integer (index)"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Array_Delete_init +} // end of json_array_delete_init -char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { char *str = NULL; @@ -1662,25 +1666,25 @@ char *Json_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = (str) ? strlen(str) : 0; return str; -} // end of Json_Array_Delete +} // end of json_array_delete -void Json_Array_Delete_deinit(UDF_INIT* initid) +void json_array_delete_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Array_Delete_deinit +} // end of json_array_delete_deinit /*********************************************************************************/ /* Make a Json Oject containing all the parameters. */ /*********************************************************************************/ -my_bool Json_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Json_Object_init +} // end of json_object_init -char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { char *str = NULL; @@ -1706,26 +1710,26 @@ char *Json_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Object +} // end of json_object -void Json_Object_deinit(UDF_INIT* initid) +void json_object_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Object_deinit +} // end of json_object_deinit /*********************************************************************************/ /* Make a Json Oject containing all not null parameters. */ /*********************************************************************************/ -my_bool Json_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, +my_bool json_object_nonull_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Json_Object_Nonull_init +} // end of json_object_nonull_init -char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_object_nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { char *str; @@ -1753,33 +1757,33 @@ char *Json_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Object_Nonull +} // end of json_object_nonull -void Json_Object_Nonull_deinit(UDF_INIT* initid) +void json_object_nonull_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Object_nonull_deinit +} // end of json_object_nonull_deinit /*********************************************************************************/ /* Add or replace a value in a Json Object. */ /*********************************************************************************/ -my_bool Json_Object_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Json_Object_Add must have at least 2 arguments"); + strcpy(message, "json_object_add must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Object_Add first argument must be a json item"); + strcpy(message, "json_object_add first argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Object_Add_init +} // end of json_object_add_init -char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { char *key, *str = NULL; @@ -1822,36 +1826,36 @@ char *Json_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Object_Add +} // end of json_object_add -void Json_Object_Add_deinit(UDF_INIT* initid) +void json_object_add_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Object_Add_deinit +} // end of json_object_add_deinit /*********************************************************************************/ /* Delete a value from a Json object. */ /*********************************************************************************/ -my_bool Json_Object_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_object_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Json_Object_Delete must have 2 or 3 arguments"); + strcpy(message, "json_object_delete must have 2 or 3 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Object_Delete first argument must be a json item"); + strcpy(message, "json_object_delete first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { - strcpy(message, "Json_Object_Delete second argument must be a key string"); + strcpy(message, "json_object_delete second argument must be a key string"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Object_Delete_init +} // end of json_object_delete_init -char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { char *str = NULL; @@ -1894,33 +1898,33 @@ char *Json_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Object_Delete +} // end of json_object_delete -void Json_Object_Delete_deinit(UDF_INIT* initid) +void json_object_delete_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Object_Delete_deinit +} // end of json_object_delete_deinit /*********************************************************************************/ /* Returns an array of the Json object keys. */ /*********************************************************************************/ -my_bool Json_Object_List_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_object_list_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count != 1) { - strcpy(message, "Json_Object_List must have 1 arguments"); + strcpy(message, "json_object_list must have 1 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Object_List argument must be a json item"); + strcpy(message, "json_object_list argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Object_List_init +} // end of json_object_list_init -char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *str = NULL; @@ -1960,22 +1964,22 @@ char *Json_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Object_List +} // end of json_object_list -void Json_Object_List_deinit(UDF_INIT* initid) +void json_object_list_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Object_List_deinit +} // end of json_object_list_deinit /*********************************************************************************/ /* Make a Json array from values coming from rows. */ /*********************************************************************************/ -my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_array_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, n = GetJsonGrpSize(); if (args->arg_count != 1) { - strcpy(message, "Json_Array_Grp can only accept 1 argument"); + strcpy(message, "json_array_grp can only accept 1 argument"); return true; } else if (IsJson(args, 0) == 3) { strcpy(message, "Json_Array_Grp does not support Jbin argument"); @@ -1995,9 +1999,9 @@ my_bool Json_Array_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) g->Activityp = (PACTIVITY)new(g) JARRAY; g->N = (int)n; return false; -} // end of Json_Array_Grp_init +} // end of json_array_grp_init -void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) +void json_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; PJAR arp = (PJAR)g->Activityp; @@ -2005,9 +2009,9 @@ void Json_Array_Grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) if (g->N-- > 0) arp->AddValue(g, MakeValue(g, args, 0)); -} // end of Json_Array_Grp_add +} // end of json_array_grp_add -char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, +char *json_array_grp(UDF_INIT *initid, UDF_ARGS *, char *result, unsigned long *res_length, char *, char *) { char *str; @@ -2024,34 +2028,34 @@ char *Json_Array_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, *res_length = strlen(str); return str; -} // end of Json_Array_Grp +} // end of json_array_grp -void Json_Array_Grp_clear(UDF_INIT *initid, char*, char*) +void json_array_grp_clear(UDF_INIT *initid, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; PlugSubSet(g, g->Sarea, g->Sarea_Size); g->Activityp = (PACTIVITY)new(g) JARRAY; g->N = GetJsonGrpSize(); -} // end of Json_Array_Grp_clear +} // end of json_array_grp_clear -void Json_Array_Grp_deinit(UDF_INIT* initid) +void json_array_grp_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Array_Grp_deinit +} // end of json_array_grp_deinit /*********************************************************************************/ /* Make a Json object from values coming from rows. */ /*********************************************************************************/ -my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_object_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, n = GetJsonGrpSize(); if (args->arg_count != 2) { - strcpy(message, "Json_Object_Grp can only accept 2 arguments"); + strcpy(message, "json_object_grp can only accept 2 arguments"); return true; } else if (IsJson(args, 0) == 3) { - strcpy(message, "Json_Object_Grp does not support Jbin arguments"); + strcpy(message, "json_object_grp does not support Jbin arguments"); return true; } else CalcLen(args, true, reslen, memlen); @@ -2068,9 +2072,9 @@ my_bool Json_Object_Grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) g->Activityp = (PACTIVITY)new(g) JOBJECT; g->N = (int)n; return false; -} // end of Json_Object_Grp_init +} // end of json_object_grp_init -void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) +void json_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; PJOB objp = (PJOB)g->Activityp; @@ -2078,9 +2082,9 @@ void Json_Object_Grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) if (g->N-- > 0) objp->SetValue(g, MakeValue(g, args, 0), MakePSZ(g, args, 1)); -} // end of Json_Object_Grp_add +} // end of json_object_grp_add -char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, +char *json_object_grp(UDF_INIT *initid, UDF_ARGS *, char *result, unsigned long *res_length, char *, char *) { char *str; @@ -2095,45 +2099,45 @@ char *Json_Object_Grp(UDF_INIT *initid, UDF_ARGS *, char *result, *res_length = strlen(str); return str; -} // end of Json_Object_Grp +} // end of json_object_grp -void Json_Object_Grp_clear(UDF_INIT *initid, char*, char*) +void json_object_grp_clear(UDF_INIT *initid, char*, char*) { PGLOBAL g = (PGLOBAL)initid->ptr; PlugSubSet(g, g->Sarea, g->Sarea_Size); g->Activityp = (PACTIVITY)new(g) JOBJECT; g->N = GetJsonGrpSize(); -} // end of Json_Object_Grp_clear +} // end of json_object_grp_clear -void Json_Object_Grp_deinit(UDF_INIT* initid) +void json_object_grp_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Object_Grp_deinit +} // end of json_object_grp_deinit /*********************************************************************************/ /* Merge two arrays or objects. */ /*********************************************************************************/ -my_bool Json_Item_Merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_item_merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Json_Item_Merge must have at least 2 arguments"); + strcpy(message, "json_item_merge must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Json_Item_Merge first argument must be a json item"); + strcpy(message, "json_item_merge first argument must be a json item"); return true; } else if (!IsJson(args, 1)) { - strcpy(message, "Json_Item_Merge second argument must be a json item"); + strcpy(message, "json_item_merge second argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Item_Merge_init +} // end of json_item_merge_init -char *Json_Item_Merge(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { char *str = NULL; @@ -2183,26 +2187,26 @@ char *Json_Item_Merge(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Item_Merge +} // end of json_item_merge -void Json_Item_Merge_deinit(UDF_INIT* initid) +void json_item_merge_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Item_Merge_deinit +} // end of json_item_merge_deinit /*********************************************************************************/ /* Get a Json item from a Json document. */ /*********************************************************************************/ -my_bool Json_Get_Item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; int n = IsJson(args, 0); if (args->arg_count < 2) { - strcpy(message, "Json_Get_Item must have at least 2 arguments"); + strcpy(message, "json_get_item must have at least 2 arguments"); return true; } else if (!n && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "Json_Get_Item first argument must be a json item"); + strcpy(message, "json_get_item first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a string (jpath)"); @@ -2222,9 +2226,9 @@ my_bool Json_Get_Item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += args->lengths[0] * 3; return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Get_Item_init +} // end of json_get_item_init -char *Json_Get_Item(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *str = NULL; @@ -2264,7 +2268,7 @@ char *Json_Get_Item(UDF_INIT *initid, UDF_ARGS *args, char *result, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length); + jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length); if (jsx->SetJpath(g, path, true)) { PUSH_WARNING(g->Message); @@ -2291,26 +2295,26 @@ char *Json_Get_Item(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Get_Item +} // end of json_get_item -void Json_Get_Item_deinit(UDF_INIT* initid) +void json_get_item_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Get_Item_deinit +} // end of json_get_item_deinit /*********************************************************************************/ /* Get a string value from a Json item. */ /*********************************************************************************/ -my_bool JsonGetString_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jsonget_string_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; int n = IsJson(args, 0); if (args->arg_count < 2) { - strcpy(message, "JsonGetString must have at least 2 arguments"); + strcpy(message, "jsonget_string must have at least 2 arguments"); return true; } else if (!n && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "JsonGetString first argument must be a json item"); + strcpy(message, "jsonget_string first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a string (jpath)"); @@ -2330,9 +2334,9 @@ my_bool JsonGetString_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += args->lengths[0] * 3; return JsonInit(initid, args, message, true, reslen, memlen); -} // end of JsonGetString_init +} // end of jsonget_string_init -char *JsonGetString(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *str = NULL; @@ -2372,7 +2376,7 @@ char *JsonGetString(UDF_INIT *initid, UDF_ARGS *args, char *result, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length); + jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length); if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); @@ -2399,25 +2403,25 @@ fin: *res_length = strlen(str); return str; -} // end of JsonGetString +} // end of jsonget_string -void JsonGetString_deinit(UDF_INIT* initid) +void jsonget_string_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of JsonGetString_deinit +} // end of jsonget_string_deinit /*********************************************************************************/ /* Get an integer value from a Json item. */ /*********************************************************************************/ -my_bool JsonGetInt_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jsonget_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count != 2) { - strcpy(message, "JsonGetInt must have 2 arguments"); + strcpy(message, "jsonget_int must have 2 arguments"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "JsonGetInt first argument must be a json item"); + strcpy(message, "jsonget_int first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a (jpath) string"); @@ -2429,9 +2433,9 @@ my_bool JsonGetInt_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += 1000; // TODO: calculate this return JsonInit(initid, args, message, true, reslen, memlen); -} // end of JsonGetInt_init +} // end of jsonget_int_init -long long JsonGetInt(UDF_INIT *initid, UDF_ARGS *args, +long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2476,7 +2480,7 @@ long long JsonGetInt(UDF_INIT *initid, UDF_ARGS *args, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g)JSNX(g, jsp, TYPE_BIGINT); + jsx = new(g) JSNX(g, jsp, TYPE_BIGINT); if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); @@ -2507,25 +2511,25 @@ long long JsonGetInt(UDF_INIT *initid, UDF_ARGS *args, if (g->Mrr) *error = 1; *is_null = 1; return 0LL; -} // end of JsonGetInt +} // end of jsonget_int -void JsonGetInt_deinit(UDF_INIT* initid) +void jsonget_int_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of JsonGetInt_deinit +} // end of jsonget_int_deinit /*********************************************************************************/ /* Get a double value from a Json item. */ /*********************************************************************************/ -my_bool JsonGetReal_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jsonget_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "JsonGetReal must have at least 2 arguments"); + strcpy(message, "jsonget_real must have at least 2 arguments"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "JsonGetReal first argument must be a json item"); + strcpy(message, "jsonget_real first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a (jpath) string"); @@ -2546,9 +2550,9 @@ my_bool JsonGetReal_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += 1000; // TODO: calculate this return JsonInit(initid, args, message, true, reslen, memlen); -} // end of JsonGetReal_init +} // end of jsonget_real_init -double JsonGetReal(UDF_INIT *initid, UDF_ARGS *args, +double jsonget_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2592,7 +2596,7 @@ double JsonGetReal(UDF_INIT *initid, UDF_ARGS *args, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g)JSNX(g, jsp, TYPE_DOUBLE); + jsx = new(g) JSNX(g, jsp, TYPE_DOUBLE); if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); @@ -2623,25 +2627,25 @@ double JsonGetReal(UDF_INIT *initid, UDF_ARGS *args, if (g->Mrr) *error = 1; *is_null = 1; return 0.0; -} // end of JsonGetReal +} // end of jsonget_real -void JsonGetReal_deinit(UDF_INIT* initid) +void jsonget_real_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of JsonGetReal_deinit +} // end of jsonget_real_deinit /*********************************************************************************/ /* Locate a value in a Json tree. */ /*********************************************************************************/ -my_bool JsonLocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jsonlocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, more = 1000; if (args->arg_count < 2) { - strcpy(message, "Json_Locate must have at least 2 arguments"); + strcpy(message, "jsonlocate must have at least 2 arguments"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "Json_Locate first argument must be a json item"); + strcpy(message, "jsonlocate first argument must be a json item"); return true; } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { strcpy(message, "Third argument is not an integer (rank)"); @@ -2659,9 +2663,9 @@ my_bool JsonLocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += 1000; // TODO: calculate this return JsonInit(initid, args, message, true, reslen, memlen); -} // end of JsonLocate_init +} // end of jsonlocate_init -char *JsonLocate(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *path = NULL; @@ -2728,7 +2732,7 @@ char *JsonLocate(UDF_INIT *initid, UDF_ARGS *args, char *result, k = (args->arg_count > 2) ? (int)*(long long*)args->args[2] : 1; - jsx = new(g)JSNX(g, jsp, TYPE_STRING); + jsx = new(g) JSNX(g, jsp, TYPE_STRING); path = jsx->Locate(g, jsp, jvp2, k); if (initid->const_item) @@ -2750,25 +2754,25 @@ char *JsonLocate(UDF_INIT *initid, UDF_ARGS *args, char *result, *error = 1; *is_null = 1; return NULL; -} // end of JsonLocate +} // end of jsonlocate -void Json_Locate_deinit(UDF_INIT* initid) +void json_locate_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of JsonLocate_deinit +} // end of jsonlocate_deinit /*********************************************************************************/ /* Locate all occurences of a value in a Json tree. */ /*********************************************************************************/ -my_bool Json_Locate_All_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_locate_all_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, more = 1000; if (args->arg_count < 2) { - strcpy(message, "Json_Locate_All must have at least 2 arguments"); + strcpy(message, "json_locate_all must have at least 2 arguments"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "Json_Locate_All first argument must be a json item"); + strcpy(message, "json_locate_all first argument must be a json item"); return true; } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { strcpy(message, "Third argument is not an integer (Depth)"); @@ -2786,9 +2790,9 @@ my_bool Json_Locate_All_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += 1000; // TODO: calculate this return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Json_Locate_All_init +} // end of json_locate_all_init -char *Json_Locate_All(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *path = NULL; @@ -2857,7 +2861,7 @@ char *Json_Locate_All(UDF_INIT *initid, UDF_ARGS *args, char *result, if (args->arg_count > 2) mx = (int)*(long long*)args->args[2]; - jsx = new(g)JSNX(g, jsp, TYPE_STRING); + jsx = new(g) JSNX(g, jsp, TYPE_STRING); path = jsx->LocateAll(g, jsp, jvp2, mx); if (initid->const_item) @@ -2879,25 +2883,25 @@ char *Json_Locate_All(UDF_INIT *initid, UDF_ARGS *args, char *result, *error = 1; *is_null = 1; return NULL; -} // end of Json_Locate_All +} // end of json_locate_all -void Json_Locate_All_deinit(UDF_INIT* initid) +void json_locate_all_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Locate_All_deinit +} // end of json_locate_all_deinit /*********************************************************************************/ /* Returns a json file as a json string. */ /*********************************************************************************/ -my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, fl, more = 1024; if (args->arg_count < 1 || args->arg_count > 4) { - strcpy(message, "Json_File only accepts 1 to 4 arguments"); + strcpy(message, "json_file only accepts 1 to 4 arguments"); return true; } else if (args->arg_type[0] != STRING_RESULT) { - strcpy(message, "Json_File first argument must be a (string) file name"); + strcpy(message, "json_file first argument must be a (string) file name"); return true; } else if (args->arg_count > 1 && args->arg_type[1] != INT_RESULT) { strcpy(message, "Second argument is not an integer (check)"); @@ -2926,9 +2930,9 @@ my_bool Json_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += more; return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Json_File_init +} // end of json_file_init -char *Json_File(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_file(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *str, *fn; @@ -3022,25 +3026,25 @@ fin: *res_length = strlen(str); return str; -} // end of Json_File +} // end of json_file -void Json_File_deinit(UDF_INIT* initid) +void json_file_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_File_deinit +} // end of json_file_deinit /*********************************************************************************/ /* Make a json file from a json item. */ /*********************************************************************************/ -my_bool Jfile_Make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jfile_make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, more = 1024; if (args->arg_count < 2 || args->arg_count > 3) { - strcpy(message, "JsonMakeFile only accepts 2 or 3 arguments"); + strcpy(message, "jfile_make only accepts 2 or 3 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "JsonMakeFile first argument must be a json item"); + strcpy(message, "jfile_make first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument must be a (string) file name"); @@ -3052,9 +3056,9 @@ my_bool Jfile_Make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Jfile_Make_init +} // end of jfile_make_init -char *Jfile_Make(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { char *str, *fn, *msg; @@ -3101,25 +3105,25 @@ char *Jfile_Make(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Jfile_Make +} // end of jfile_make -void Jfile_Make_deinit(UDF_INIT* initid) +void jfile_make_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jfile_Make_deinit +} // end of jfile_make_deinit /*********************************************************************************/ /* Make and return a binary Json array containing all the parameters. */ /*********************************************************************************/ -my_bool Jbin_Array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Jbin_Array_init +} // end of jbin_array_init -char *Jbin_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_array(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3146,33 +3150,33 @@ char *Jbin_Array(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Array +} // end of jbin_array -void Jbin_Array_deinit(UDF_INIT* initid) +void jbin_array_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Array_deinit +} // end of jbin_array_deinit /*********************************************************************************/ /* Add one or several values to a Json array. */ /*********************************************************************************/ -my_bool Jbin_Array_Add_Values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_array_add_values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Jbin_Array_Add must have at least 2 arguments"); + strcpy(message, "jbin_array_add_values must have at least 2 arguments"); return true; } else if (IsJson(args, 0) != 1) { - strcpy(message, "Jbin_Array_Add first argument must be a json string"); + strcpy(message, "jbin_array_add_values first argument must be a json string"); return true; } else CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Jbin_Array_Add_Values_init +} // end of jbin_array_add_values_init -char *Jbin_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3206,33 +3210,33 @@ char *Jbin_Array_Add_Values(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Array_Add_Values +} // end of jbin_array_add_values -void Jbin_Array_Add_Values_deinit(UDF_INIT* initid) +void jbin_array_add_values_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Array_Add_Values_deinit +} // end of jbin_array_add_values_deinit /*********************************************************************************/ /* Add one value to a Json array. */ /*********************************************************************************/ -my_bool Jbin_Array_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Jbin_Array_Add must have at least 2 arguments"); + strcpy(message, "jbin_array_add must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Jbin_Array_Add first argument must be a json item"); + strcpy(message, "jbin_array_add first argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Jbin_Array_Add_init +} // end of jbin_array_add_init -char *Jbin_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { int n = 2; @@ -3286,36 +3290,36 @@ char *Jbin_Array_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Array_Add +} // end of jbin_array_add -void Jbin_Array_Add_deinit(UDF_INIT* initid) +void jbin_array_add_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Array_Add_deinit +} // end of jbin_array_add_deinit /*********************************************************************************/ /* Delete a value from a Json array. */ /*********************************************************************************/ -my_bool Jbin_Array_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Jbin_Array_Delete must have at lest 2 arguments"); + strcpy(message, "jbin_array_delete must have at lest 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Jbin_Array_Delete first argument must be a json item"); + strcpy(message, "jbin_array_delete first argument must be a json item"); return true; } else if (args->arg_type[1] != INT_RESULT) { - strcpy(message, "Jbin_Array_Delete second argument is not an integer (index)"); + strcpy(message, "jbin_array_delete second argument is not an integer (index)"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Jbin_Array_Delete_init +} // end of jbin_array_delete_init -char *Jbin_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { PJSON top = NULL; @@ -3358,25 +3362,25 @@ char *Jbin_Array_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Array_Delete +} // end of jbin_array_delete -void Jbin_Array_Delete_deinit(UDF_INIT* initid) +void jbin_array_delete_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Array_Delete_deinit +} // end of jbin_array_delete_deinit /*********************************************************************************/ /* Make a Json Oject containing all the parameters. */ /*********************************************************************************/ -my_bool Jbin_Object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Jbin_Object_init +} // end of jbin_object_init -char *Jbin_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_object(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3402,25 +3406,25 @@ char *Jbin_Object(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Object +} // end of jbin_object -void Jbin_Object_deinit(UDF_INIT* initid) +void jbin_object_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Object_deinit +} // end of jbin_object_deinit /*********************************************************************************/ /* Make a Json Oject containing all not null parameters. */ /*********************************************************************************/ -my_bool Jbin_Object_Nonull_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_object_nonull_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; CalcLen(args, true, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Jbin_Object_Nonull_init +} // end of jbin_object_nonull_init -char *Jbin_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_object_nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3448,33 +3452,33 @@ char *Jbin_Object_Nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Object_Nonull +} // end of jbin_object_nonull -void Jbin_Object_Nonull_deinit(UDF_INIT* initid) +void jbin_object_nonull_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Object_nonull_deinit +} // end of jbin_object_nonull_deinit /*********************************************************************************/ /* Add or replace a value in a Json Object. */ /*********************************************************************************/ -my_bool Jbin_Object_Add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Jbin_Object_Add must have at least 2 arguments"); + strcpy(message, "jbin_object_add must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Jbin_Object_Add first argument must be a json item"); + strcpy(message, "jbin_object_add first argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Jbin_Object_Add_init +} // end of jbin_object_add_init -char *Jbin_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { PJSON top = NULL; @@ -3518,36 +3522,36 @@ char *Jbin_Object_Add(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Object_Add +} // end of jbin_object_add -void Jbin_Object_Add_deinit(UDF_INIT* initid) +void jbin_object_add_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Object_Add_deinit +} // end of jbin_object_add_deinit /*********************************************************************************/ /* Delete a value from a Json object. */ /*********************************************************************************/ -my_bool Jbin_Object_Delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_object_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Jbin_Object_Delete must have 2 or 3 arguments"); + strcpy(message, "jbin_object_delete must have 2 or 3 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Jbin_Object_Delete first argument must be a json item"); + strcpy(message, "jbin_object_delete first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { - strcpy(message, "Jbin_Object_Delete second argument must be a key string"); + strcpy(message, "jbin_object_delete second argument must be a key string"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Jbin_Object_Delete_init +} // end of jbin_object_delete_init -char *Jbin_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { PJSON top = NULL; @@ -3590,33 +3594,33 @@ char *Jbin_Object_Delete(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Object_Delete +} // end of jbin_object_delete -void Jbin_Object_Delete_deinit(UDF_INIT* initid) +void jbin_object_delete_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Object_Delete_deinit +} // end of jbin_object_delete_deinit /*********************************************************************************/ /* Returns an array of the Json object keys. */ /*********************************************************************************/ -my_bool Jbin_Object_List_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_object_list_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count != 1) { - strcpy(message, "Jbin_Object_List must have 1 arguments"); + strcpy(message, "jbin_object_list must have 1 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Jbin_Object_List argument must be a json item"); + strcpy(message, "jbin_object_list argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Jbin_Object_List_init +} // end of jbin_object_list_init -char *Jbin_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { PJAR jarp = NULL; @@ -3647,26 +3651,26 @@ char *Jbin_Object_List(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Object_List +} // end of jbin_object_list -void Jbin_Object_List_deinit(UDF_INIT* initid) +void jbin_object_list_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Object_List_deinit +} // end of jbin_object_list_deinit /*********************************************************************************/ /* Get a Json item from a Json document. */ /*********************************************************************************/ -my_bool Jbin_Get_Item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; int n = IsJson(args, 0); if (args->arg_count < 2) { - strcpy(message, "Jbin_Get_Item must have at least 2 arguments"); + strcpy(message, "jbin_get_item must have at least 2 arguments"); return true; } else if (!n && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "Jbin_Get_Item first argument must be a json item"); + strcpy(message, "jbin_get_item first argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a string (jpath)"); @@ -3686,9 +3690,9 @@ my_bool Jbin_Get_Item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) memlen += args->lengths[0] * 3; return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Jbin_Get_Item_init +} // end of jbin_get_item_init -char *Jbin_Get_Item(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3728,7 +3732,7 @@ char *Jbin_Get_Item(UDF_INIT *initid, UDF_ARGS *args, char *result, jsp = (PJSON)g->Xchk; path = MakePSZ(g, args, 1); - jsx = new(g)JSNX(g, jsp, TYPE_STRING, initid->max_length); + jsx = new(g) JSNX(g, jsp, TYPE_STRING, initid->max_length); if (jsx->SetJpath(g, path, true)) { PUSH_WARNING(g->Message); @@ -3758,36 +3762,36 @@ fin: *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Get_Item +} // end of jbin_get_item -void Jbin_Get_Item_deinit(UDF_INIT* initid) +void jbin_get_item_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Get_Item_deinit +} // end of jbin_get_item_deinit /*********************************************************************************/ /* Merge two arrays or objects. */ /*********************************************************************************/ -my_bool Jbin_Item_Merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_item_merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "Jbin_Item_Merge must have at least 2 arguments"); + strcpy(message, "jbin_item_merge must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "Jbin_Item_Merge first argument must be a json item"); + strcpy(message, "jbin_item_merge first argument must be a json item"); return true; } else if (!IsJson(args, 1)) { - strcpy(message, "Jbin_Item_Merge second argument must be a json item"); + strcpy(message, "jbin_item_merge second argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); return JsonInit(initid, args, message, true, reslen, memlen); -} // end of Jbin_Item_Merge_init +} // end of jbin_item_merge_init -char *Jbin_Item_Merge(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *error) { PJSON top = NULL; @@ -3835,25 +3839,25 @@ char *Jbin_Item_Merge(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_Item_Merge +} // end of jbin_item_merge -void Jbin_Item_Merge_deinit(UDF_INIT* initid) +void jbin_item_merge_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_Item_Merge_deinit +} // end of jbin_item_merge_deinit /*********************************************************************************/ /* Returns a json file as a json item. */ /*********************************************************************************/ -my_bool Jbin_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool jbin_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, fl, more = 1024; if (args->arg_count < 1 || args->arg_count > 3) { - strcpy(message, "Jbin_File only accepts 1 to 3 arguments"); + strcpy(message, "jbin_file only accepts 1 to 3 arguments"); return true; } else if (args->arg_type[0] != STRING_RESULT || !args->args[0]) { - strcpy(message, "Jbin_File first argument must be a constant string (file name)"); + strcpy(message, "jbin_file first argument must be a constant string (file name)"); return true; } else if (args->arg_count > 1 && args->arg_type[1] != INT_RESULT) { strcpy(message, "Second argument is not an integer (pretty)"); @@ -3873,9 +3877,9 @@ my_bool Jbin_File_init(UDF_INIT *initid, UDF_ARGS *args, char *message) more += fl * M; memlen += more; return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Jbin_File_init +} // end of jbin_file_init -char *Jbin_File(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *jbin_file(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { char *fn, *memory; @@ -3967,33 +3971,33 @@ fin: *res_length = sizeof(BSON); return (char*)bsp; -} // end of Jbin_File +} // end of jbin_file -void Jbin_File_deinit(UDF_INIT* initid) +void jbin_file_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Jbin_File_deinit +} // end of jbin_file_deinit /*********************************************************************************/ /* Serialize a Json document. . */ /*********************************************************************************/ -my_bool Json_Serialize_init(UDF_INIT *initid, UDF_ARGS *args, char *message) +my_bool json_serialize_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen; if (args->arg_count != 1) { - strcpy(message, "Json_Serialize must have 1 argument"); + strcpy(message, "json_serialize must have 1 argument"); return true; } else if (IsJson(args, 0) != 3) { - strcpy(message, "Json_Serialize argument must be a Jbin tree"); + strcpy(message, "json_serialize argument must be a Jbin tree"); return true; } else CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, false, reslen, memlen); -} // end of Json_Serialize_init +} // end of json_serialize_init -char *Json_Serialize(UDF_INIT *initid, UDF_ARGS *args, char *result, +char *json_serialize(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *, char *) { char *str; @@ -4014,9 +4018,9 @@ char *Json_Serialize(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = strlen(str); return str; -} // end of Json_Serialize +} // end of json_serialize -void Json_Serialize_deinit(UDF_INIT* initid) +void json_serialize_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); -} // end of Json_Serialize_deinit +} // end of json_serialize_deinit diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index c7eba1375d2..f9892109bc5 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -33,145 +33,145 @@ typedef class JOUTPATH *PJTP; typedef class JOUTALL *PJTA; extern "C" { - DllExport my_bool JsonValue_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *JsonValue(UDF_EXEC_ARGS); - DllExport void JsonValue_deinit(UDF_INIT*); + DllExport my_bool jsonvalue_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jsonvalue(UDF_EXEC_ARGS); + DllExport void jsonvalue_deinit(UDF_INIT*); - DllExport my_bool Json_Array_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Array(UDF_EXEC_ARGS); - DllExport void Json_Array_deinit(UDF_INIT*); + DllExport my_bool json_array_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_array(UDF_EXEC_ARGS); + DllExport void json_array_deinit(UDF_INIT*); - DllExport my_bool Json_Array_Add_Values_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Array_Add_Values(UDF_EXEC_ARGS); - DllExport void Json_Array_Add_Values_deinit(UDF_INIT*); + DllExport my_bool json_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_array_add_values(UDF_EXEC_ARGS); + DllExport void json_array_add_values_deinit(UDF_INIT*); - DllExport my_bool Json_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Array_Add(UDF_EXEC_ARGS); - DllExport void Json_Array_Add_deinit(UDF_INIT*); + DllExport my_bool json_array_add_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_array_add(UDF_EXEC_ARGS); + DllExport void json_array_add_deinit(UDF_INIT*); - DllExport my_bool Json_Array_Delete_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Array_Delete(UDF_EXEC_ARGS); - DllExport void Json_Array_Delete_deinit(UDF_INIT*); + DllExport my_bool json_array_delete_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_array_delete(UDF_EXEC_ARGS); + DllExport void json_array_delete_deinit(UDF_INIT*); - DllExport my_bool Json_Object_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Object(UDF_EXEC_ARGS); - DllExport void Json_Object_deinit(UDF_INIT*); + DllExport my_bool json_object_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_object(UDF_EXEC_ARGS); + DllExport void json_object_deinit(UDF_INIT*); - DllExport my_bool Json_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Object_Nonull(UDF_EXEC_ARGS); - DllExport void Json_Object_Nonull_deinit(UDF_INIT*); + DllExport my_bool json_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_object_nonull(UDF_EXEC_ARGS); + DllExport void json_object_nonull_deinit(UDF_INIT*); - DllExport my_bool Json_Object_Add_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Object_Add(UDF_EXEC_ARGS); - DllExport void Json_Object_Add_deinit(UDF_INIT*); + DllExport my_bool json_object_add_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_object_add(UDF_EXEC_ARGS); + DllExport void json_object_add_deinit(UDF_INIT*); - DllExport my_bool Json_Object_Delete_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Object_Delete(UDF_EXEC_ARGS); - DllExport void Json_Object_Delete_deinit(UDF_INIT*); + DllExport my_bool json_object_delete_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_object_delete(UDF_EXEC_ARGS); + DllExport void json_object_delete_deinit(UDF_INIT*); - DllExport my_bool Json_Object_List_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Object_List(UDF_EXEC_ARGS); - DllExport void Json_Object_List_deinit(UDF_INIT*); + DllExport my_bool json_object_list_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_object_list(UDF_EXEC_ARGS); + DllExport void json_object_list_deinit(UDF_INIT*); - DllExport my_bool Json_Array_Grp_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport void Json_Array_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); - DllExport char *Json_Array_Grp(UDF_EXEC_ARGS); - DllExport void Json_Array_Grp_clear(UDF_INIT *, char *, char *); - DllExport void Json_Array_Grp_deinit(UDF_INIT*); + DllExport my_bool json_array_grp_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport void json_array_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport char *json_array_grp(UDF_EXEC_ARGS); + DllExport void json_array_grp_clear(UDF_INIT *, char *, char *); + DllExport void json_array_grp_deinit(UDF_INIT*); - DllExport my_bool Json_Object_Grp_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport void Json_Object_Grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); - DllExport char *Json_Object_Grp(UDF_EXEC_ARGS); - DllExport void Json_Object_Grp_clear(UDF_INIT *, char *, char *); - DllExport void Json_Object_Grp_deinit(UDF_INIT*); + DllExport my_bool json_object_grp_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport void json_object_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport char *json_object_grp(UDF_EXEC_ARGS); + DllExport void json_object_grp_clear(UDF_INIT *, char *, char *); + DllExport void json_object_grp_deinit(UDF_INIT*); - DllExport my_bool Json_Get_Item_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Get_Item(UDF_EXEC_ARGS); - DllExport void Json_Get_Item_deinit(UDF_INIT*); + DllExport my_bool json_get_item_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_get_item(UDF_EXEC_ARGS); + DllExport void json_get_item_deinit(UDF_INIT*); - DllExport my_bool Json_Item_Merge_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Item_Merge(UDF_EXEC_ARGS); - DllExport void Json_Item_Merge_deinit(UDF_INIT*); + DllExport my_bool json_item_merge_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_item_merge(UDF_EXEC_ARGS); + DllExport void json_item_merge_deinit(UDF_INIT*); - DllExport my_bool JsonGetString_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *JsonGetString(UDF_EXEC_ARGS); - DllExport void JsonGetString_deinit(UDF_INIT*); + DllExport my_bool jsonget_string_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jsonget_string(UDF_EXEC_ARGS); + DllExport void jsonget_string_deinit(UDF_INIT*); - DllExport my_bool JsonGetInt_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long JsonGetInt(UDF_INIT*, UDF_ARGS*, char*, char*); - DllExport void JsonGetInt_deinit(UDF_INIT*); + DllExport my_bool jsonget_int_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport long long jsonget_int(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport void jsonget_int_deinit(UDF_INIT*); - DllExport my_bool JsonGetReal_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport double JsonGetReal(UDF_INIT*, UDF_ARGS*, char*, char*); - DllExport void JsonGetReal_deinit(UDF_INIT*); + DllExport my_bool jsonget_real_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport double jsonget_real(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport void jsonget_real_deinit(UDF_INIT*); - DllExport my_bool JsonLocate_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *JsonLocate(UDF_EXEC_ARGS); - DllExport void JsonLocate_deinit(UDF_INIT*); + DllExport my_bool jsonlocate_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jsonlocate(UDF_EXEC_ARGS); + DllExport void jsonlocate_deinit(UDF_INIT*); - DllExport my_bool Json_Locate_All_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Locate_All(UDF_EXEC_ARGS); - DllExport void Json_Locate_All_deinit(UDF_INIT*); + DllExport my_bool json_locate_all_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_locate_all(UDF_EXEC_ARGS); + DllExport void json_locate_all_deinit(UDF_INIT*); - DllExport my_bool Json_File_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_File(UDF_EXEC_ARGS); - DllExport void Json_File_deinit(UDF_INIT*); + DllExport my_bool json_file_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_file(UDF_EXEC_ARGS); + DllExport void json_file_deinit(UDF_INIT*); - DllExport my_bool Jfile_Make_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jfile_Make(UDF_EXEC_ARGS); - DllExport void Jfile_Make_deinit(UDF_INIT*); + DllExport my_bool jfile_make_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jfile_make(UDF_EXEC_ARGS); + DllExport void jfile_make_deinit(UDF_INIT*); - DllExport my_bool Jbin_Array_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Array(UDF_EXEC_ARGS); - DllExport void Jbin_Array_deinit(UDF_INIT*); + DllExport my_bool jbin_array_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_array(UDF_EXEC_ARGS); + DllExport void jbin_array_deinit(UDF_INIT*); - DllExport my_bool Jbin_Array_Add_Values_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Array_Add_Values(UDF_EXEC_ARGS); - DllExport void Jbin_Array_Add_Values_deinit(UDF_INIT*); + DllExport my_bool jbin_array_add_values_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_array_add_values(UDF_EXEC_ARGS); + DllExport void jbin_array_add_values_deinit(UDF_INIT*); - DllExport my_bool Jbin_Array_Add_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Array_Add(UDF_EXEC_ARGS); - DllExport void Jbin_Array_Add_deinit(UDF_INIT*); + DllExport my_bool jbin_array_add_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_array_add(UDF_EXEC_ARGS); + DllExport void jbin_array_add_deinit(UDF_INIT*); - DllExport my_bool Jbin_Array_Delete_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Array_Delete(UDF_EXEC_ARGS); - DllExport void Jbin_Array_Delete_deinit(UDF_INIT*); + DllExport my_bool jbin_array_delete_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_array_delete(UDF_EXEC_ARGS); + DllExport void jbin_array_delete_deinit(UDF_INIT*); - DllExport my_bool Jbin_Object_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Object(UDF_EXEC_ARGS); - DllExport void Jbin_Object_deinit(UDF_INIT*); + DllExport my_bool jbin_object_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_object(UDF_EXEC_ARGS); + DllExport void jbin_object_deinit(UDF_INIT*); - DllExport my_bool Jbin_Object_Nonull_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Object_Nonull(UDF_EXEC_ARGS); - DllExport void Jbin_Object_Nonull_deinit(UDF_INIT*); + DllExport my_bool jbin_object_nonull_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_object_nonull(UDF_EXEC_ARGS); + DllExport void jbin_object_nonull_deinit(UDF_INIT*); - DllExport my_bool Jbin_Object_Add_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Object_Add(UDF_EXEC_ARGS); - DllExport void Jbin_Object_Add_deinit(UDF_INIT*); + DllExport my_bool jbin_object_add_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_object_add(UDF_EXEC_ARGS); + DllExport void jbin_object_add_deinit(UDF_INIT*); - DllExport my_bool Jbin_Object_Delete_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Object_Delete(UDF_EXEC_ARGS); - DllExport void Jbin_Object_Delete_deinit(UDF_INIT*); + DllExport my_bool jbin_object_delete_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_object_delete(UDF_EXEC_ARGS); + DllExport void jbin_object_delete_deinit(UDF_INIT*); - DllExport my_bool Jbin_Object_List_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Object_List(UDF_EXEC_ARGS); - DllExport void Jbin_Object_List_deinit(UDF_INIT*); + DllExport my_bool jbin_object_list_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_object_list(UDF_EXEC_ARGS); + DllExport void jbin_object_list_deinit(UDF_INIT*); - DllExport my_bool Jbin_Get_Item_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Get_Item(UDF_EXEC_ARGS); - DllExport void Jbin_Get_Item_deinit(UDF_INIT*); + DllExport my_bool jbin_get_item_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_get_item(UDF_EXEC_ARGS); + DllExport void jbin_get_item_deinit(UDF_INIT*); - DllExport my_bool Jbin_Item_Merge_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_Item_Merge(UDF_EXEC_ARGS); - DllExport void Jbin_Item_Merge_deinit(UDF_INIT*); + DllExport my_bool jbin_item_merge_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_item_merge(UDF_EXEC_ARGS); + DllExport void jbin_item_merge_deinit(UDF_INIT*); - DllExport my_bool Jbin_File_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Jbin_File(UDF_EXEC_ARGS); - DllExport void Jbin_File_deinit(UDF_INIT*); + DllExport my_bool jbin_file_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *jbin_file(UDF_EXEC_ARGS); + DllExport void jbin_file_deinit(UDF_INIT*); - DllExport my_bool Json_Serialize_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *Json_Serialize(UDF_EXEC_ARGS); - DllExport void Json_Serialize_deinit(UDF_INIT*); + DllExport my_bool json_serialize_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_serialize(UDF_EXEC_ARGS); + DllExport void json_serialize_deinit(UDF_INIT*); } // extern "C" /*********************************************************************************/ diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result index f130d7b5f04..6482e0b53b3 100644 --- a/storage/connect/mysql-test/connect/r/json_udf.result +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -14,14 +14,14 @@ SELECT Json_Array(56,3.1416,'My name is "Foo"',NULL); Json_Array(56,3.1416,'My name is "Foo"',NULL) [56,3.141600,"My name is \"Foo\"",null] SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL)) Array; -ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add must have at least 2 arguments +ERROR HY000: Can't initialize function 'json_array_add'; json_array_add must have at least 2 arguments SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; Array [56,3.141600,"foo",null,"One more"] SELECT Json_Array_Add(JsonValue('one value'),'One more'); -ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add first argument must be a json item +ERROR HY000: Can't initialize function 'json_array_add'; json_array_add first argument must be a json item SELECT Json_Array_Add('one value','One more'); -ERROR HY000: Can't initialize function 'Json_Array_Add'; Json_Array_Add first argument must be a json item +ERROR HY000: Can't initialize function 'json_array_add'; json_array_add first argument must be a json item SELECT Json_Array_Add('one value' json_,'One more'); Json_Array_Add('one value' json_,'One more') NULL @@ -30,7 +30,7 @@ Warning 1105 Error 2 opening one value Warning 1105 Void JSON object Warning 1105 First argument is not an array SELECT JsonValue(56,3.1416,'foo',NULL); -ERROR HY000: Can't initialize function 'JsonValue'; JsonValue cannot accept more than 1 argument +ERROR HY000: Can't initialize function 'jsonvalue'; jsonvalue cannot accept more than 1 argument SELECT JsonValue(3.1416); JsonValue(3.1416) 3.141600 @@ -79,7 +79,7 @@ Json_Object(AUTHOR, TITLE, DATEPUB) {"AUTHOR":"Jean-Christophe Bernadac","TITLE":"Construire une application XML","DATEPUB":1999} {"AUTHOR":"William J. Pardi","TITLE":"XML en Action","DATEPUB":1999} SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t1; -ERROR HY000: Can't initialize function 'Json_Array_Grp'; Json_Array_Grp can only accept 1 argument +ERROR HY000: Can't initialize function 'json_array_grp'; json_array_grp can only accept 1 argument SELECT Json_Array_Grp(TITLE) FROM t1; Json_Array_Grp(TITLE) ["Construire une application XML","XML en Action"] @@ -145,7 +145,7 @@ Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY {"DEPARTMENT":"2452","TITLE":"SCIENTIST","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","SALARY":8000.000000},{"SERIALNO":"36666","NAME":"BIGHORN","SALARY":11000.000000}]} {"DEPARTMENT":"2452","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"11111","NAME":"CHERRY","SALARY":4500.000000}]} SELECT Json_Object_Grp(SALARY) FROM t1; -ERROR HY000: Can't initialize function 'Json_Object_Grp'; Json_Object_Grp can only accept 2 arguments +ERROR HY000: Can't initialize function 'json_object_grp'; json_object_grp can only accept 2 arguments SELECT Json_Object_Grp(SALARY, NAME) FROM t1; Json_Object_Grp(SALARY, NAME) {"BANCROFT":9600.000000,"SMITH":9000.000000,"MERCHANT":8700.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"BIGHEAD":8000.000000,"SHRINKY":7500.000000,"WALTER":7400.000000,"FODDERMAN":7000.000000,"TONGHO":6800.000000,"SHORTSIGHT":5500.000000,"MESSIFUL":5000.500000,"HONEY":4900.000000,"GOOSEPEN":4700.000000,"CHERRY":4500.000000,"MONAPENNY":3800.000000,"KITTY":3000.450000,"PLUMHEAD":2800.000000,"STRONG":23000.000000,"BULLOZER":14800.000000,"WERTHER":14500.000000,"QUINN":14000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"BROWNY":10500.000000,"WHEELFOR":10030.000000,"MARTIN":10000.000000} diff --git a/storage/connect/mysql-test/connect/t/json_udf.inc b/storage/connect/mysql-test/connect/t/json_udf.inc index 0a47d4b690b..a79fced6392 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.inc +++ b/storage/connect/mysql-test/connect/t/json_udf.inc @@ -9,13 +9,13 @@ if (!$HA_CONNECT_SO) { --skip Needs a dynamically built ha_connect.so } -CREATE FUNCTION Json_Array RETURNS STRING SONAME 'ha_connect'; -CREATE FUNCTION Json_Array_Add RETURNS STRING SONAME 'ha_connect'; -CREATE FUNCTION Json_Object RETURNS STRING SONAME 'ha_connect'; -CREATE FUNCTION Json_Object_Nonull RETURNS STRING SONAME 'ha_connect'; -CREATE FUNCTION JsonValue RETURNS STRING SONAME 'ha_connect'; -CREATE AGGREGATE FUNCTION Json_Array_Grp RETURNS STRING SONAME 'ha_connect'; -CREATE AGGREGATE FUNCTION Json_Object_Grp RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_array RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_array_add RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_object RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_object_nonull RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jsonvalue RETURNS STRING SONAME 'ha_connect'; +CREATE AGGREGATE FUNCTION json_array_grp RETURNS STRING SONAME 'ha_connect'; +CREATE AGGREGATE FUNCTION json_object_grp RETURNS STRING SONAME 'ha_connect'; --enable_query_log diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 60471c9b0d8..ab4ed5f32a3 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -2440,6 +2440,7 @@ void DTVAL::SetTimeShift(void) } // end of SetTimeShift +#if defined(connect_EXPORTS) // Added by Alexander Barkov static void TIME_to_localtime(struct tm *tm, const MYSQL_TIME *ltime) { @@ -2461,6 +2462,9 @@ static struct tm *gmtime_mysql(const time_t *timep, struct tm *tm) TIME_to_localtime(tm, <ime); return tm; } // end of gmtime_mysql +#else +#define gmtime_mysql(T,B) gmtime((const time_t *)T) +#endif /***********************************************************************/ /* GetGmTime: returns a pointer to a static tm structure obtained */ @@ -2489,6 +2493,7 @@ struct tm *DTVAL::GetGmTime(struct tm *tm_buffer) return datm; } // end of GetGmTime +#if defined(connect_EXPORTS) // Added by Alexander Barkov static time_t mktime_mysql(struct tm *ptm) { @@ -2499,6 +2504,9 @@ static time_t mktime_mysql(struct tm *ptm) time_t t= TIME_to_timestamp(current_thd, <ime, &error_code); return error_code ? (time_t) -1 : t; } +#else +#define mktime_mysql mktime +#endif /***********************************************************************/ /* MakeTime: calculates a date value from a tm structures using the */ From 608ad38a0d124fac1f8ec09b9c6e2fa3229a6eac Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 4 Oct 2015 11:57:57 +0200 Subject: [PATCH 32/39] Temporary changes for making compile to work --- include/mysql/service_encryption.h | 2 ++ sql/sql_class.h | 1 + storage/connect/jsonudf.h | 8 ++++---- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/mysql/service_encryption.h b/include/mysql/service_encryption.h index eb1a6b0e629..be21af73481 100644 --- a/include/mysql/service_encryption.h +++ b/include/mysql/service_encryption.h @@ -31,7 +31,9 @@ extern "C" { #ifndef MYSQL_ABI_CHECK #ifdef _WIN32 #include +#ifndef __cplusplus #define inline __inline +#endif #else #include #endif diff --git a/sql/sql_class.h b/sql/sql_class.h index f12281657f5..d2bd0acea7a 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2630,6 +2630,7 @@ public: ulong query_plan_fsort_passes; pthread_t real_id; /* For debugging */ my_thread_id thread_id; + typedef ulong pid_t; pid_t os_thread_id; uint tmp_table, global_disable_checkpoint; uint server_status,open_options; diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index f9892109bc5..0903b789fb6 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -85,14 +85,14 @@ extern "C" { DllExport void json_object_grp_clear(UDF_INIT *, char *, char *); DllExport void json_object_grp_deinit(UDF_INIT*); - DllExport my_bool json_get_item_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport char *json_get_item(UDF_EXEC_ARGS); - DllExport void json_get_item_deinit(UDF_INIT*); - DllExport my_bool json_item_merge_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *json_item_merge(UDF_EXEC_ARGS); DllExport void json_item_merge_deinit(UDF_INIT*); + DllExport my_bool json_get_item_init(UDF_INIT*, UDF_ARGS*, char*); + DllExport char *json_get_item(UDF_EXEC_ARGS); + DllExport void json_get_item_deinit(UDF_INIT*); + DllExport my_bool jsonget_string_init(UDF_INIT*, UDF_ARGS*, char*); DllExport char *jsonget_string(UDF_EXEC_ARGS); DllExport void jsonget_string_deinit(UDF_INIT*); From 100be0b6ee9cbb905ad8443c4712dbdf990ab798 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sat, 17 Oct 2015 17:23:11 +0200 Subject: [PATCH 33/39] Update JSON UDFs to version 1.04.0004 modified: storage/connect/json.cpp modified: storage/connect/json.h modified: storage/connect/jsonudf.cpp modified: storage/connect/mysql-test/connect/r/json_udf.result modified: storage/connect/mysql-test/connect/std_data/biblio.json modified: storage/connect/mysql-test/connect/t/json_udf.inc modified: storage/connect/mysql-test/connect/t/json_udf.test modified: storage/connect/tabjson.cpp --- storage/connect/json.cpp | 169 ++-- storage/connect/json.h | 31 +- storage/connect/jsonudf.cpp | 951 +++++++++--------- .../mysql-test/connect/r/json_udf.result | 557 ++++++++-- .../mysql-test/connect/std_data/biblio.json | 10 +- .../connect/mysql-test/connect/t/json_udf.inc | 27 + .../mysql-test/connect/t/json_udf.test | 225 ++++- .../mysql-test/connect/t/json_udf2.inc | 39 + storage/connect/tabjson.cpp | 6 +- 9 files changed, 1361 insertions(+), 654 deletions(-) create mode 100644 storage/connect/mysql-test/connect/t/json_udf2.inc diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 5158b71086f..19947ab1899 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -33,10 +33,10 @@ /* Parse a json string. */ /* Note: when pretty is not known, the caller set pretty to 3. */ /***********************************************************************/ -PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) +PJSON ParseJson(PGLOBAL g, char *s, int len, int *ptyp, bool *comma) { - int i, rc; - bool b = false; + int i, rc, pretty = (ptyp) ? *ptyp : 3; + bool b = false, pty[3] = {true, true, true}; PJSON jsp = NULL; STRG src; @@ -49,6 +49,10 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) src.str = s; src.len = len; + // Trying to guess the pretty format + if (s[0] == '[' && (s[1] == '\n' || (s[1] == '\r' && s[2] == '\n'))) + pty[0] = false; + // Save stack and allocation environment and prepare error return if (g->jump_level == MAX_JUMP) { strcpy(g->Message, MSG(TOO_MANY_JUMPS)); @@ -62,26 +66,16 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) for (i = 0; i < len; i++) switch (s[i]) { case '[': - if (jsp) { - if (pretty && pretty < 3) { - strcpy(g->Message, "More than one item in file"); - goto err; - } else - goto tryit; - - } else if (!(jsp = ParseArray(g, ++i, src))) + if (jsp) + goto tryit; + else if (!(jsp = ParseArray(g, ++i, src, pty))) goto err; break; case '{': - if (jsp) { - if (pretty && pretty < 3) { - strcpy(g->Message, "More than one item in file"); - goto err; - } else - goto tryit; - - } else if (!(jsp = ParseObject(g, ++i, src))) + if (jsp) + goto tryit; + else if (!(jsp = ParseObject(g, ++i, src, pty))) goto err; break; @@ -91,10 +85,11 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) case '\r': break; case ',': - if (jsp && pretty == 1) { + if (jsp && (pretty == 1 || pretty == 3)) { if (comma) *comma = true; + pty[0] = pty[2] = false; break; } // endif pretty @@ -110,23 +105,39 @@ PJSON ParseJson(PGLOBAL g, char *s, int len, int pretty, bool *comma) } // endif b default: - if (!(jsp = ParseValue(g, i, src))) + if (jsp) + goto tryit; + else if (!(jsp = ParseValue(g, i, src, pty))) goto err; break; }; // endswitch s[i] - if (!jsp) - sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); + if (!jsp) + sprintf(g->Message, "Invalid Json string '%.*s'", 50, s); + else if (ptyp && pretty == 3) { + *ptyp = 3; // Not recognized pretty + + for (i = 0; i < 3; i++) + if (pty[i]) { + *ptyp = i; + break; + } // endif pty + + } // endif ptyp g->jump_level--; return jsp; tryit: - i = 0; - jsp = ParseArray(g, i, src); - g->jump_level--; - return jsp; + if (pty[0] && (!pretty || pretty > 2)) { + if ((jsp = ParseArray(g, (i = 0), src, pty)) && ptyp && pretty == 3) + *ptyp = (pty[0]) ? 0 : 3; + + g->jump_level--; + return jsp; + } else + strcpy(g->Message, "More than one item in file"); err: g->jump_level--; @@ -136,12 +147,12 @@ err: /***********************************************************************/ /* Parse a JSON Array. */ /***********************************************************************/ -PJAR ParseArray(PGLOBAL g, int& i, STRG& src) +PJAR ParseArray(PGLOBAL g, int& i, STRG& src, bool *pty) { char *s = src.str; int len = src.len; int level = 0; - bool pty = (!i); + bool b = (!i); PJAR jarp = new(g) JARRAY; PJVAL jvp = NULL; @@ -163,29 +174,31 @@ PJAR ParseArray(PGLOBAL g, int& i, STRG& src) jarp->InitArray(g); return jarp; - case ' ': + case '\n': + if (!b) + pty[0] = pty[1] = false; + case '\r': + case ' ': case '\t': - case '\n': - case '\r': break; default: if (level == 2) { sprintf(g->Message, "Unexpected value near %.*s", ARGS); return NULL; - } else if ((jvp = ParseValue(g, i, src))) + } else if ((jvp = ParseValue(g, i, src, pty))) jarp->AddValue(g, jvp); else return NULL; - level = (pty) ? 1 : 2; + level = (b) ? 1 : 2; break; }; // endswitch s[i] - if (pty) { + if (b) { // Case of Pretty == 0 jarp->InitArray(g); return jarp; - } // endif pty + } // endif b strcpy(g->Message, "Unexpected EOF in array"); return NULL; @@ -194,7 +207,7 @@ PJAR ParseArray(PGLOBAL g, int& i, STRG& src) /***********************************************************************/ /* Parse a JSON Object. */ /***********************************************************************/ -PJOB ParseObject(PGLOBAL g, int& i, STRG& src) +PJOB ParseObject(PGLOBAL g, int& i, STRG& src, bool *pty) { PSZ key; char *s = src.str; @@ -221,7 +234,7 @@ PJOB ParseObject(PGLOBAL g, int& i, STRG& src) break; case ':': if (level == 1) { - if (!(jpp->Val = ParseValue(g, ++i, src))) + if (!(jpp->Val = ParseValue(g, ++i, src, pty))) return NULL; level = 2; @@ -246,10 +259,11 @@ PJOB ParseObject(PGLOBAL g, int& i, STRG& src) } // endif level return jobp; - case ' ': + case '\n': + pty[0] = pty[1] = false; + case '\r': + case ' ': case '\t': - case '\n': - case '\r': break; default: sprintf(g->Message, "Unexpected character '%c' near %.*s", @@ -264,7 +278,7 @@ PJOB ParseObject(PGLOBAL g, int& i, STRG& src) /***********************************************************************/ /* Parse a JSON Value. */ /***********************************************************************/ -PJVAL ParseValue(PGLOBAL g, int& i, STRG& src) +PJVAL ParseValue(PGLOBAL g, int& i, STRG& src, bool *pty) { char *strval, *s = src.str; int n, len = src.len; @@ -272,10 +286,11 @@ PJVAL ParseValue(PGLOBAL g, int& i, STRG& src) for (; i < len; i++) switch (s[i]) { - case ' ': + case '\n': + pty[0] = pty[1] = false; + case '\r': + case ' ': case '\t': - case '\n': - case '\r': break; default: goto suite; @@ -284,12 +299,12 @@ PJVAL ParseValue(PGLOBAL g, int& i, STRG& src) suite: switch (s[i]) { case '[': - if (!(jvp->Jsp = ParseArray(g, ++i, src))) + if (!(jvp->Jsp = ParseArray(g, ++i, src, pty))) return NULL; break; case '{': - if (!(jvp->Jsp = ParseObject(g, ++i, src))) + if (!(jvp->Jsp = ParseObject(g, ++i, src, pty))) return NULL; break; @@ -497,9 +512,9 @@ PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src) valp = AllocateValue(g, &dv, TYPE_DOUBLE, nd); } else { - int iv = strtol(buf, NULL, 10); + long long iv = strtoll(buf, NULL, 10); - valp = AllocateValue(g, &iv, TYPE_INT); + valp = AllocateValue(g, &iv, TYPE_BIGINT); } // endif has i--; // Unstack following character @@ -543,18 +558,18 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty) jp = new(g)JOUTPRT(g, fs); } else { // Serialize to a flat file - jp = new(g)JOUTFILE(g, fs); - b = pretty == 1; + b = true; + jp = new(g)JOUTFILE(g, fs, pretty); } // endif's - } + } // endif's switch (jsp->GetType()) { case TYPE_JAR: err = SerializeArray(jp, (PJAR)jsp, b); break; case TYPE_JOB: - err = (b && jp->WriteChr('\t')); + err = ((b && jp->Prty()) && jp->WriteChr('\t')); err |= SerializeObject(jp, (PJOB)jsp); break; case TYPE_JVAL: @@ -565,7 +580,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty) } // endswitch Type if (fs) { - fputc('\n', fs); + fputs(EL, fs); fclose(fs); return (err) ? g->Message : NULL; } else if (!err) { @@ -590,29 +605,40 @@ bool SerializeArray(JOUT *js, PJAR jarp, bool b) { bool first = true; + if (b) { + if (js->Prty()) { + if (js->WriteChr('[')) + return true; + else if (js->Prty() == 1 && (js->WriteStr(EL) || js->WriteChr('\t'))) + return true; - if (js->WriteChr('[')) - return true; - else if (b && (js->WriteStr(EL) || js->WriteChr('\t'))) - return true; + } // endif Prty + + } else if (js->WriteChr('[')) + return true; for (int i = 0; i < jarp->size(); i++) { if (first) first = false; - else if (js->WriteChr(',')) - return true; - else if (b && (js->WriteStr(EL) || js->WriteChr('\t'))) + else if ((!b || js->Prty()) && js->WriteChr(',')) return true; + else if (b) { + if (js->Prty() < 2 && js->WriteStr(EL)) + return true; + else if (js->Prty() == 1 && js->WriteChr('\t')) + return true; + + } // endif b if (SerializeValue(js, jarp->GetValue(i))) return true; } // endfor i - if (b && js->WriteStr(EL)) + if (b && js->Prty() == 1 && js->WriteStr(EL)) return true; - return js->WriteChr(']'); + return ((!b || js->Prty()) && js->WriteChr(']')); } // end of SerializeArray /***********************************************************************/ @@ -672,8 +698,8 @@ bool SerializeValue(JOUT *js, PJVAL jvp) } // endswitch Type -strcpy(js->g->Message, "Unrecognized value"); -return true; + strcpy(js->g->Message, "Unrecognized value"); + return true; } // end of SerializeValue /* -------------------------- Class JOUTSTR -------------------------- */ @@ -1262,6 +1288,16 @@ PSZ JVALUE::GetText(PGLOBAL g, PSZ text) void JVALUE::SetInteger(PGLOBAL g, int n) { Value = AllocateValue(g, &n, TYPE_INT); + Jsp = NULL; +} // end of SetInteger + +/***********************************************************************/ +/* Set the Value's Boolean value as a tiny integer. */ +/***********************************************************************/ +void JVALUE::SetTiny(PGLOBAL g, char n) +{ + Value = AllocateValue(g, &n, TYPE_TINY); + Jsp = NULL; } // end of SetInteger /***********************************************************************/ @@ -1270,6 +1306,7 @@ void JVALUE::SetInteger(PGLOBAL g, int n) void JVALUE::SetBigint(PGLOBAL g, long long ll) { Value = AllocateValue(g, &ll, TYPE_BIGINT); + Jsp = NULL; } // end of SetBigint /***********************************************************************/ @@ -1278,6 +1315,7 @@ void JVALUE::SetBigint(PGLOBAL g, long long ll) void JVALUE::SetFloat(PGLOBAL g, double f) { Value = AllocateValue(g, &f, TYPE_DOUBLE, 6); + Jsp = NULL; } // end of SetFloat /***********************************************************************/ @@ -1286,6 +1324,7 @@ void JVALUE::SetFloat(PGLOBAL g, double f) void JVALUE::SetString(PGLOBAL g, PSZ s, short c) { Value = AllocateValue(g, s, TYPE_STRING, c); + Jsp = NULL; } // end of SetString /***********************************************************************/ diff --git a/storage/connect/json.h b/storage/connect/json.h index bc0ef4e861b..d2ebc25123d 100644 --- a/storage/connect/json.h +++ b/storage/connect/json.h @@ -41,10 +41,10 @@ typedef struct { int len; } STRG, *PSG; -PJSON ParseJson(PGLOBAL g, char *s, int n, int prty = 2, bool *b = NULL); -PJAR ParseArray(PGLOBAL g, int& i, STRG& src); -PJOB ParseObject(PGLOBAL g, int& i, STRG& src); -PJVAL ParseValue(PGLOBAL g, int& i, STRG& src); +PJSON ParseJson(PGLOBAL g, char *s, int n, int *prty = NULL, bool *b = NULL); +PJAR ParseArray(PGLOBAL g, int& i, STRG& src, bool *pty); +PJOB ParseObject(PGLOBAL g, int& i, STRG& src, bool *pty); +PJVAL ParseValue(PGLOBAL g, int& i, STRG& src, bool *pty); char *ParseString(PGLOBAL g, int& i, STRG& src); PVAL ParseNumeric(PGLOBAL g, int& i, STRG& src); PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty); @@ -57,14 +57,16 @@ bool SerializeValue(JOUT *js, PJVAL jvp); /***********************************************************************/ class JOUT : public BLOCK { public: - JOUT(PGLOBAL gp) : BLOCK() {g = gp;} + JOUT(PGLOBAL gp) : BLOCK() {g = gp; Pretty = 3;} virtual bool WriteStr(const char *s) = 0; virtual bool WriteChr(const char c) = 0; virtual bool Escape(const char *s) = 0; + int Prty(void) {return Pretty;} // Member PGLOBAL g; + int Pretty; }; // end of class JOUT /***********************************************************************/ @@ -89,7 +91,7 @@ class JOUTSTR : public JOUT { /***********************************************************************/ class JOUTFILE : public JOUT { public: - JOUTFILE(PGLOBAL g, FILE *str) : JOUT(g) {Stream = str;} + JOUTFILE(PGLOBAL g, FILE *str, int pty) : JOUT(g) {Stream = str; Pretty = pty;} virtual bool WriteStr(const char *s); virtual bool WriteChr(const char c); @@ -104,7 +106,7 @@ class JOUTFILE : public JOUT { /***********************************************************************/ class JOUTPRT : public JOUTFILE { public: - JOUTPRT(PGLOBAL g, FILE *str) : JOUTFILE(g, str) {M = 0; B = false;} + JOUTPRT(PGLOBAL g, FILE *str) : JOUTFILE(g, str, 2) {M = 0; B = false;} virtual bool WriteStr(const char *s); virtual bool WriteChr(const char c); @@ -120,7 +122,7 @@ class JOUTPRT : public JOUTFILE { class JPAIR : public BLOCK { friend class JOBJECT; friend class JSNX; - friend PJOB ParseObject(PGLOBAL, int&, STRG&); + friend PJOB ParseObject(PGLOBAL, int&, STRG&, bool*); friend bool SerializeObject(JOUT *, PJOB); public: JPAIR(PSZ key) : BLOCK() {Key = key; Val = NULL; Next = NULL;} @@ -182,7 +184,7 @@ class JSON : public BLOCK { /* Class JOBJECT: contains a list of value pairs. */ /***********************************************************************/ class JOBJECT : public JSON { - friend PJOB ParseObject(PGLOBAL, int&, STRG&); + friend PJOB ParseObject(PGLOBAL, int&, STRG&, bool*); friend bool SerializeObject(JOUT *, PJOB); friend class JSNX; public: @@ -212,7 +214,7 @@ class JOBJECT : public JSON { /* Class JARRAY. */ /***********************************************************************/ class JARRAY : public JSON { - friend PJAR ParseArray(PGLOBAL, int&, STRG&); + friend PJAR ParseArray(PGLOBAL, int&, STRG&, bool*); public: JARRAY(void) : JSON() {Alloc = 0; First = Last = NULL; Mvals = NULL;} @@ -243,7 +245,7 @@ class JARRAY : public JSON { class JVALUE : public JSON { friend class JARRAY; friend class JSNX; - friend PJVAL ParseValue(PGLOBAL, int&, STRG&); + friend PJVAL ParseValue(PGLOBAL, int&, STRG&, bool*); friend bool SerializeValue(JOUT *, PJVAL); public: JVALUE(void) : JSON() @@ -269,13 +271,14 @@ class JVALUE : public JSON { virtual double GetFloat(void); virtual PSZ GetString(void); virtual PSZ GetText(PGLOBAL g, PSZ text); - virtual void SetValue(PVAL valp) {Value = valp;} - virtual void SetValue(PJSON jsp) {Jsp = jsp;} + virtual void SetValue(PVAL valp) {Value = valp; Jsp = NULL;} + virtual void SetValue(PJSON jsp) {Jsp = jsp; Value = NULL;} virtual void SetString(PGLOBAL g, PSZ s, short c = 0); virtual void SetInteger(PGLOBAL g, int n); virtual void SetBigint(PGLOBAL g, longlong ll); virtual void SetFloat(PGLOBAL g, double f); - virtual bool IsNull(void); + virtual void SetTiny(PGLOBAL g, char f); + virtual bool IsNull(void); protected: PJSON Jsp; // To the json value diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index fc66e754881..4d029ce9a7c 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -117,7 +117,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) if (b) { // Return 1st value (B is the index base) jnp->Rank = B; - jnp->Op = OP_EQ; + jnp->Op = OP_LE; } else if (!Value->IsTypeNum()) { jnp->CncVal = AllocateValue(g, (void*)", ", TYPE_STRING); jnp->Op = OP_CNC; @@ -359,10 +359,16 @@ PJVAL JSNX::GetValue(PGLOBAL g, PJSON row, int i, my_bool b) case TYPE_JOB: if (!Nodes[i].Key) { // Expected Array was not there - if (i < Nod-1) - continue; - else - val = new(g) JVALUE(row); + if (Nodes[i].Op == OP_LE) { + if (i < Nod-1) + continue; + else + val = new(g)JVALUE(row); + + } else { + strcpy(g->Message, "Unexpected object"); + val = NULL; + } //endif Op } else val = ((PJOB)row)->GetValue(Nodes[i].Key); @@ -372,7 +378,7 @@ PJVAL JSNX::GetValue(PGLOBAL g, PJSON row, int i, my_bool b) arp = (PJAR)row; if (!Nodes[i].Key) { - if (Nodes[i].Op == OP_EQ) + if (Nodes[i].Op == OP_EQ || Nodes[i].Op == OP_LE) val = arp->GetValue(Nodes[i].Rank); else if (Nodes[i].Op == OP_EXP) return (PJVAL)ExpandArray(g, arp, i); @@ -805,6 +811,7 @@ struct BSON { int Pretty; ulong Reslen; my_bool Changed; + PJSON Top; PJSON Jsp; PBSON Bsp; }; // end of struct BSON @@ -822,7 +829,7 @@ static PBSON JbinAlloc(PGLOBAL g, UDF_ARGS *args, ulong len, PJSON jsp) bsp->Pretty = 2; bsp->Reslen = len; bsp->Changed = false; - bsp->Jsp = jsp; + bsp->Top = bsp->Jsp = jsp; bsp->Bsp = (IsJson(args, 0) == 3) ? (PBSON)args->args[0] : NULL; return bsp; } /* end of JbinAlloc */ @@ -894,21 +901,28 @@ static my_bool JsonInit(UDF_INIT *initid, UDF_ARGS *args, /*********************************************************************************/ /* Check if a path was specified and set jvp according to it. */ /*********************************************************************************/ -static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON top, PJVAL& jvp, int n) +static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON jsp, PJVAL& jvp, int n) { for (uint i = n; i < args->arg_count; i++) - if (args->arg_type[i] == STRING_RESULT) { + if (args->arg_type[i] == STRING_RESULT && args->args[i]) { // A path to a subset of the json tree is given char *path = MakePSZ(g, args, i); - PJSNX jsx = new(g) JSNX(g, top, TYPE_STRING); - if (jsx->SetJpath(g, path)) - return true; + if (path) { + PJSNX jsx = new(g)JSNX(g, jsp, TYPE_STRING); - if (!(jvp = jsx->GetJson(g))) { - sprintf(g->Message, "No sub-item at '%s'", path); + if (jsx->SetJpath(g, path)) + return true; + + if (!(jvp = jsx->GetJson(g))) { + sprintf(g->Message, "No sub-item at '%s'", path); + return true; + } // endif jvp + + } else { + strcpy(g->Message, "Path argument is null"); return true; - } // endif jvp + } // endif path break; } // endif type @@ -919,7 +933,7 @@ static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON top, PJVAL& jvp, int n /*********************************************************************************/ /* Make the result according to the first argument type. */ /*********************************************************************************/ -static char *MakeResult(PGLOBAL g, UDF_ARGS *args, PJSON top, int n = 2) +static char *MakeResult(PGLOBAL g, UDF_ARGS *args, PJSON top, uint n = 2) { char *str; @@ -976,14 +990,19 @@ static PBSON MakeBinResult(PGLOBAL g, UDF_ARGS *args, PJSON top, ulong len, int } // endif type bsnp->Pretty = pretty; - bsnp->Filename = (char*)args->args[0]; - strncpy(bsnp->Msg, (char*)args->args[0], BMX); + + if (bsnp->Filename = (char*)args->args[0]) + strncpy(bsnp->Msg, (char*)args->args[0], BMX); + else + strncpy(bsnp->Msg, "null filename", BMX); + } else if (IsJson(args, 0) == 3) { PBSON bsp = (PBSON)args->args[0]; if (bsp->Filename) { bsnp->Filename = bsp->Filename; strncpy(bsnp->Msg, bsp->Filename, BMX); + bsnp->Pretty = bsp->Pretty; } else strcpy(bsnp->Msg, "Json Binary item"); @@ -993,6 +1012,27 @@ static PBSON MakeBinResult(PGLOBAL g, UDF_ARGS *args, PJSON top, ulong len, int return bsnp; } // end of MakeBinResult +/*********************************************************************************/ +/* Returns a pointer to the first integer argument found from the nth argument. */ +/*********************************************************************************/ +static int *GetIntArgPtr(PGLOBAL g, UDF_ARGS *args, uint& n) +{ + int *x = NULL; + + for (uint i = n; i < args->arg_count; i++) + if (args->arg_type[i] == INT_RESULT) { + if (args->args[i]) { + x = (int*)PlugSubAlloc(g, NULL, sizeof(int)); + *x = (int)*(longlong*)args->args[i]; + } // endif args + + n = i + 1; + break; + } // endif arg_type + + return x; +} // end of GetIntArgPtr + /*********************************************************************************/ /* Returns not 0 if the argument is a JSON item or file name. */ /*********************************************************************************/ @@ -1002,8 +1042,8 @@ static int IsJson(UDF_ARGS *args, uint i) if (i >= args->arg_count || args->arg_type[i] != STRING_RESULT) { } else if (!strnicmp(args->attributes[i], "Json_", 5)) { - if (!args->args[i] || *args->args[i] == '[' || *args->args[i] == '{') - n = 1; // arg is a json item + if (!args->args[i] || strchr("[{ \t\r\n", *args->args[i])) + n = 1; // arg should be is a json item else n = 2; // A file name may have been returned @@ -1256,6 +1296,58 @@ static PSZ MakeKey(PGLOBAL g, UDF_ARGS *args, int i) return "Key"; } // end of MakeKey +/*********************************************************************************/ +/* Parse a json file. */ +/*********************************************************************************/ +static PJSON ParseJsonFile(PGLOBAL g, char *fn, int *pretty, int& len) +{ + char *memory; + HANDLE hFile; + MEMMAP mm; + PJSON jsp; + + /*******************************************************************************/ + /* Create the mapping file object. */ + /*******************************************************************************/ + hFile = CreateFileMap(g, fn, &mm, MODE_READ, false); + + if (hFile == INVALID_HANDLE_VALUE) { + DWORD rc = GetLastError(); + + if (!(*g->Message)) + sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int)rc, fn); + + return NULL; + } // endif hFile + + /*******************************************************************************/ + /* Get the file size (assuming file is smaller than 4 GB) */ + /*******************************************************************************/ + len = mm.lenL; + memory = (char *)mm.memory; + + if (!len) { // Empty or deleted file + CloseFileHandle(hFile); + return NULL; + } // endif len + + if (!memory) { + CloseFileHandle(hFile); + sprintf(g->Message, MSG(MAP_VIEW_ERROR), fn, GetLastError()); + return NULL; + } // endif Memory + + CloseFileHandle(hFile); // Not used anymore + + /*********************************************************************************/ + /* Parse the json file and allocate its tree structure. */ + /*********************************************************************************/ + g->Message[0] = 0; + jsp = ParseJson(g, memory, len, pretty); + CloseMemMap(memory, len); + return jsp; +} // end of ParseJsonFile + /*********************************************************************************/ /* Return a json file contains. */ /*********************************************************************************/ @@ -1292,7 +1384,7 @@ static char *GetJsonFile(PGLOBAL g, char *fn) /*********************************************************************************/ /* Make a JSON value from the passed argument. */ /*********************************************************************************/ -static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) +static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i, PJSON *top = NULL) { char *sap = (args->arg_count > i) ? args->args[i] : NULL; int n, len; @@ -1301,6 +1393,9 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) PJSON jsp; PJVAL jvp = new(g) JVALUE; + if (top) + *top = NULL; + if (sap) switch (args->arg_type[i]) { case STRING_RESULT: if ((len = args->lengths[i])) { @@ -1309,17 +1404,25 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) if (n) { if (n == 3) { + if (top) + *top = ((PBSON)sap)->Top; + jsp = ((PBSON)sap)->Jsp; } else { if (n == 2) { - if (!(sap = GetJsonFile(g, sap))) + if (!(sap = GetJsonFile(g, sap))) { PUSH_WARNING(g->Message); + return jvp; + } // endif sap - len = (sap) ? strlen(sap) : 0; + len = strlen(sap); } // endif n - if (!(jsp = ParseJson(g, sap, len, 3))) + if (!(jsp = ParseJson(g, sap, strlen(sap)))) PUSH_WARNING(g->Message); + else if (top) + *top = jsp; + } // endif's n if (jsp && jsp->GetType() == TYPE_JVAL) @@ -1338,10 +1441,11 @@ static PJVAL MakeValue(PGLOBAL g, UDF_ARGS *args, uint i) case INT_RESULT: bigint = *(long long*)sap; - if (bigint > INT_MAX32 || bigint < INT_MIN32) - jvp->SetFloat(g, (double)bigint); + if ((bigint == 0LL && !strcmp(args->attributes[i], "FALSE")) || + (bigint == 1LL && !strcmp(args->attributes[i], "TRUE"))) + jvp->SetTiny(g, (char)bigint); else - jvp->SetInteger(g, (int)bigint); + jvp->SetBigint(g, bigint); break; case REAL_RESULT: @@ -1367,7 +1471,7 @@ my_bool jsonvalue_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count > 1) { - strcpy(message, "jsonvalue cannot accept more than 1 argument"); + strcpy(message, "Cannot accept more than 1 argument"); return true; } else CalcLen(args, false, reslen, memlen); @@ -1459,10 +1563,10 @@ my_bool json_array_add_values_init(UDF_INIT *initid, UDF_ARGS *args, char *messa unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "json_array_add_values must have at least 2 arguments"); + strcpy(message, "This function must have at least 2 arguments"); return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "json_array_add_values first argument must be a json string"); + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "First argument must be a json string or item"); return true; } else CalcLen(args, false, reslen, memlen); @@ -1478,9 +1582,20 @@ char *json_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!g->Xchk) { if (!CheckMemory(g, initid, args, args->arg_count, false)) { + char *p; + PJSON top; PJAR arp; - PJVAL jvp = MakeValue(g, args, 0); + PJVAL jvp = MakeValue(g, args, 0, &top); + if ((p = jvp->GetString())) { + if (!(top = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp + + jvp->SetValue(top); + } // endif p + if (jvp->GetValType() != TYPE_JAR) { arp = new(g)JARRAY; arp->AddValue(g, jvp); @@ -1491,7 +1606,8 @@ char *json_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, arp->AddValue(g, MakeValue(g, args, i)); arp->InitArray(g); - str = Serialize(g, arp, NULL, 0); +// str = Serialize(g, arp, NULL, 0); + str = MakeResult(g, args, top, args->arg_count); } // endif CheckMemory if (!str) { @@ -1526,10 +1642,10 @@ my_bool json_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "json_array_add must have at least 2 arguments"); + strcpy(message, "This function must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "json_array_add first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); @@ -1538,7 +1654,7 @@ my_bool json_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_array_add_init char *json_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *error) + unsigned long *res_length, char *is_null, char *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -1546,30 +1662,21 @@ char *json_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, if (g->Xchk) { // This constant function was recalled str = (char*)g->Xchk; - *res_length = strlen(str); - return str; + goto fin; } // endif Xchk if (!CheckMemory(g, initid, args, 2, false, true)) { - int *x = NULL, n = 2; - PJSON top; + int *x; + uint n = 2; + PJSON jsp, top; PJVAL jvp; PJAR arp; - jvp = MakeValue(g, args, 0); - top = jvp->GetJson(); + jvp = MakeValue(g, args, 0, &top); + jsp = jvp->GetJson(); + x = GetIntArgPtr(g, args, n); - if (args->arg_count > 2) { - if (args->arg_type[2] == INT_RESULT) { - x = (int*)PlugSubAlloc(g, NULL, sizeof(int)); - *x = (int)*(longlong*)args->args[2]; - n = 3; - } else if (!args->args[2]) - n = 3; - - } // endif count - - if (CheckPath(g, args, top, jvp, n)) + if (CheckPath(g, args, jsp, jvp, 2)) PUSH_WARNING(g->Message); else if (jvp && jvp->GetValType() == TYPE_JAR) { arp = jvp->GetArray(); @@ -1577,8 +1684,8 @@ char *json_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, arp->InitArray(g); str = MakeResult(g, args, top, n); } else { - PUSH_WARNING("First argument is not an array"); - if (g->Mrr) *error = 1; + PUSH_WARNING("First argument target is not an array"); +// if (g->Mrr) *error = 1; (only if no path) } // endif jvp } // endif CheckMemory @@ -1591,7 +1698,13 @@ char *json_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, // Keep result of constant function g->Xchk = str; - *res_length = strlen(str); +fin: + if (!str) { + *res_length = 0; + *is_null = 1; + } else + *res_length = strlen(str); + return str; } // end of json_array_add @@ -1608,13 +1721,10 @@ my_bool json_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "json_array_delete must have at lest 2 arguments"); + strcpy(message, "This function must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "json_array_delete first argument must be a json item"); - return true; - } else if (args->arg_type[1] != INT_RESULT) { - strcpy(message, "json_array_delete second argument is not an integer (index)"); + strcpy(message, "First argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); @@ -1636,22 +1746,24 @@ char *json_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif Xchk if (!CheckMemory(g, initid, args, 1, false, true)) { - int n; + int *x; + uint n = 1; + PJSON top; PJAR arp; - PJVAL jvp = MakeValue(g, args, 0); - PJSON top = jvp->GetJson(); + PJVAL jvp = MakeValue(g, args, 0, &top); - if (CheckPath(g, args, top, jvp, 2)) + if (!(x = GetIntArgPtr(g, args, n))) + PUSH_WARNING("Missing or null array index"); + else if (CheckPath(g, args, jvp->GetJson(), jvp, 1)) PUSH_WARNING(g->Message); else if (jvp && jvp->GetValType() == TYPE_JAR) { - n = *(int*)args->args[1]; arp = jvp->GetArray(); - arp->DeleteValue(n); + arp->DeleteValue(*x); arp->InitArray(g); - str = MakeResult(g, args, top); + str = MakeResult(g, args, top, n); } else { - PUSH_WARNING("First argument is not an array"); - if (g->Mrr) *error = 1; + PUSH_WARNING("First argument target is not an array"); +// if (g->Mrr) *error = 1; } // endif jvp } // endif CheckMemory @@ -1772,10 +1884,10 @@ my_bool json_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "json_object_add must have at least 2 arguments"); + strcpy(message, "This function must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "json_object_add first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); @@ -1798,10 +1910,13 @@ char *json_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!CheckMemory(g, initid, args, 2, false, true)) { PJOB jobp; - PJVAL jvp = MakeValue(g, args, 0); - PJSON top = jvp->GetJson(); + PJVAL jvp; + PJSON jsp, top; - if (CheckPath(g, args, top, jvp, 2)) + jvp = MakeValue(g, args, 0, &top); + jsp = jvp->GetJson(); + + if (CheckPath(g, args, jsp, jvp, 2)) PUSH_WARNING(g->Message); else if (jvp && jvp->GetValType() == TYPE_JOB) { jobp = jvp->GetObject(); @@ -1810,8 +1925,8 @@ char *json_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, jobp->SetValue(g, jvp, key); str = MakeResult(g, args, top); } else { - PUSH_WARNING("First argument is not an object"); - if (g->Mrr) *error = 1; + PUSH_WARNING("First argument target is not an object"); +// if (g->Mrr) *error = 1; (only if no path) } // endif jvp } // endif CheckMemory @@ -1841,13 +1956,13 @@ my_bool json_object_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "json_object_delete must have 2 or 3 arguments"); + strcpy(message, "This function must have 2 or 3 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "json_object_delete first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { - strcpy(message, "json_object_delete second argument must be a key string"); + strcpy(message, "Second argument must be a key string"); return true; } else CalcLen(args, false, reslen, memlen, true); @@ -1871,10 +1986,12 @@ char *json_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!CheckMemory(g, initid, args, 1, false, true)) { char *key; PJOB jobp; - PJVAL jvp = MakeValue(g, args, 0); - PJSON top = jvp->GetJson(); + PJSON jsp, top; + PJVAL jvp = MakeValue(g, args, 0, &top); - if (CheckPath(g, args, top, jvp, 2)) + jsp = jvp->GetJson(); + + if (CheckPath(g, args, jsp, jvp, 2)) PUSH_WARNING(g->Message); else if (jvp && jvp->GetValType() == TYPE_JOB) { key = MakeKey(g, args, 1); @@ -1882,8 +1999,8 @@ char *json_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, jobp->DeleteKey(key); str = MakeResult(g, args, top); } else { - PUSH_WARNING("First argument is not an object"); - if (g->Mrr) *error = 1; + PUSH_WARNING("First argument target is not an object"); +// if (g->Mrr) *error = 1; (only if no path) } // endif jvp } // endif CheckMemory @@ -1913,10 +2030,10 @@ my_bool json_object_list_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count != 1) { - strcpy(message, "json_object_list must have 1 arguments"); + strcpy(message, "This function must have 1 argument"); return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "json_object_list argument must be a json item"); + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "Argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen); @@ -1932,11 +2049,21 @@ char *json_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!g->N) { if (!CheckMemory(g, initid, args, 1, false)) { + char *p; + PJSON jsp; PJVAL jvp = MakeValue(g, args, 0); - if (jvp && jvp->GetValType() == TYPE_JOB) { - PJOB jobp = jvp->GetObject(); - PJAR jarp = jobp->GetKeyList(g); + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp + + } else + jsp = jvp->GetJson(); + + if (jsp->GetType() == TYPE_JOB) { + PJAR jarp = ((PJOB)jsp)->GetKeyList(g); if (!(str = Serialize(g, jarp, NULL, 0))) PUSH_WARNING(g->Message); @@ -1979,10 +2106,10 @@ my_bool json_array_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen, n = GetJsonGrpSize(); if (args->arg_count != 1) { - strcpy(message, "json_array_grp can only accept 1 argument"); + strcpy(message, "This function can only accept 1 argument"); return true; } else if (IsJson(args, 0) == 3) { - strcpy(message, "Json_Array_Grp does not support Jbin argument"); + strcpy(message, "This function does not support Jbin arguments"); return true; } else CalcLen(args, false, reslen, memlen); @@ -2051,11 +2178,11 @@ my_bool json_object_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, n = GetJsonGrpSize(); - if (args->arg_count != 2) { - strcpy(message, "json_object_grp can only accept 2 arguments"); + if (args->arg_count != 2) { + strcpy(message, "This function requires 2 arguments (value, key)"); return true; } else if (IsJson(args, 0) == 3) { - strcpy(message, "json_object_grp does not support Jbin arguments"); + strcpy(message, "This function does not support Jbin arguments"); return true; } else CalcLen(args, true, reslen, memlen); @@ -2079,8 +2206,9 @@ void json_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) PGLOBAL g = (PGLOBAL)initid->ptr; PJOB objp = (PJOB)g->Activityp; - if (g->N-- > 0) - objp->SetValue(g, MakeValue(g, args, 0), MakePSZ(g, args, 1)); + if (g->N-- > 0) + objp->SetValue(g, MakeValue(g, args, 0), + (args->arg_count == 1) ? MakeKey(g, args, 0) : MakePSZ(g, args, 1)); } // end of json_object_grp_add @@ -2123,13 +2251,13 @@ my_bool json_item_merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "json_item_merge must have at least 2 arguments"); + strcpy(message, "This function must have at least 2 arguments"); return true; } else if (!IsJson(args, 0)) { - strcpy(message, "json_item_merge first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else if (!IsJson(args, 1)) { - strcpy(message, "json_item_merge second argument must be a json item"); + strcpy(message, "Second argument must be a json item"); return true; } else CalcLen(args, false, reslen, memlen, true); @@ -2203,10 +2331,10 @@ my_bool json_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) int n = IsJson(args, 0); if (args->arg_count < 2) { - strcpy(message, "json_get_item must have at least 2 arguments"); + strcpy(message, "This function must have at least 2 arguments"); return true; } else if (!n && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "json_get_item first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a string (jpath)"); @@ -2235,7 +2363,7 @@ char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, PGLOBAL g = (PGLOBAL)initid->ptr; if (g->N) { - str = (char*)g->Xchk; + str = (char*)g->Activityp; goto fin; } else if (initid->const_item) g->N = 1; @@ -2252,7 +2380,6 @@ char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, if ((p = jvp->GetString())) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); - return NULL; } // endif jsp @@ -2283,7 +2410,7 @@ char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, if (initid->const_item) // Keep result of constant function - g->Xchk = str; + g->Activityp = (PACTIVITY)str; } // endif CheckMemory @@ -2307,20 +2434,28 @@ void json_get_item_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jsonget_string_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; + unsigned long reslen, memlen, more = 1024; int n = IsJson(args, 0); if (args->arg_count < 2) { - strcpy(message, "jsonget_string must have at least 2 arguments"); + strcpy(message, "At least 2 arguments required"); return true; } else if (!n && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "jsonget_string first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a string (jpath)"); return true; - } else - CalcLen(args, false, reslen, memlen); + } else if (args->arg_count > 2) { + if (args->arg_type[2] == INT_RESULT && args->args[2]) + more += (unsigned long)*(long long*)args->args[2]; + else + strcpy(message, "Third argument is not an integer (memory)"); + + } // endif's + + CalcLen(args, false, reslen, memlen); + memlen += more; if (n == 2) { char fn[_MAX_PATH]; @@ -2339,11 +2474,12 @@ my_bool jsonget_string_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { + int rc; char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; if (g->N) { - str = (char*)g->Xchk; + str = (char*)g->Activityp; goto fin; } else if (initid->const_item) g->N = 1; @@ -2354,14 +2490,26 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, PJSNX jsx; PJVAL jvp; + // Save stack and allocation environment and prepare error return + if (g->jump_level == MAX_JUMP) { + PUSH_WARNING(MSG(TOO_MANY_JUMPS)); + *is_null = 1; + return NULL; + } // endif jump_level + + if ((rc= setjmp(g->jumper[++g->jump_level])) != 0) { + PUSH_WARNING(g->Message); + str = NULL; + goto err; + } // endif rc + if (!g->Xchk) { jvp = MakeValue(g, args, 0); if ((p = jvp->GetString())) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); - - return NULL; + goto err; } // endif jsp } else @@ -2380,8 +2528,7 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, if (jsx->SetJpath(g, path)) { PUSH_WARNING(g->Message); - *is_null = 1; - return NULL; + goto err; } // endif SetJpath jsx->ReadValue(g); @@ -2391,8 +2538,10 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, if (initid->const_item) // Keep result of constant function - g->Xchk = str; + g->Activityp = (PACTIVITY)str; + err: + g->jump_level--; } // endif CheckMemory fin: @@ -2418,10 +2567,10 @@ my_bool jsonget_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count != 2) { - strcpy(message, "jsonget_int must have 2 arguments"); + strcpy(message, "This function must have 2 arguments"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "jsonget_int first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a (jpath) string"); @@ -2441,11 +2590,11 @@ long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args, PGLOBAL g = (PGLOBAL)initid->ptr; if (g->N) { - if (!g->Xchk) { + if (!g->Activityp) { *is_null = 1; return 0LL; } else - return *(long long*)g->Xchk; + return *(long long*)g->Activityp; } else if (initid->const_item) g->N = 1; @@ -2502,7 +2651,7 @@ long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args, // Keep result of constant function long long *np = (long long*)PlugSubAlloc(g, NULL, sizeof(long long)); *np = n; - g->Xchk = np; + g->Activityp = (PACTIVITY)np; } // endif const_item return n; @@ -2526,10 +2675,10 @@ my_bool jsonget_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count < 2) { - strcpy(message, "jsonget_real must have at least 2 arguments"); + strcpy(message, "At least 2 arguments required"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "jsonget_real first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else if (args->arg_type[1] != STRING_RESULT) { strcpy(message, "Second argument is not a (jpath) string"); @@ -2558,11 +2707,11 @@ double jsonget_real(UDF_INIT *initid, UDF_ARGS *args, PGLOBAL g = (PGLOBAL)initid->ptr; if (g->N) { - if (!g->Xchk) { + if (!g->Activityp) { *is_null = 1; return 0.0; } else - return *(double*)g->Xchk; + return *(double*)g->Activityp; } else if (initid->const_item) g->N = 1; @@ -2618,7 +2767,7 @@ double jsonget_real(UDF_INIT *initid, UDF_ARGS *args, // Keep result of constant function double *dp = (double*)PlugSubAlloc(g, NULL, sizeof(double)); *dp = d; - g->Xchk = dp; + g->Activityp = (PACTIVITY)dp; } // endif const_item return d; @@ -2642,10 +2791,10 @@ my_bool jsonlocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen, more = 1000; if (args->arg_count < 2) { - strcpy(message, "jsonlocate must have at least 2 arguments"); + strcpy(message, "At least 2 arguments required"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "jsonlocate first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { strcpy(message, "Third argument is not an integer (rank)"); @@ -2672,15 +2821,15 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, PGLOBAL g = (PGLOBAL)initid->ptr; if (g->N) { - if (g->Xchk) { - path = (char*)g->Xchk; + if (g->Activityp) { + path = (char*)g->Activityp; *res_length = strlen(path); return path; } else { *res_length = 0; *is_null = 1; return NULL; - } // endif Xchk + } // endif Activityp } else if (initid->const_item) g->N = 1; @@ -2737,7 +2886,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, if (initid->const_item) // Keep result of constant function - g->Xchk = path; + g->Activityp = (PACTIVITY)path; err: g->jump_level--; @@ -2769,10 +2918,10 @@ my_bool json_locate_all_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen, more = 1000; if (args->arg_count < 2) { - strcpy(message, "json_locate_all must have at least 2 arguments"); + strcpy(message, "At least 2 arguments required"); return true; } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "json_locate_all first argument must be a json item"); + strcpy(message, "First argument must be a json item"); return true; } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { strcpy(message, "Third argument is not an integer (Depth)"); @@ -2799,8 +2948,8 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, PGLOBAL g = (PGLOBAL)initid->ptr; if (g->N) { - if (g->Xchk) { - path = (char*)g->Xchk; + if (g->Activityp) { + path = (char*)g->Activityp; *res_length = strlen(path); return path; } else { @@ -2808,7 +2957,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, *res_length = 0; *is_null = 1; return NULL; - } // endif Xchk + } // endif Activityp } else if (initid->const_item) g->N = 1; @@ -2866,7 +3015,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, if (initid->const_item) // Keep result of constant function - g->Xchk = path; + g->Activityp = (PACTIVITY)path; err: g->jump_level--; @@ -2898,34 +3047,34 @@ my_bool json_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen, fl, more = 1024; if (args->arg_count < 1 || args->arg_count > 4) { - strcpy(message, "json_file only accepts 1 to 4 arguments"); + strcpy(message, "This function only accepts 1 to 4 arguments"); return true; - } else if (args->arg_type[0] != STRING_RESULT) { - strcpy(message, "json_file first argument must be a (string) file name"); + } else if (!args->args[0] || args->arg_type[0] != STRING_RESULT) { + strcpy(message, "First argument must be a constant string (file name)"); return true; - } else if (args->arg_count > 1 && args->arg_type[1] != INT_RESULT) { - strcpy(message, "Second argument is not an integer (check)"); - return true; - } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { - strcpy(message, "Third argument is not an integer (pretty)"); - return true; - } else if (args->arg_count > 3) { - if (args->arg_type[3] != INT_RESULT) { - strcpy(message, "Fourth argument is not an integer (memory)"); - return true; - } else - more += (ulong)*(longlong*)args->args[2]; + } // endif's args[0] - } // endifs + for (unsigned int i = 1; i < args->arg_count; i++) { + if (!(args->arg_type[i] == INT_RESULT || args->arg_type[i] == STRING_RESULT)) { + sprintf(message, "Argument %d is not an integer or a string (pretty or path)", i); + return true; + } // endif arg_type + + // Take care of eventual memory argument + if (args->arg_type[i] == INT_RESULT && args->args[i]) + more += (ulong)*(longlong*)args->args[i]; + + } // endfor i initid->maybe_null = 1; CalcLen(args, false, reslen, memlen); fl = GetFileLength(args->args[0]); + reslen += fl; if (initid->const_item) more += fl; - if (args->arg_count > 1 && *(longlong*)args->args[1]) + if (args->arg_count > 1) more += fl * M; memlen += more; @@ -2947,68 +3096,40 @@ char *json_file(UDF_INIT *initid, UDF_ARGS *args, char *result, PlugSubSet(g, g->Sarea, g->Sarea_Size); fn = MakePSZ(g, args, 0); - if (args->arg_count > 1 && *(longlong*)args->args[1]) { - char *memory; - int len, pretty; - HANDLE hFile; - MEMMAP mm; + if (args->arg_count > 1) { + int len, pretty, pty = 3; PJSON jsp; + PJVAL jvp = NULL; - pretty = (args->arg_count > 2) ? (int)*(longlong*)args->args[2] : 3; - - /*****************************************************************************/ - /* Create the mapping file object. */ - /*****************************************************************************/ - hFile = CreateFileMap(g, fn, &mm, MODE_READ, false); - - if (hFile == INVALID_HANDLE_VALUE) { - DWORD rc = GetLastError(); - - if (!(*g->Message)) - sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int)rc, fn); - - PUSH_WARNING(g->Message); - if (g->Mrr) *error = 1; - *is_null = 1; - return NULL; - } // endif hFile - - /*****************************************************************************/ - /* Get the file size (assuming file is smaller than 4 GB) */ - /*****************************************************************************/ - len = mm.lenL; - memory = (char *)mm.memory; - - if (!len) { // Empty or deleted file - CloseFileHandle(hFile); - *is_null = 1; - return NULL; - } // endif len - - if (!memory) { - CloseFileHandle(hFile); - sprintf(g->Message, MSG(MAP_VIEW_ERROR), fn, GetLastError()); - PUSH_WARNING(g->Message); - *is_null = 1; - return NULL; - } // endif Memory - - CloseFileHandle(hFile); // Not used anymore - hFile = INVALID_HANDLE_VALUE; // For Fblock + pretty = (args->arg_type[1] == INT_RESULT) ? (int)*(longlong*)args->args[1] + : (args->arg_count > 2 && args->arg_type[2] == INT_RESULT) + ? (int)*(longlong*)args->args[2] : 3; /*******************************************************************************/ /* Parse the json file and allocate its tree structure. */ /*******************************************************************************/ - g->Message[0] = 0; - - if (!(jsp = ParseJson(g, memory, len, pretty))) { + if (!(jsp = ParseJsonFile(g, fn, &pty, len))) { PUSH_WARNING(g->Message); str = NULL; + goto fin; } // endif jsp - CloseMemMap(memory, len); + if (pty == 3) + PUSH_WARNING("File pretty format cannot be determined"); + else if (pretty != 3 && pty != pretty) + PUSH_WARNING("File pretty format doesn't match the specified pretty value"); + else if (pretty == 3) + pretty = pty; - if (jsp && !(str = Serialize(g, jsp, NULL, 0))) + // Check whether a path was specified + if (CheckPath(g, args, jsp, jvp, 1)) { + PUSH_WARNING(g->Message); + str = NULL; + goto fin; + } else if (jvp) + jsp = jvp->GetJson(); + + if (!(str = Serialize(g, jsp, NULL, 0))) PUSH_WARNING(g->Message); } else @@ -3040,19 +3161,13 @@ my_bool jfile_make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, more = 1024; - if (args->arg_count < 2 || args->arg_count > 3) { - strcpy(message, "jfile_make only accepts 2 or 3 arguments"); + if (args->arg_count < 1 || args->arg_count > 3) { + strcpy(message, "Wrong number of arguments"); return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "jfile_make first argument must be a json item"); + } else if (!IsJson(args, 0) && args->arg_type[0] != STRING_RESULT) { + strcpy(message, "First argument must be a json item"); return true; - } else if (args->arg_type[1] != STRING_RESULT) { - strcpy(message, "Second argument must be a (string) file name"); - return true; - } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { - strcpy(message, "Third argument is not an integer (pretty)"); - return true; - } // endifs + } // endif CalcLen(args, false, reslen, memlen); return JsonInit(initid, args, message, true, reslen, memlen); @@ -3061,22 +3176,51 @@ my_bool jfile_make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char *jfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *) { - char *str, *fn, *msg; - int pretty; + char *p, *str, *msg, *fn = NULL; + int n, pretty = 2; + PJSON jsp; PJVAL jvp; PGLOBAL g = (PGLOBAL)initid->ptr; if (g->N) { - str = (char*)g->Xchk; + str = (char*)g->Activityp; goto fin; } else if (initid->const_item) g->N = 1; PlugSubSet(g, g->Sarea, g->Sarea_Size); + if ((n = IsJson(args, 0)) == 3) { + // Get default file name and pretty + PBSON bsp = (PBSON)args->args[0]; + + fn = bsp->Filename; + pretty = bsp->Pretty; + } else if (n == 2) + fn = args->args[0]; + if (!g->Xchk) { jvp = MakeValue(g, args, 0); + if ((p = jvp->GetString())) { + if (!strchr("[{ \t\r\n", *p)) { + // Is this a file name? + if (!(p = GetJsonFile(g, p))) { + PUSH_WARNING(g->Message); + return NULL; + } else + fn = jvp->GetString(); + + } // endif p + + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp + + jvp->SetValue(jsp); + } // endif p + if (g->Mrr) { // First argument is a constant g->Xchk = jvp; JsonMemSave(g); @@ -3085,17 +3229,27 @@ char *jfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result, } else jvp = (PJVAL)g->Xchk; - fn = MakePSZ(g, args, 1); - pretty = (args->arg_count > 2) ? (int)*(longlong*)args->args[2] : 2; + for (uint i = 1; i < args->arg_count; i++) + switch (args->arg_type[i]) { + case STRING_RESULT: + fn = MakePSZ(g, args, i); + break; + case INT_RESULT: + pretty = (int)*(longlong*)args->args[i]; + break; + } // endswitch arg_type - if ((msg = Serialize(g, jvp->GetJson(), fn, pretty))) - PUSH_WARNING(msg); + if (fn) { + if ((msg = Serialize(g, jvp->GetJson(), fn, pretty))) + PUSH_WARNING(msg); + } else + PUSH_WARNING("Missing file name"); str= fn; if (initid->const_item) // Keep result of constant function - g->Xchk = str; + g->Activityp = (PACTIVITY)str; fin: if (!str) { @@ -3162,18 +3316,7 @@ void jbin_array_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jbin_array_add_values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; - - if (args->arg_count < 2) { - strcpy(message, "jbin_array_add_values must have at least 2 arguments"); - return true; - } else if (IsJson(args, 0) != 1) { - strcpy(message, "jbin_array_add_values first argument must be a json string"); - return true; - } else - CalcLen(args, false, reslen, memlen); - - return JsonInit(initid, args, message, true, reslen, memlen); + return json_array_add_values_init(initid, args, message); } // end of jbin_array_add_values_init char *jbin_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3184,8 +3327,19 @@ char *jbin_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!bsp || bsp->Changed) { if (!CheckMemory(g, initid, args, args->arg_count, false)) { + char *p; + PJSON top; PJAR arp; - PJVAL jvp = MakeValue(g, args, 0); + PJVAL jvp = MakeValue(g, args, 0, &top); + + if ((p = jvp->GetString())) { + if (!(top = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp + + jvp->SetValue(top); + } // endif p if (jvp->GetValType() != TYPE_JAR) { arp = new(g)JARRAY; @@ -3197,8 +3351,9 @@ char *jbin_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, arp->AddValue(g, MakeValue(g, args, i)); arp->InitArray(g); - bsp = JbinAlloc(g, args, initid->max_length, arp); + bsp = JbinAlloc(g, args, initid->max_length, top); strcat(bsp->Msg, " array"); + bsp->Jsp = arp; } else { bsp = JbinAlloc(g, args, initid->max_length, NULL); strncpy(bsp->Msg, g->Message, BMX); @@ -3222,18 +3377,7 @@ void jbin_array_add_values_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jbin_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; - - if (args->arg_count < 2) { - strcpy(message, "jbin_array_add must have at least 2 arguments"); - return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "jbin_array_add first argument must be a json item"); - return true; - } else - CalcLen(args, false, reslen, memlen, true); - - return JsonInit(initid, args, message, true, reslen, memlen); + return json_array_add_init(initid, args, message); } // end of jbin_array_add_init char *jbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3252,21 +3396,14 @@ char *jbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!CheckMemory(g, initid, args, 2, false, true)) { int *x = NULL; + uint n = 2; + PJSON jsp; PJVAL jvp; PJAR arp; - jvp = MakeValue(g, args, 0); - top = jvp->GetJson(); - - if (args->arg_count > 2) { - if (args->arg_type[2] == INT_RESULT) { - x = (int*)PlugSubAlloc(g, NULL, sizeof(int)); - *x = (int)*(longlong*)args->args[2]; - n = 3; - } else if (!args->args[2]) - n = 3; - - } // endif count + jvp = MakeValue(g, args, 0, &top); + jsp = jvp->GetJson(); + x = GetIntArgPtr(g, args, n); if (CheckPath(g, args, top, jvp, n)) PUSH_WARNING(g->Message); @@ -3276,7 +3413,7 @@ char *jbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, arp->InitArray(g); } else { PUSH_WARNING("First argument is not an array"); - if (g->Mrr) *error = 1; +// if (g->Mrr) *error = 1; (only if no path) } // endif jvp } // endif CheckMemory @@ -3302,21 +3439,7 @@ void jbin_array_add_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jbin_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; - - if (args->arg_count < 2) { - strcpy(message, "jbin_array_delete must have at lest 2 arguments"); - return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "jbin_array_delete first argument must be a json item"); - return true; - } else if (args->arg_type[1] != INT_RESULT) { - strcpy(message, "jbin_array_delete second argument is not an integer (index)"); - return true; - } else - CalcLen(args, false, reslen, memlen, true); - - return JsonInit(initid, args, message, true, reslen, memlen); + return json_array_delete_init(initid, args, message); } // end of jbin_array_delete_init char *jbin_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3333,19 +3456,21 @@ char *jbin_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endif bsp if (!CheckMemory(g, initid, args, 1, false, true)) { - int n; + int *x; + uint n = 1; PJAR arp; - PJVAL jvp = MakeValue(g, args, 0); + PJVAL jvp = MakeValue(g, args, 0, &top); - top = jvp->GetJson(); - - if (CheckPath(g, args, top, jvp, 2)) + if (CheckPath(g, args, top, jvp, 1)) PUSH_WARNING(g->Message); else if (jvp && jvp->GetValType() == TYPE_JAR) { - n = *(int*)args->args[1]; - arp = jvp->GetArray(); - arp->DeleteValue(n); - arp->InitArray(g); + if ((x = GetIntArgPtr(g, args, n))) { + arp = jvp->GetArray(); + arp->DeleteValue(*x); + arp->InitArray(g); + } else + PUSH_WARNING("Missing or null array index"); + } else { PUSH_WARNING("First argument is not an array"); if (g->Mrr) *error = 1; @@ -3464,18 +3589,7 @@ void jbin_object_nonull_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jbin_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; - - if (args->arg_count < 2) { - strcpy(message, "jbin_object_add must have at least 2 arguments"); - return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "jbin_object_add first argument must be a json item"); - return true; - } else - CalcLen(args, false, reslen, memlen, true); - - return JsonInit(initid, args, message, true, reslen, memlen); + return json_object_add_init(initid, args, message); } // end of jbin_object_add_init char *jbin_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3495,11 +3609,10 @@ char *jbin_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!CheckMemory(g, initid, args, 2, false, true)) { char *key; PJOB jobp; - PJVAL jvp = MakeValue(g, args, 0); + PJVAL jvp = MakeValue(g, args, 0, &top); + PJSON jsp = jvp->GetJson(); - top = jvp->GetJson(); - - if (CheckPath(g, args, top, jvp, 2)) + if (CheckPath(g, args, jsp, jvp, 2)) PUSH_WARNING(g->Message); else if (jvp && jvp->GetValType() == TYPE_JOB) { jobp = jvp->GetObject(); @@ -3507,8 +3620,8 @@ char *jbin_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, key = MakeKey(g, args, 1); jobp->SetValue(g, jvp, key); } else { - PUSH_WARNING("First argument is not an object"); - if (g->Mrr) *error = 1; + PUSH_WARNING("First argument target is not an object"); +// if (g->Mrr) *error = 1; (only if no path) } // endif jvp } // endif CheckMemory @@ -3534,21 +3647,7 @@ void jbin_object_add_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jbin_object_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; - - if (args->arg_count < 2) { - strcpy(message, "jbin_object_delete must have 2 or 3 arguments"); - return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "jbin_object_delete first argument must be a json item"); - return true; - } else if (args->arg_type[1] != STRING_RESULT) { - strcpy(message, "jbin_object_delete second argument must be a key string"); - return true; - } else - CalcLen(args, false, reslen, memlen, true); - - return JsonInit(initid, args, message, true, reslen, memlen); + return json_object_delete_init(initid, args, message); } // end of jbin_object_delete_init char *jbin_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3568,9 +3667,8 @@ char *jbin_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!CheckMemory(g, initid, args, 1, false, true)) { char *key; PJOB jobp; - PJVAL jvp = MakeValue(g, args, 0); - - top = jvp->GetJson(); + PJVAL jvp = MakeValue(g, args, 0, &top); + PJSON jsp = jvp->GetJson(); if (CheckPath(g, args, top, jvp, 2)) PUSH_WARNING(g->Message); @@ -3579,8 +3677,8 @@ char *jbin_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, jobp = jvp->GetObject(); jobp->DeleteKey(key); } else { - PUSH_WARNING("First argument is not an object"); - if (g->Mrr) *error = 1; + PUSH_WARNING("First argument target is not an object"); +// if (g->Mrr) *error = 1; (only if no path) } // endif jvp } // endif CheckMemory @@ -3606,18 +3704,7 @@ void jbin_object_delete_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jbin_object_list_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; - - if (args->arg_count != 1) { - strcpy(message, "jbin_object_list must have 1 arguments"); - return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "jbin_object_list argument must be a json item"); - return true; - } else - CalcLen(args, false, reslen, memlen); - - return JsonInit(initid, args, message, false, reslen, memlen); + return json_object_list_init(initid, args, message); } // end of jbin_object_list_init char *jbin_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3629,16 +3716,25 @@ char *jbin_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!bsp || bsp->Changed) { if (!CheckMemory(g, initid, args, 1, false)) { + char *p; + PJSON jsp; PJVAL jvp = MakeValue(g, args, 0); - if (jvp && jvp->GetValType() == TYPE_JOB) { - PJOB jobp = jvp->GetObject(); + if ((p = jvp->GetString())) { + if (!(jsp = ParseJson(g, p, strlen(p)))) { + PUSH_WARNING(g->Message); + return NULL; + } // endif jsp - jarp = jobp->GetKeyList(g); + } else + jsp = jvp->GetJson(); + + if (jsp->GetType() == TYPE_JOB) { + jarp = ((PJOB)jsp)->GetKeyList(g); } else { PUSH_WARNING("First argument is not an object"); if (g->Mrr) *error = 1; - } // endif jvp + } // endif jsp type } // endif CheckMemory @@ -3663,33 +3759,7 @@ void jbin_object_list_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jbin_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; - int n = IsJson(args, 0); - - if (args->arg_count < 2) { - strcpy(message, "jbin_get_item must have at least 2 arguments"); - return true; - } else if (!n && args->arg_type[0] != STRING_RESULT) { - strcpy(message, "jbin_get_item first argument must be a json item"); - return true; - } else if (args->arg_type[1] != STRING_RESULT) { - strcpy(message, "Second argument is not a string (jpath)"); - return true; - } else - CalcLen(args, false, reslen, memlen); - - if (n == 2) { - char fn[_MAX_PATH]; - long fl; - - memcpy(fn, args->args[0], args->lengths[0]); - fn[args->lengths[0]] = 0; - fl = GetFileLength(fn); - memlen += fl * 3; - } else if (n != 3) - memlen += args->lengths[0] * 3; - - return JsonInit(initid, args, message, true, reslen, memlen); + return json_get_item_init(initid, args, message); } // end of jbin_get_item_init char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3699,7 +3769,7 @@ char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, PBSON bsp = NULL; if (g->N) { - bsp = (PBSON)g->Xchk; + bsp = (PBSON)g->Activityp; goto fin; } else if (initid->const_item) g->N = 1; @@ -3716,7 +3786,6 @@ char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, if ((p = jvp->GetString())) { if (!(jsp = ParseJson(g, p, strlen(p)))) { PUSH_WARNING(g->Message); - return NULL; } // endif jsp @@ -3750,7 +3819,7 @@ char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, if (initid->const_item) // Keep result of constant function - g->Xchk = bsp; + g->Activityp = (PACTIVITY)bsp; } // endif CheckMemory @@ -3774,21 +3843,7 @@ void jbin_get_item_deinit(UDF_INIT* initid) /*********************************************************************************/ my_bool jbin_item_merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { - unsigned long reslen, memlen; - - if (args->arg_count < 2) { - strcpy(message, "jbin_item_merge must have at least 2 arguments"); - return true; - } else if (!IsJson(args, 0)) { - strcpy(message, "jbin_item_merge first argument must be a json item"); - return true; - } else if (!IsJson(args, 1)) { - strcpy(message, "jbin_item_merge second argument must be a json item"); - return true; - } else - CalcLen(args, false, reslen, memlen, true); - - return JsonInit(initid, args, message, true, reslen, memlen); + return json_item_merge_init(initid, args, message); } // end of jbin_item_merge_init char *jbin_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3806,7 +3861,7 @@ char *jbin_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!CheckMemory(g, initid, args, 2, false, true)) { PJVAL jvp; - PJSON jsp[2] ={ NULL, NULL }; + PJSON jsp[2] = {NULL, NULL}; for (int i = 0; i < 2; i++) { jvp = MakeValue(g, args, i); @@ -3820,13 +3875,8 @@ char *jbin_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, } // endfor i - if (jsp[0]) { - if (jsp[0]->Merge(g, jsp[1])) - PUSH_WARNING(g->Message); - else - MakeBinResult(g, args, top, initid->max_length); - - } // endif jsp + if (jsp[0] && jsp[0]->Merge(g, jsp[1])) + PUSH_WARNING(g->Message); } // endif CheckMemory @@ -3853,27 +3903,31 @@ my_bool jbin_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) { unsigned long reslen, memlen, fl, more = 1024; - if (args->arg_count < 1 || args->arg_count > 3) { - strcpy(message, "jbin_file only accepts 1 to 3 arguments"); + if (args->arg_count < 1 || args->arg_count > 4) { + strcpy(message, "This function only accepts 1 to 4 arguments"); return true; } else if (args->arg_type[0] != STRING_RESULT || !args->args[0]) { - strcpy(message, "jbin_file first argument must be a constant string (file name)"); + strcpy(message, "First argument must be a constant string (file name)"); return true; - } else if (args->arg_count > 1 && args->arg_type[1] != INT_RESULT) { - strcpy(message, "Second argument is not an integer (pretty)"); + } else if (args->arg_count > 1 && args->arg_type[1] != STRING_RESULT) { + strcpy(message, "Second argument is not a string (path)"); return true; - } else if (args->arg_count > 2) { - if (args->arg_type[2] != INT_RESULT) { - strcpy(message, "Third argument is not an integer (memory)"); + } else if (args->arg_count > 2 && args->arg_type[2] != INT_RESULT) { + strcpy(message, "Third argument is not an integer (pretty)"); + return true; + } else if (args->arg_count > 3) { + if (args->arg_type[3] != INT_RESULT) { + strcpy(message, "Fourth argument is not an integer (memory)"); return true; } else - more += (ulong)*(longlong*)args->args[2]; + more += (ulong)*(longlong*)args->args[3]; } // endifs initid->maybe_null = 1; CalcLen(args, false, reslen, memlen); fl = GetFileLength(args->args[0]); + reslen += fl; more += fl * M; memlen += more; return JsonInit(initid, args, message, false, reslen, memlen); @@ -3882,11 +3936,10 @@ my_bool jbin_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char *jbin_file(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *res_length, char *is_null, char *error) { - char *fn, *memory; - int len, pretty; - HANDLE hFile; - MEMMAP mm; + char *fn; + int pretty, len = 0, pty = 3; PJSON jsp; + PJVAL jvp = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -3896,68 +3949,36 @@ char *jbin_file(UDF_INIT *initid, UDF_ARGS *args, char *result, PlugSubSet(g, g->Sarea, g->Sarea_Size); g->Xchk = NULL; fn = MakePSZ(g, args, 0); - pretty = (args->arg_count > 1) ? (int)*(longlong*)args->args[1] : 3; - - /*******************************************************************************/ - /* Create the mapping file object. */ - /*******************************************************************************/ - hFile = CreateFileMap(g, fn, &mm, MODE_READ, false); - - if (hFile == INVALID_HANDLE_VALUE) { - DWORD rc = GetLastError(); - - if (!(*g->Message)) - sprintf(g->Message, MSG(OPEN_MODE_ERROR), "map", (int)rc, fn); - - PUSH_WARNING(g->Message); - if (g->Mrr) *error = 1; - *is_null = 1; - return NULL; - } // endif hFile - - /*******************************************************************************/ - /* Get the file size (assuming file is smaller than 4 GB) */ - /*******************************************************************************/ - len = mm.lenL; - memory = (char *)mm.memory; - - if (!len) { // Empty or deleted file - CloseFileHandle(hFile); - *is_null = 1; - return NULL; - } // endif len - - if (!memory) { - CloseFileHandle(hFile); - sprintf(g->Message, MSG(MAP_VIEW_ERROR), fn, GetLastError()); - PUSH_WARNING(g->Message); - *is_null = 1; - if (g->Mrr) *error = 1; - return NULL; - } // endif Memory - - CloseFileHandle(hFile); // Not used anymore - hFile = INVALID_HANDLE_VALUE; // For Fblock + pretty = (args->arg_count > 2 && args->args[2]) ? (int)*(longlong*)args->args[2] : 3; /*********************************************************************************/ /* Parse the json file and allocate its tree structure. */ /*********************************************************************************/ - g->Message[0] = 0; - - if (!(jsp = ParseJson(g, memory, len, pretty))) { + if (!(jsp = ParseJsonFile(g, fn, &pty, len))) { PUSH_WARNING(g->Message); - if (g->Mrr) *error = 1; - } // endif jsp + *error = 1; + goto fin; + } // endif jsp - CloseMemMap(memory, len); + if (pty == 3) + PUSH_WARNING("File pretty format cannot be determined"); + else if (pretty != 3 && pty != pretty) + PUSH_WARNING("File pretty format doesn't match the specified pretty value"); + else if (pretty == 3) + pretty = pty; - if (jsp) { - bsp = JbinAlloc(g, args, len, jsp); - strcat(bsp->Msg, " file"); - bsp->Filename = fn; - bsp->Pretty = pretty; - } else + bsp = JbinAlloc(g, args, len, jsp); + strcat(bsp->Msg, " file"); + bsp->Filename = fn; + bsp->Pretty = pretty; + + // Check whether a path was specified + if (CheckPath(g, args, jsp, jvp, 1)) { + PUSH_WARNING(g->Message); bsp = NULL; + goto fin; + } else if (jvp) + bsp->Jsp = jvp->GetJsp(); if (initid->const_item) // Keep result of constant function @@ -3986,10 +4007,10 @@ my_bool json_serialize_init(UDF_INIT *initid, UDF_ARGS *args, char *message) unsigned long reslen, memlen; if (args->arg_count != 1) { - strcpy(message, "json_serialize must have 1 argument"); + strcpy(message, "This function must have 1 argument"); return true; } else if (IsJson(args, 0) != 3) { - strcpy(message, "json_serialize argument must be a Jbin tree"); + strcpy(message, "Argument must be a Jbin tree"); return true; } else CalcLen(args, false, reslen, memlen); diff --git a/storage/connect/mysql-test/connect/r/json_udf.result b/storage/connect/mysql-test/connect/r/json_udf.result index 6482e0b53b3..81acbea91a6 100644 --- a/storage/connect/mysql-test/connect/r/json_udf.result +++ b/storage/connect/mysql-test/connect/r/json_udf.result @@ -1,64 +1,147 @@ +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=VIR BLOCK_SIZE=5; # # Test UDF's with constant arguments # -SELECT Json_Array(); -Json_Array() -[] -SELECT Json_Object(56,3.1416,'foo',NULL); -Json_Object(56,3.1416,'foo',NULL) -{"56":56,"3.1416":3.141600,"foo":"foo","NULL":null} -SELECT Json_Object(56 qty,3.1416 price,'foo' truc, NULL garanty); -Json_Object(56 qty,3.1416 price,'foo' truc, NULL garanty) -{"qty":56,"price":3.141600,"truc":"foo","garanty":null} -SELECT Json_Array(56,3.1416,'My name is "Foo"',NULL); -Json_Array(56,3.1416,'My name is "Foo"',NULL) -[56,3.141600,"My name is \"Foo\"",null] -SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL)) Array; -ERROR HY000: Can't initialize function 'json_array_add'; json_array_add must have at least 2 arguments -SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; -Array -[56,3.141600,"foo",null,"One more"] -SELECT Json_Array_Add(JsonValue('one value'),'One more'); -ERROR HY000: Can't initialize function 'json_array_add'; json_array_add first argument must be a json item -SELECT Json_Array_Add('one value','One more'); -ERROR HY000: Can't initialize function 'json_array_add'; json_array_add first argument must be a json item -SELECT Json_Array_Add('one value' json_,'One more'); -Json_Array_Add('one value' json_,'One more') -NULL -Warnings: -Warning 1105 Error 2 opening one value -Warning 1105 Void JSON object -Warning 1105 First argument is not an array SELECT JsonValue(56,3.1416,'foo',NULL); -ERROR HY000: Can't initialize function 'jsonvalue'; jsonvalue cannot accept more than 1 argument +ERROR HY000: Can't initialize function 'jsonvalue'; Cannot accept more than 1 argument SELECT JsonValue(3.1416); JsonValue(3.1416) 3.141600 SELECT JsonValue('foo'); JsonValue('foo') "foo" +SELECT JsonValue(9223372036854775807); +JsonValue(9223372036854775807) +9223372036854775807 SELECT JsonValue(NULL); JsonValue(NULL) null +SELECT JsonValue(TRUE); +JsonValue(TRUE) +true +SELECT JsonValue(FALSE); +JsonValue(FALSE) +false SELECT JsonValue(); JsonValue() null -SELECT Json_Object(); -Json_Object() -{} -SELECT Json_Object(Json_Array(56,3.1416,'foo'),NULL); -Json_Object(Json_Array(56,3.1416,'foo'),NULL) -{"Array(56,3.1416,'foo')":[56,3.141600,"foo"],"NULL":null} +SELECT JsonValue('[11,22,33]' json_) FROM t1; +JsonValue('[11,22,33]' json_) +[11,22,33] +[11,22,33] +[11,22,33] +[11,22,33] +[11,22,33] +SELECT Json_Array(); +Json_Array() +[] +SELECT Json_Array(56,3.1416,'My name is "Foo"',NULL); +Json_Array(56,3.1416,'My name is "Foo"',NULL) +[56,3.141600,"My name is \"Foo\"",null] SELECT Json_Array(Json_Array(56,3.1416,'foo'),NULL); Json_Array(Json_Array(56,3.1416,'foo'),NULL) [[56,3.141600,"foo"],null] -SELECT Json_Array(Json_Object(56 "qty",3.1416 "price",'foo'),NULL); -Json_Array(Json_Object(56 "qty",3.1416 "price",'foo'),NULL) +SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL)) Array; +ERROR HY000: Can't initialize function 'json_array_add'; This function must have at least 2 arguments +SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; +Array +[56,3.141600,"foo",null,"One more"] +SELECT Json_Array_Add(JsonValue('one value'),'One more'); +ERROR HY000: Can't initialize function 'json_array_add'; First argument must be a json item +SELECT Json_Array_Add('one value','One more'); +ERROR HY000: Can't initialize function 'json_array_add'; First argument must be a json item +SELECT Json_Array_Add('one value' json_,'One more'); +Json_Array_Add('one value' json_,'One more') +one value +Warnings: +Warning 1105 Error 2 opening one value +Warning 1105 First argument target is not an array +SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 0); +Json_Array_Add('[5,3,8,7,9]' json_, 4, 0) +[4,5,3,8,7,9] +SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 2) Array; +Array +[5,3,4,8,7,9] +SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 9); +Json_Array_Add('[5,3,8,7,9]' json_, 4, 9) +[5,3,8,7,9,4] +SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array; +Array +[56,3.141600,"machin",null,"One more","Two more"] +SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1; +Array +[56,3.141600,"machin","One more","Two more"] +[56,3.141600,"machin","One more","Two more"] +[56,3.141600,"machin","One more","Two more"] +[56,3.141600,"machin","One more","Two more"] +[56,3.141600,"machin","One more","Two more"] +SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), n) Array FROM t1; +Array +[56,3.141600,"machin",1] +[56,3.141600,"machin",2] +[56,3.141600,"machin",3] +[56,3.141600,"machin",4] +[56,3.141600,"machin",5] +SELECT Json_Array_Add_Values(Json_Array(n, 3.1416, 'machin'), n) Array FROM t1; +Array +[1,3.141600,"machin",1] +[2,3.141600,"machin",2] +[3,3.141600,"machin",3] +[4,3.141600,"machin",4] +[5,3.141600,"machin",5] +SELECT Json_Array_Add_Values('[56]', 3.1416, 'machin') Array; +Array +[56,3.141600,"machin"] +SELECT Json_Array_Delete(Json_Array(56,3.1416,'My name is "Foo"',NULL),0); +Json_Array_Delete(Json_Array(56,3.1416,'My name is "Foo"',NULL),0) +[3.141600,"My name is \"Foo\"",null] +SELECT Json_Array_Delete(Json_Object(56,3.1416,'My name is Foo',NULL),2); +Json_Array_Delete(Json_Object(56,3.1416,'My name is Foo',NULL),2) +{"56":56,"3.1416":3.141600,"My name is Foo":"My name is Foo","NULL":null} +Warnings: +Warning 1105 First argument target is not an array +SELECT Json_Array_Delete(Json_Array(56,3.1416,'My name is "Foo"',NULL),'2'); +Json_Array_Delete(Json_Array(56,3.1416,'My name is "Foo"',NULL),'2') +[56,3.141600,"My name is \"Foo\"",null] +Warnings: +Warning 1105 Missing or null array index +SELECT Json_Object(56, 3.1416, 'foo', NULL); +Json_Object(56, 3.1416, 'foo', NULL) +{"56":56,"3.1416":3.141600,"foo":"foo","NULL":null} +SELECT Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty); +Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty) +{"qty":56,"price":3.141600,"truc":"foo","garanty":null} +SELECT Json_Object(); +Json_Object() +{} +SELECT Json_Object(Json_Array(56, 3.1416, 'foo'), NULL); +Json_Object(Json_Array(56, 3.1416, 'foo'), NULL) +{"Array(56, 3.1416, 'foo')":[56,3.141600,"foo"],"NULL":null} +SELECT Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL); +Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL) [{"qty":56,"price":3.141600,"foo":"foo"},null] +SELECT Json_Object_Add(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'blue' color); +Json_Object_Add(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'blue' color) +{"qty":56,"price":3.141600,"truc":"machin","garanty":null,"color":"blue"} +SELECT Json_Object_Add(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 45.99 price); +Json_Object_Add(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 45.99 price) +{"qty":56,"price":45.990000,"truc":"machin","garanty":null} +SELECT Json_Object_Delete(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'truc'); +Json_Object_Delete(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'truc') +{"qty":56,"price":3.141600,"garanty":null} +SELECT Json_Object_Delete(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'chose'); +Json_Object_Delete(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'chose') +{"qty":56,"price":3.141600,"truc":"machin","garanty":null} +SELECT Json_Object_List(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty)) "Key List"; +Key List +["qty","price","truc","garanty"] +SELECT Json_Object_List('{"qty":56, "price":3.1416, "truc":"machin", "garanty":null}') "Key List"; +Key List +["qty","price","truc","garanty"] # # Test UDF's with column arguments # -CREATE TABLE t1 +CREATE TABLE t2 ( ISBN CHAR(15), LANG CHAR(2), @@ -70,21 +153,20 @@ TRANSLATOR CHAR(80), PUBLISHER CHAR(32), DATEPUB int(4) ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; -SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t1; +SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t2; Json_Array(AUTHOR, TITLE, DATEPUB) ["Jean-Christophe Bernadac","Construire une application XML",1999] ["William J. Pardi","XML en Action",1999] -SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t1; +SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t2; Json_Object(AUTHOR, TITLE, DATEPUB) {"AUTHOR":"Jean-Christophe Bernadac","TITLE":"Construire une application XML","DATEPUB":1999} {"AUTHOR":"William J. Pardi","TITLE":"XML en Action","DATEPUB":1999} -SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t1; -ERROR HY000: Can't initialize function 'json_array_grp'; json_array_grp can only accept 1 argument -SELECT Json_Array_Grp(TITLE) FROM t1; +SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t2; +ERROR HY000: Can't initialize function 'json_array_grp'; This function can only accept 1 argument +SELECT Json_Array_Grp(TITLE) FROM t2; Json_Array_Grp(TITLE) ["Construire une application XML","XML en Action"] -DROP TABLE t1; -CREATE TABLE t1 ( +CREATE TABLE t3 ( SERIALNO CHAR(5) NOT NULL, NAME VARCHAR(12) NOT NULL FLAG=6, SEX SMALLINT(1) NOT NULL, @@ -94,10 +176,10 @@ DEPARTMENT CHAr(4) NOT NULL FLAG=41, SECRETARY CHAR(5) DEFAULT NULL FLAG=46, SALARY DOUBLE(8,2) NOT NULL FLAG=52 ) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1; -SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t1 WHERE NAME = 'MERCHANT'; +SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT'; Json_Object(SERIALNO, NAME, TITLE, SALARY) {"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000} -SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t1 GROUP BY DEPARTMENT; +SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t3 GROUP BY DEPARTMENT; DEPARTMENT Json_Array_Grp(NAME) 0021 ["STRONG","SHORTSIGHT"] 0318 ["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"] @@ -105,26 +187,26 @@ DEPARTMENT Json_Array_Grp(NAME) 2452 ["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"] Warnings: Warning 1105 Result truncated to json_grp_size values -set connect_json_grp_size=30; -SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t1 GROUP BY DEPARTMENT; +SET connect_json_grp_size=30; +SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT; Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) ["0021",["STRONG","SHORTSIGHT"]] ["0318",["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]] ["0319",["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]] ["2452",["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]] -SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t1 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT; Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) {"DEPARTMENT":"0021","NAMES":["STRONG","SHORTSIGHT"]} {"DEPARTMENT":"0318","NAMES":["BANCROFT","PLUMHEAD","HONEY","TONGHO","WALTER","SHRINKY","WERTHER","MERCHANT","WHEELFOR"]} {"DEPARTMENT":"0319","NAMES":["BULLOZER","QUINN","BROWNY","KITTY","MONAPENNY","MARTIN","FUNNIGUY","BUGHAPPY","FODDERMAN","MESSIFUL","GOOSEPEN"]} {"DEPARTMENT":"2452","NAMES":["BIGHEAD","ORELLY","BIGHORN","SMITH","CHERRY"]} -SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t1 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT; Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) {"DEPARTMENT":"0021","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","TITLE":"DIRECTOR","SALARY":23000.000000},{"SERIALNO":"22222","NAME":"SHORTSIGHT","TITLE":"SECRETARY","SALARY":5500.000000}]} {"DEPARTMENT":"0318","EMPLOYES":[{"SERIALNO":"74200","NAME":"BANCROFT","TITLE":"SALESMAN","SALARY":9600.000000},{"SERIALNO":"24888","NAME":"PLUMHEAD","TITLE":"TYPIST","SALARY":2800.000000},{"SERIALNO":"27845","NAME":"HONEY","TITLE":"SECRETARY","SALARY":4900.000000},{"SERIALNO":"73452","NAME":"TONGHO","TITLE":"ENGINEER","SALARY":6800.000000},{"SERIALNO":"74234","NAME":"WALTER","TITLE":"ENGINEER","SALARY":7400.000000},{"SERIALNO":"77777","NAME":"SHRINKY","TITLE":"ADMINISTRATOR","SALARY":7500.000000},{"SERIALNO":"70012","NAME":"WERTHER","TITLE":"DIRECTOR","SALARY":14500.000000},{"SERIALNO":"78943","NAME":"MERCHANT","TITLE":"SALESMAN","SALARY":8700.000000},{"SERIALNO":"73111","NAME":"WHEELFOR","TITLE":"SALESMAN","SALARY":10030.000000}]} {"DEPARTMENT":"0319","EMPLOYES":[{"SERIALNO":"76543","NAME":"BULLOZER","TITLE":"SALESMAN","SALARY":14800.000000},{"SERIALNO":"40567","NAME":"QUINN","TITLE":"DIRECTOR","SALARY":14000.000000},{"SERIALNO":"00137","NAME":"BROWNY","TITLE":"ENGINEER","SALARY":10500.000000},{"SERIALNO":"12345","NAME":"KITTY","TITLE":"TYPIST","SALARY":3000.450000},{"SERIALNO":"33333","NAME":"MONAPENNY","TITLE":"SECRETARY","SALARY":3800.000000},{"SERIALNO":"00023","NAME":"MARTIN","TITLE":"ENGINEER","SALARY":10000.000000},{"SERIALNO":"07654","NAME":"FUNNIGUY","TITLE":"ADMINISTRATOR","SALARY":8500.000000},{"SERIALNO":"45678","NAME":"BUGHAPPY","TITLE":"PROGRAMMER","SALARY":8500.000000},{"SERIALNO":"56789","NAME":"FODDERMAN","TITLE":"SALESMAN","SALARY":7000.000000},{"SERIALNO":"55555","NAME":"MESSIFUL","TITLE":"SECRETARY","SALARY":5000.500000},{"SERIALNO":"98765","NAME":"GOOSEPEN","TITLE":"ADMINISTRATOR","SALARY":4700.000000}]} {"DEPARTMENT":"2452","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","TITLE":"SCIENTIST","SALARY":8000.000000},{"SERIALNO":"31416","NAME":"ORELLY","TITLE":"ENGINEER","SALARY":13400.000000},{"SERIALNO":"36666","NAME":"BIGHORN","TITLE":"SCIENTIST","SALARY":11000.000000},{"SERIALNO":"02345","NAME":"SMITH","TITLE":"ENGINEER","SALARY":9000.000000},{"SERIALNO":"11111","NAME":"CHERRY","TITLE":"SECRETARY","SALARY":4500.000000}]} -SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t1 GROUP BY DEPARTMENT, TITLE; +SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE; Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) {"DEPARTMENT":"0021","TITLE":"DIRECTOR","EMPLOYES":[{"SERIALNO":"87777","NAME":"STRONG","SALARY":23000.000000}]} {"DEPARTMENT":"0021","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"22222","NAME":"SHORTSIGHT","SALARY":5500.000000}]} @@ -144,25 +226,372 @@ Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY {"DEPARTMENT":"2452","TITLE":"ENGINEER","EMPLOYES":[{"SERIALNO":"31416","NAME":"ORELLY","SALARY":13400.000000},{"SERIALNO":"02345","NAME":"SMITH","SALARY":9000.000000}]} {"DEPARTMENT":"2452","TITLE":"SCIENTIST","EMPLOYES":[{"SERIALNO":"34567","NAME":"BIGHEAD","SALARY":8000.000000},{"SERIALNO":"36666","NAME":"BIGHORN","SALARY":11000.000000}]} {"DEPARTMENT":"2452","TITLE":"SECRETARY","EMPLOYES":[{"SERIALNO":"11111","NAME":"CHERRY","SALARY":4500.000000}]} -SELECT Json_Object_Grp(SALARY) FROM t1; -ERROR HY000: Can't initialize function 'json_object_grp'; json_object_grp can only accept 2 arguments -SELECT Json_Object_Grp(SALARY, NAME) FROM t1; +SELECT Json_Object_Grp(SALARY) FROM t3; +ERROR HY000: Can't initialize function 'json_object_grp'; This function requires 2 arguments (value, key) +SELECT Json_Object_Grp(SALARY, NAME) FROM t3; Json_Object_Grp(SALARY, NAME) {"BANCROFT":9600.000000,"SMITH":9000.000000,"MERCHANT":8700.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"BIGHEAD":8000.000000,"SHRINKY":7500.000000,"WALTER":7400.000000,"FODDERMAN":7000.000000,"TONGHO":6800.000000,"SHORTSIGHT":5500.000000,"MESSIFUL":5000.500000,"HONEY":4900.000000,"GOOSEPEN":4700.000000,"CHERRY":4500.000000,"MONAPENNY":3800.000000,"KITTY":3000.450000,"PLUMHEAD":2800.000000,"STRONG":23000.000000,"BULLOZER":14800.000000,"WERTHER":14500.000000,"QUINN":14000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"BROWNY":10500.000000,"WHEELFOR":10030.000000,"MARTIN":10000.000000} -SELECT Json_Object(DEPARTMENT, Json_Object_Grp(SALARY, NAME) "Json_SALARIES") FROM t1 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, Json_Object_Grp(SALARY, NAME) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT; Json_Object(DEPARTMENT, Json_Object_Grp(SALARY, NAME) "Json_SALARIES") {"DEPARTMENT":"0021","SALARIES":{"STRONG":23000.000000,"SHORTSIGHT":5500.000000}} {"DEPARTMENT":"0318","SALARIES":{"BANCROFT":9600.000000,"PLUMHEAD":2800.000000,"HONEY":4900.000000,"TONGHO":6800.000000,"WALTER":7400.000000,"SHRINKY":7500.000000,"WERTHER":14500.000000,"MERCHANT":8700.000000,"WHEELFOR":10030.000000}} {"DEPARTMENT":"0319","SALARIES":{"BULLOZER":14800.000000,"QUINN":14000.000000,"BROWNY":10500.000000,"KITTY":3000.450000,"MONAPENNY":3800.000000,"MARTIN":10000.000000,"FUNNIGUY":8500.000000,"BUGHAPPY":8500.000000,"FODDERMAN":7000.000000,"MESSIFUL":5000.500000,"GOOSEPEN":4700.000000}} {"DEPARTMENT":"2452","SALARIES":{"BIGHEAD":8000.000000,"ORELLY":13400.000000,"BIGHORN":11000.000000,"SMITH":9000.000000,"CHERRY":4500.000000}} -SELECT Json_Array_Grp(NAME) from t1; +SELECT Json_Array_Grp(NAME) FROM t3; Json_Array_Grp(NAME) ["BANCROFT","SMITH","MERCHANT","FUNNIGUY","BUGHAPPY","BIGHEAD","SHRINKY","WALTER","FODDERMAN","TONGHO","SHORTSIGHT","MESSIFUL","HONEY","GOOSEPEN","CHERRY","MONAPENNY","KITTY","PLUMHEAD","STRONG","BULLOZER","WERTHER","QUINN","ORELLY","BIGHORN","BROWNY","WHEELFOR","MARTIN"] +# +# Test value getting UDF's +# +SELECT JsonGet_String(Json_Array_Grp(name),'[#]') FROM t3; +JsonGet_String(Json_Array_Grp(name),'[#]') +27 +SELECT JsonGet_String(Json_Array_Grp(name),'[","]') FROM t3; +JsonGet_String(Json_Array_Grp(name),'[","]') +BANCROFT,SMITH,MERCHANT,FUNNIGUY,BUGHAPPY,BIGHEAD,SHRINKY,WALTER,FODDERMAN,TONGHO,SHORTSIGHT,MESSIFUL,HONEY,GOOSEPEN,CHERRY,MONAPENNY,KITTY,PLUMHEAD,STRONG,BULLOZER,WERTHER,QUINN,ORELLY,BIGHORN,BROWNY,WHEELFOR,MARTIN +SELECT JsonGet_String(Json_Array_Grp(name),'[>]') FROM t3; +JsonGet_String(Json_Array_Grp(name),'[>]') +WHEELFOR +SET @j1 = '[45,28,36,45,89]'; +SELECT JsonGet_String(@j1,'[1]'); +JsonGet_String(@j1,'[1]') +28 +SELECT JsonGet_String(@j1 json_,'[3]'); +JsonGet_String(@j1 json_,'[3]') +45 +SELECT JsonGet_String(Json_Array(45,28,36,45,89),'[3]'); +JsonGet_String(Json_Array(45,28,36,45,89),'[3]') +45 +SELECT JsonGet_String(Json_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Array(45,28,36,45,89),'[+]') "sum"; +list egal sum +45+28+36+45+89 = 243.00 +SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]'); +JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]') +36 +SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*'); +JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*') +[36,45,89] +SELECT JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc'); +JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc') +machin +SET @j2 = '{"qty":56,"price":3.141600,"truc":"machin","garanty":null}'; +SELECT JsonGet_String(@j2 json_,'truc'); +JsonGet_String(@j2 json_,'truc') +machin +SELECT JsonGet_String(@j2,'truc'); +JsonGet_String(@j2,'truc') +machin +SELECT JsonGet_String(@j2,'chose'); +JsonGet_String(@j2,'chose') +NULL +SELECT JsonGet_String(NULL json_, NULL); +JsonGet_String(NULL json_, NULL) +NULL +Warnings: +Warning 1105 +SELECT department, JsonGet_String(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +department Sumsal +0021 28500.00 +0318 72230.00 +0319 89800.95 +2452 45900.00 +SELECT JsonGet_Int(@j1, '[4]'); +JsonGet_Int(@j1, '[4]') +89 +SELECT JsonGet_Int(@j1, '[#]'); +JsonGet_Int(@j1, '[#]') +5 +SELECT JsonGet_Int(@j1, '[+]'); +JsonGet_Int(@j1, '[+]') +243 +SELECT JsonGet_Int(@j1 json_,'[3]'); +JsonGet_Int(@j1 json_,'[3]') +45 +SELECT JsonGet_Int(Json_Array(45,28,36,45,89),'[3]'); +JsonGet_Int(Json_Array(45,28,36,45,89),'[3]') +45 +SELECT JsonGet_Int(Json_Array(45,28,36,45,89),'["+"]'); +JsonGet_Int(Json_Array(45,28,36,45,89),'["+"]') +45 +SELECT JsonGet_Int(Json_Array(45,28,36,45,89),'[+]'); +JsonGet_Int(Json_Array(45,28,36,45,89),'[+]') +243 +SELECT JsonGet_Int(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]'); +JsonGet_Int(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]') +36 +SELECT JsonGet_Int(Json_Array(json_array(45,28),json_array(36,45,89)),'[0]:[1]'); +JsonGet_Int(Json_Array(json_array(45,28),json_array(36,45,89)),'[0]:[1]') +28 +SELECT JsonGet_Int(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'qty'); +JsonGet_Int(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'qty') +56 +SELECT JsonGet_Int(@j2 json_,'price'); +JsonGet_Int(@j2 json_,'price') +3 +SELECT JsonGet_Int(@j2,'qty'); +JsonGet_Int(@j2,'qty') +56 +SELECT JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','chose'); +JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','chose') +NULL +Warnings: +Warning 1105 Value not found +SELECT JsonGet_Int(JsonGet_String(Json_Array(Json_Array(45,28),Json_Array(36,45,89)),'[1]:*'),'[+]') sum; +sum +170 +SELECT department, JsonGet_Int(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +department Sumsal +0021 28500 +0318 72230 +0319 89800 +2452 45900 +SELECT JsonGet_Real(@j1, '[2]'); +JsonGet_Real(@j1, '[2]') +36.000000000000000 +SELECT JsonGet_Real(@j1 json_,'[3]',2); +JsonGet_Real(@j1 json_,'[3]',2) +45.00 +SELECT JsonGet_Real(Json_Array(45,28,36,45,89),'[3]'); +JsonGet_Real(Json_Array(45,28,36,45,89),'[3]') +45.000000000000000 +SELECT JsonGet_Real(Json_Array(45,28,36,45,89),'["+"]'); +JsonGet_Real(Json_Array(45,28,36,45,89),'["+"]') +45.000000000000000 +SELECT JsonGet_Real(Json_Array(45,28,36,45,89),'[+]'); +JsonGet_Real(Json_Array(45,28,36,45,89),'[+]') +243.000000000000000 +SELECT JsonGet_Real(Json_Array(45,28,36,45,89),'[!]'); +JsonGet_Real(Json_Array(45,28,36,45,89),'[!]') +48.600000000000000 +SELECT JsonGet_Real(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]'); +JsonGet_Real(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]') +36.000000000000000 +SELECT JsonGet_Real(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'price'); +JsonGet_Real(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'price') +3.141600000000000 +SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_,'qty'); +JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_,'qty') +56.000000000000000 +SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','price'); +JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','price') +3.141600000000000 +SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','price', 4); +JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','price', 4) +3.1416 +SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','chose'); +JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','chose') +NULL +Warnings: +Warning 1105 Value not found +SELECT department, JsonGet_Real(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +department Sumsal +0021 28500.000000000000000 +0318 72230.000000000000000 +0319 89800.950000000000000 +2452 45900.000000000000000 +# +# Documentation examples +# +SELECT +JsonGet_Int(Json_Array(45,28,36,45,89), '[4]') "Rank", +JsonGet_Int(Json_Array(45,28,36,45,89), '[#]') "Number", +JsonGet_String(Json_Array(45,28,36,45,89), '[","]') "Concat", +JsonGet_Int(Json_Array(45,28,36,45,89), '[+]') "Sum", +JsonGet_Real(Json_Array(45,28,36,45,89), '[!]', 2) "Avg"; +Rank Number Concat Sum Avg +89 5 45,28,36,45,89 243 48.60 +SELECT +JsonGet_String('{"qty":7,"price":29.50,"garanty":null}','price') "String", +JsonGet_Int('{"qty":7,"price":29.50,"garanty":null}','price') "Int", +JsonGet_Real('{"qty":7,"price":29.50,"garanty":null}','price') "Real"; +String Int Real +29.50 29 29.500000000000000 +SELECT JsonGet_Real('{"qty":7,"price":29.50,"garanty":null}','price',3) "Real"; +Real +29.500 +# +# Testing Locate +# +SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin'); +JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin') +truc +SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56); +JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56) +qty +SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416); +JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416) +price +SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose'); +JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose') +NULL +SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'Jack') Path; +Path +AUTHORS:[1]:FN +SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'jack' ci) Path; +Path +AUTHORS:[1]:FN +SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"Jack", "LN":"London"}' json_) Path; +Path +AUTHORS:[1] +SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"jack", "LN":"London"}' json_) Path; +Path +NULL +SELECT JsonLocate('[45,28,36,45,89]',36); +JsonLocate('[45,28,36,45,89]',36) +[2] +SELECT JsonLocate('[45,28,36,45,89]' json_,28.0); +JsonLocate('[45,28,36,45,89]' json_,28.0) +NULL +SELECT Json_Locate_All('[45,28,36,45,89]',10); +Json_Locate_All('[45,28,36,45,89]',10) +[] +SELECT Json_Locate_All('[45,28,36,45,89]',45); +Json_Locate_All('[45,28,36,45,89]',45) +["[0]","[3]"] +SELECT Json_Locate_All('[[45,28],36,45,89]',45); +Json_Locate_All('[[45,28],36,45,89]',45) +["[0]:[0]","[2]"] +SELECT Json_Locate_All('[[45,28,45],36,45,89]',45); +Json_Locate_All('[[45,28,45],36,45,89]',45) +["[0]:[0]","[0]:[2]","[2]"] +SELECT Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]')); +Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]')) +["[0]:[0]","[0]:[2]","[2]"] +SELECT JsonLocate('[[45,28,45],36,45,89]',45,n) from t1; +JsonLocate('[[45,28,45],36,45,89]',45,n) +[0]:[0] +[0]:[2] +[2] +NULL +NULL +SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) FROM t1; +JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) +[0]:[0] +[0]:[2] +[2] +NULL +NULL +SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) AS `Path` FROM t1 GROUP BY n HAVING `Path` IS NOT NULL; +Path +[0]:[0] +[0]:[2] +[2] +SELECT Json_Locate_All('[45,28,[36,45,89]]',45); +Json_Locate_All('[45,28,[36,45,89]]',45) +["[0]","[2]:[1]"] +SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0)); +Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0)) +[] +SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',45.0); +Json_Locate_All('[[45,28],[36,45.0,89]]',45.0) +["[1]:[1]"] +SELECT JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_); +JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_) +[1] +SELECT JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_); +JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_) +[0] +SELECT Json_Locate_All('[[45,28],[[36,45],89]]','45') "All paths"; +All paths +[] +SELECT Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_); +Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_) +["[1]:[0]"] +SELECT JsonGet_Int(Json_Locate_All('[[45,28],[[36,45],89]]',45), '[#]') "Nb of occurs"; +Nb of occurs +2 +SELECT Json_Locate_All('[[45,28],[[36,45],89]]',45,2); +Json_Locate_All('[[45,28],[[36,45],89]]',45,2) +["[0]:[0]"] +SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]'); +JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]') +[0] +SELECT JsonLocate(Json_File('test/biblio.json'), 'Knab'); +JsonLocate(Json_File('test/biblio.json'), 'Knab') +[0]:AUTHOR:[1]:LASTNAME +SELECT Json_Locate_All('test/biblio.json' jfile_, 'Knab'); +Json_Locate_All('test/biblio.json' jfile_, 'Knab') +["[0]:AUTHOR:[1]:LASTNAME"] +# +# Testing json files +# +select Jfile_Make('[{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]}, +{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]}, +{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]}, +{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":40},"ratings":[5,8,7]}]', 'test/fx.json', 0) AS NewFile; +NewFile +test/fx.json +SELECT Jfile_Make('test/fx.json', 1); +Jfile_Make('test/fx.json', 1) +test/fx.json +SELECT Jfile_Make('test/fx.json' jfile_); +Jfile_Make('test/fx.json' jfile_) +test/fx.json +SELECT Jfile_Make(Jbin_File('test/fx.json'), 0); +Jfile_Make(Jbin_File('test/fx.json'), 0) +test/fx.json +SELECT Json_File('test/fx.json', 1); +Json_File('test/fx.json', 1) +[{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]},{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]},{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]},{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":40},"ratings":[5,8,7]}] +Warnings: +Warning 1105 File pretty format doesn't match the specified pretty value +SELECT Json_File('test/fx.json', 2); +Json_File('test/fx.json', 2) +[{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]},{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]},{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]},{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":40},"ratings":[5,8,7]}] +Warnings: +Warning 1105 File pretty format doesn't match the specified pretty value +SELECT Json_File('test/fx.json', 0); +Json_File('test/fx.json', 0) +[{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]},{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]},{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]},{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":40},"ratings":[5,8,7]}] +SELECT Json_File('test/fx.json', '[0]'); +Json_File('test/fx.json', '[0]') +{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]} +SELECT Json_File('test/fx.json', '[?]'); +Json_File('test/fx.json', '[?]') +NULL +Warnings: +Warning 1105 Invalid function specification ? +SELECT JsonGet_String(Json_File('test/fx.json'), '[1]:*'); +JsonGet_String(Json_File('test/fx.json'), '[1]:*') +{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]} +SELECT JsonGet_String(Json_File('test/fx.json'), '[1]'); +JsonGet_String(Json_File('test/fx.json'), '[1]') +6 car roadster 56000 ??? +SELECT JsonGet_Int(Json_File('test/fx.json'), '[1]:mileage') AS Mileage; +Mileage +56000 +SELECT JsonGet_Real(Json_File('test/fx.json'), '[0]:price', 2) AS Price; +Price +5.65 +SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings'); +Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings') +{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4,6]} +SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings'); +Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings') +{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,6,4]} +SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1); +Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1) +{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,6,4]} +SELECT Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0); +Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0) +[6,2,4] +SELECT Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1); +Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1) +{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2]} +SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin); +Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin) +{"_id":7,"type":"food","item":"meat","origin":"france","ratings":[2,4]} +SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size'); +Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size') +{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]} +Warnings: +Warning 1105 No sub-item at 'size' +SELECT Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size'); +Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size') +{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":70},"ratings":[5,8,7]} +SELECT Json_Object_List(Json_File('test/fx.json', '[3]:size')); +Json_Object_List(Json_File('test/fx.json', '[3]:size')) +["W","L","H"] DROP TABLE t1; -DROP FUNCTION Json_Array; -DROP FUNCTION Json_Array_Add; -DROP FUNCTION Json_Object; -DROP FUNCTION Json_Object_Nonull; -DROP FUNCTION JsonValue; -DROP FUNCTION Json_Array_Grp; -DROP FUNCTION Json_Object_Grp; +DROP TABLE t2; +DROP TABLE t3; diff --git a/storage/connect/mysql-test/connect/std_data/biblio.json b/storage/connect/mysql-test/connect/std_data/biblio.json index cc24b162cd9..dcf9592296c 100644 --- a/storage/connect/mysql-test/connect/std_data/biblio.json +++ b/storage/connect/mysql-test/connect/std_data/biblio.json @@ -24,12 +24,10 @@ "ISBN": "9782840825685", "LANG": "fr", "SUBJECT": "applications", - "AUTHOR": [ - { - "FIRSTNAME": "William J.", - "LASTNAME": "Pardi" - } - ], + "AUTHOR": { + "FIRSTNAME": "William J.", + "LASTNAME": "Pardi" + }, "TITLE": "XML en Action", "TRANSLATION": "adapté de l'anglais par", "TRANSLATOR": { diff --git a/storage/connect/mysql-test/connect/t/json_udf.inc b/storage/connect/mysql-test/connect/t/json_udf.inc index a79fced6392..de411696885 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.inc +++ b/storage/connect/mysql-test/connect/t/json_udf.inc @@ -11,11 +11,38 @@ if (!$HA_CONNECT_SO) { CREATE FUNCTION json_array RETURNS STRING SONAME 'ha_connect'; CREATE FUNCTION json_array_add RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_array_add_values RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_array_delete RETURNS STRING SONAME 'ha_connect'; CREATE FUNCTION json_object RETURNS STRING SONAME 'ha_connect'; CREATE FUNCTION json_object_nonull RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_object_add RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_object_delete RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_object_list RETURNS STRING SONAME 'ha_connect'; CREATE FUNCTION jsonvalue RETURNS STRING SONAME 'ha_connect'; CREATE AGGREGATE FUNCTION json_array_grp RETURNS STRING SONAME 'ha_connect'; CREATE AGGREGATE FUNCTION json_object_grp RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_item_merge RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_get_item RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jsonget_string RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jsonget_int RETURNS INTEGER SONAME 'ha_connect'; +CREATE FUNCTION jsonget_real RETURNS REAL SONAME 'ha_connect'; +CREATE FUNCTION jsonlocate RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_locate_all RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_file RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jfile_make RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION json_serialize RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_array RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_array_add_values RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_array_add RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_array_delete RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_object RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_object_nonull RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_object_add RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_object_delete RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_object_list RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_get_item RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_item_merge RETURNS STRING SONAME 'ha_connect'; +CREATE FUNCTION jbin_file RETURNS STRING SONAME 'ha_connect'; --enable_query_log diff --git a/storage/connect/mysql-test/connect/t/json_udf.test b/storage/connect/mysql-test/connect/t/json_udf.test index e322a175bf6..d05dd28f16c 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.test +++ b/storage/connect/mysql-test/connect/t/json_udf.test @@ -5,13 +5,25 @@ let $MYSQLD_DATADIR= `select @@datadir`; --copy_file $MTR_SUITE_DIR/std_data/biblio.json $MYSQLD_DATADIR/test/biblio.json --copy_file $MTR_SUITE_DIR/std_data/employee.dat $MYSQLD_DATADIR/test/employee.dat +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=VIR BLOCK_SIZE=5; + --echo # --echo # Test UDF's with constant arguments --echo # +--error ER_CANT_INITIALIZE_UDF +SELECT JsonValue(56,3.1416,'foo',NULL); +SELECT JsonValue(3.1416); +SELECT JsonValue('foo'); +SELECT JsonValue(9223372036854775807); +SELECT JsonValue(NULL); +SELECT JsonValue(TRUE); +SELECT JsonValue(FALSE); +SELECT JsonValue(); +SELECT JsonValue('[11,22,33]' json_) FROM t1; +# SELECT Json_Array(); -SELECT Json_Object(56,3.1416,'foo',NULL); -SELECT Json_Object(56 qty,3.1416 price,'foo' truc, NULL garanty); SELECT Json_Array(56,3.1416,'My name is "Foo"',NULL); +SELECT Json_Array(Json_Array(56,3.1416,'foo'),NULL); --error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL)) Array; SELECT Json_Array_Add(Json_Array(56,3.1416,'foo',NULL),'One more') Array; @@ -20,21 +32,35 @@ SELECT Json_Array_Add(JsonValue('one value'),'One more'); --error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add('one value','One more'); SELECT Json_Array_Add('one value' json_,'One more'); ---error ER_CANT_INITIALIZE_UDF -SELECT JsonValue(56,3.1416,'foo',NULL); -SELECT JsonValue(3.1416); -SELECT JsonValue('foo'); -SELECT JsonValue(NULL); -SELECT JsonValue(); +SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 0); +SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 2) Array; +SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 9); +SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin', NULL), 'One more', 'Two more') Array; +SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), 'One more', 'Two more') Array FROM t1; +SELECT Json_Array_Add_Values(Json_Array(56, 3.1416, 'machin'), n) Array FROM t1; +SELECT Json_Array_Add_Values(Json_Array(n, 3.1416, 'machin'), n) Array FROM t1; +SELECT Json_Array_Add_Values('[56]', 3.1416, 'machin') Array; +# +SELECT Json_Array_Delete(Json_Array(56,3.1416,'My name is "Foo"',NULL),0); +SELECT Json_Array_Delete(Json_Object(56,3.1416,'My name is Foo',NULL),2); +SELECT Json_Array_Delete(Json_Array(56,3.1416,'My name is "Foo"',NULL),'2'); +# +SELECT Json_Object(56, 3.1416, 'foo', NULL); +SELECT Json_Object(56 qty, 3.1416 price, 'foo' truc, NULL garanty); SELECT Json_Object(); -SELECT Json_Object(Json_Array(56,3.1416,'foo'),NULL); -SELECT Json_Array(Json_Array(56,3.1416,'foo'),NULL); -SELECT Json_Array(Json_Object(56 "qty",3.1416 "price",'foo'),NULL); +SELECT Json_Object(Json_Array(56, 3.1416, 'foo'), NULL); +SELECT Json_Array(Json_Object(56 "qty", 3.1416 "price", 'foo') ,NULL); +SELECT Json_Object_Add(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'blue' color); +SELECT Json_Object_Add(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 45.99 price); +SELECT Json_Object_Delete(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'truc'); +SELECT Json_Object_Delete(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty), 'chose'); +SELECT Json_Object_List(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty)) "Key List"; +SELECT Json_Object_List('{"qty":56, "price":3.1416, "truc":"machin", "garanty":null}') "Key List"; --echo # --echo # Test UDF's with column arguments --echo # -CREATE TABLE t1 +CREATE TABLE t2 ( ISBN CHAR(15), LANG CHAR(2), @@ -47,14 +73,13 @@ CREATE TABLE t1 DATEPUB int(4) ) ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='biblio.json'; -SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t1; -SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t1; +SELECT Json_Array(AUTHOR, TITLE, DATEPUB) FROM t2; +SELECT Json_Object(AUTHOR, TITLE, DATEPUB) FROM t2; --error ER_CANT_INITIALIZE_UDF -SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t1; -SELECT Json_Array_Grp(TITLE) FROM t1; -DROP TABLE t1; +SELECT Json_Array_Grp(TITLE, DATEPUB) FROM t2; +SELECT Json_Array_Grp(TITLE) FROM t2; -CREATE TABLE t1 ( +CREATE TABLE t3 ( SERIALNO CHAR(5) NOT NULL, NAME VARCHAR(12) NOT NULL FLAG=6, SEX SMALLINT(1) NOT NULL, @@ -65,30 +90,156 @@ CREATE TABLE t1 ( SALARY DOUBLE(8,2) NOT NULL FLAG=52 ) ENGINE=CONNECT TABLE_TYPE=FIX BLOCK_SIZE=8 FILE_NAME='employee.dat' ENDING=1; -SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t1 WHERE NAME = 'MERCHANT'; -SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t1 GROUP BY DEPARTMENT; -set connect_json_grp_size=30; -SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t1 GROUP BY DEPARTMENT; -SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t1 GROUP BY DEPARTMENT; -SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t1 GROUP BY DEPARTMENT; -SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t1 GROUP BY DEPARTMENT, TITLE; +SELECT Json_Object(SERIALNO, NAME, TITLE, SALARY) FROM t3 WHERE NAME = 'MERCHANT'; +SELECT DEPARTMENT, Json_Array_Grp(NAME) FROM t3 GROUP BY DEPARTMENT; +SET connect_json_grp_size=30; +SELECT Json_Array(DEPARTMENT, Json_Array_Grp(NAME)) FROM t3 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, Json_Array_Grp(NAME) json_NAMES) FROM t3 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, Json_Array_Grp(Json_Object(SERIALNO, NAME, TITLE, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT; +SELECT Json_Object(DEPARTMENT, TITLE, Json_Array_Grp(Json_Object(SERIALNO, NAME, SALARY)) json_EMPLOYES) FROM t3 GROUP BY DEPARTMENT, TITLE; --error ER_CANT_INITIALIZE_UDF -SELECT Json_Object_Grp(SALARY) FROM t1; -SELECT Json_Object_Grp(SALARY, NAME) FROM t1; -SELECT Json_Object(DEPARTMENT, Json_Object_Grp(SALARY, NAME) "Json_SALARIES") FROM t1 GROUP BY DEPARTMENT; -SELECT Json_Array_Grp(NAME) from t1; -DROP TABLE t1; +SELECT Json_Object_Grp(SALARY) FROM t3; +SELECT Json_Object_Grp(SALARY, NAME) FROM t3; +SELECT Json_Object(DEPARTMENT, Json_Object_Grp(SALARY, NAME) "Json_SALARIES") FROM t3 GROUP BY DEPARTMENT; +SELECT Json_Array_Grp(NAME) FROM t3; -DROP FUNCTION Json_Array; -DROP FUNCTION Json_Array_Add; -DROP FUNCTION Json_Object; -DROP FUNCTION Json_Object_Nonull; -DROP FUNCTION JsonValue; -DROP FUNCTION Json_Array_Grp; -DROP FUNCTION Json_Object_Grp; +--echo # +--echo # Test value getting UDF's +--echo # +SELECT JsonGet_String(Json_Array_Grp(name),'[#]') FROM t3; +SELECT JsonGet_String(Json_Array_Grp(name),'[","]') FROM t3; +SELECT JsonGet_String(Json_Array_Grp(name),'[>]') FROM t3; +SET @j1 = '[45,28,36,45,89]'; +SELECT JsonGet_String(@j1,'[1]'); +SELECT JsonGet_String(@j1 json_,'[3]'); +SELECT JsonGet_String(Json_Array(45,28,36,45,89),'[3]'); +SELECT JsonGet_String(Json_Array(45,28,36,45,89),'["+"]') "list",'=' as "egal",JsonGet_String(Json_Array(45,28,36,45,89),'[+]') "sum"; +SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]'); +SELECT JsonGet_String(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:*'); +SELECT JsonGet_String(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'truc'); +SET @j2 = '{"qty":56,"price":3.141600,"truc":"machin","garanty":null}'; +SELECT JsonGet_String(@j2 json_,'truc'); +SELECT JsonGet_String(@j2,'truc'); +SELECT JsonGet_String(@j2,'chose'); +SELECT JsonGet_String(NULL json_, NULL); +SELECT department, JsonGet_String(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +# +SELECT JsonGet_Int(@j1, '[4]'); +SELECT JsonGet_Int(@j1, '[#]'); +SELECT JsonGet_Int(@j1, '[+]'); +SELECT JsonGet_Int(@j1 json_,'[3]'); +SELECT JsonGet_Int(Json_Array(45,28,36,45,89),'[3]'); +SELECT JsonGet_Int(Json_Array(45,28,36,45,89),'["+"]'); +SELECT JsonGet_Int(Json_Array(45,28,36,45,89),'[+]'); +SELECT JsonGet_Int(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]'); +SELECT JsonGet_Int(Json_Array(json_array(45,28),json_array(36,45,89)),'[0]:[1]'); +SELECT JsonGet_Int(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'qty'); +SELECT JsonGet_Int(@j2 json_,'price'); +SELECT JsonGet_Int(@j2,'qty'); +SELECT JsonGet_Int('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','chose'); +SELECT JsonGet_Int(JsonGet_String(Json_Array(Json_Array(45,28),Json_Array(36,45,89)),'[1]:*'),'[+]') sum; +SELECT department, JsonGet_Int(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; +# +SELECT JsonGet_Real(@j1, '[2]'); +SELECT JsonGet_Real(@j1 json_,'[3]',2); +SELECT JsonGet_Real(Json_Array(45,28,36,45,89),'[3]'); +SELECT JsonGet_Real(Json_Array(45,28,36,45,89),'["+"]'); +SELECT JsonGet_Real(Json_Array(45,28,36,45,89),'[+]'); +SELECT JsonGet_Real(Json_Array(45,28,36,45,89),'[!]'); +SELECT JsonGet_Real(Json_Array(json_array(45,28),json_array(36,45,89)),'[1]:[0]'); +SELECT JsonGet_Real(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'price'); +SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}' json_,'qty'); +SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','price'); +SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','price', 4); +SELECT JsonGet_Real('{"qty":56,"price":3.141600,"truc":"machin","garanty":null}','chose'); +SELECT department, JsonGet_Real(Json_Object(department, Json_Array_Grp(salary) "Json_salaries"),'salaries:[+]') Sumsal FROM t3 GROUP BY department; + +--echo # +--echo # Documentation examples +--echo # +SELECT + JsonGet_Int(Json_Array(45,28,36,45,89), '[4]') "Rank", + JsonGet_Int(Json_Array(45,28,36,45,89), '[#]') "Number", + JsonGet_String(Json_Array(45,28,36,45,89), '[","]') "Concat", + JsonGet_Int(Json_Array(45,28,36,45,89), '[+]') "Sum", + JsonGet_Real(Json_Array(45,28,36,45,89), '[!]', 2) "Avg"; +SELECT + JsonGet_String('{"qty":7,"price":29.50,"garanty":null}','price') "String", + JsonGet_Int('{"qty":7,"price":29.50,"garanty":null}','price') "Int", + JsonGet_Real('{"qty":7,"price":29.50,"garanty":null}','price') "Real"; +SELECT JsonGet_Real('{"qty":7,"price":29.50,"garanty":null}','price',3) "Real"; + +--echo # +--echo # Testing Locate +--echo # +SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'machin'); +SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),56); +SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),3.1416); +SELECT JsonLocate(Json_Object(56 qty,3.1416 price,'machin' truc, NULL garanty),'chose'); +SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'Jack') Path; +SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, 'jack' ci) Path; +SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"Jack", "LN":"London"}' json_) Path; +SELECT JsonLocate('{"AUTHORS":[{"FN":"Jules", "LN":"Verne"}, {"FN":"Jack", "LN":"London"}]}' json_, '{"FN":"jack", "LN":"London"}' json_) Path; +SELECT JsonLocate('[45,28,36,45,89]',36); +SELECT JsonLocate('[45,28,36,45,89]' json_,28.0); +SELECT Json_Locate_All('[45,28,36,45,89]',10); +SELECT Json_Locate_All('[45,28,36,45,89]',45); +SELECT Json_Locate_All('[[45,28],36,45,89]',45); +SELECT Json_Locate_All('[[45,28,45],36,45,89]',45); +SELECT Json_Locate_All('[[45,28,45],36,45,89]',JsonGet_Int('[3,45]','[1]')); +SELECT JsonLocate('[[45,28,45],36,45,89]',45,n) from t1; +SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) FROM t1; +SELECT JsonGet_String(Json_Locate_All('[[45,28,45],36,45,89]',45),concat('[',n-1,']')) AS `Path` FROM t1 GROUP BY n HAVING `Path` IS NOT NULL; +SELECT Json_Locate_All('[45,28,[36,45,89]]',45); +SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',JsonValue(45.0)); +SELECT Json_Locate_All('[[45,28],[36,45.0,89]]',45.0); +SELECT JsonLocate('[[45,28],[36,45,89]]','[36,45,89]' json_); +SELECT JsonLocate('[[45,28],[36,45,89]]','[45,28]' json_); +SELECT Json_Locate_All('[[45,28],[[36,45],89]]','45') "All paths"; +SELECT Json_Locate_All('[[45,28],[[36,45],89]]','[36,45]' json_); +SELECT JsonGet_Int(Json_Locate_All('[[45,28],[[36,45],89]]',45), '[#]') "Nb of occurs"; +SELECT Json_Locate_All('[[45,28],[[36,45],89]]',45,2); +SELECT JsonGet_String(Json_Locate_All('[45,28,36,45,89]',45),'[0]'); +SELECT JsonLocate(Json_File('test/biblio.json'), 'Knab'); +SELECT Json_Locate_All('test/biblio.json' jfile_, 'Knab'); + +--echo # +--echo # Testing json files +--echo # +select Jfile_Make('[{"_id":5,"type":"food","item":"beer","taste":"light","price":5.65,"ratings":[5,8,9]}, +{"_id":6,"type":"car","item":"roadster","mileage":56000,"ratings":[6,9]}, +{"_id":7,"type":"food","item":"meat","origin":"argentina","ratings":[2,4]}, +{"_id":8,"type":"furniture","item":"table","size":{"W":60,"L":80,"H":40},"ratings":[5,8,7]}]', 'test/fx.json', 0) AS NewFile; +SELECT Jfile_Make('test/fx.json', 1); +SELECT Jfile_Make('test/fx.json' jfile_); +SELECT Jfile_Make(Jbin_File('test/fx.json'), 0); +SELECT Json_File('test/fx.json', 1); +SELECT Json_File('test/fx.json', 2); +SELECT Json_File('test/fx.json', 0); +SELECT Json_File('test/fx.json', '[0]'); +SELECT Json_File('test/fx.json', '[?]'); +SELECT JsonGet_String(Json_File('test/fx.json'), '[1]:*'); +SELECT JsonGet_String(Json_File('test/fx.json'), '[1]'); +SELECT JsonGet_Int(Json_File('test/fx.json'), '[1]:mileage') AS Mileage; +SELECT JsonGet_Real(Json_File('test/fx.json'), '[0]:price', 2) AS Price; +SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings'); +SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 1, 'ratings'); +SELECT Json_Array_Add(Json_File('test/fx.json', '[2]'), 6, 'ratings', 1); +SELECT Json_Array_Add(Json_File('test/fx.json', '[2]:ratings'), 6, 0); +SELECT Json_Array_Delete(Json_File('test/fx.json', '[2]'), 'ratings', 1); +SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 'france' origin); +SELECT Json_Object_Add(Json_File('test/fx.json', '[2]'), 70 H, 'size'); +SELECT Json_Object_Add(Json_File('test/fx.json', '[3]'), 70 H, 'size'); +SELECT Json_Object_List(Json_File('test/fx.json', '[3]:size')); + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; # # Clean up # +--source json_udf2.inc --remove_file $MYSQLD_DATADIR/test/biblio.json --remove_file $MYSQLD_DATADIR/test/employee.dat +--remove_file $MYSQLD_DATADIR/test/fx.json diff --git a/storage/connect/mysql-test/connect/t/json_udf2.inc b/storage/connect/mysql-test/connect/t/json_udf2.inc new file mode 100644 index 00000000000..e5609bfd1f8 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/json_udf2.inc @@ -0,0 +1,39 @@ +--disable_query_log + +DROP FUNCTION jsonvalue; +DROP FUNCTION json_array; +DROP FUNCTION json_array_add; +DROP FUNCTION json_array_add_values; +DROP FUNCTION json_array_delete; +DROP FUNCTION json_object; +DROP FUNCTION json_object_nonull; +DROP FUNCTION json_object_add; +DROP FUNCTION json_object_delete; +DROP FUNCTION json_object_list; +DROP FUNCTION json_array_grp; +DROP FUNCTION json_object_grp; +DROP FUNCTION json_item_merge; +DROP FUNCTION json_get_item; +DROP FUNCTION JsonGet_string; +DROP FUNCTION JsonGet_int; +DROP FUNCTION JsonGet_real; +DROP FUNCTION jsonlocate; +DROP FUNCTION json_locate_all; +DROP FUNCTION json_file; +DROP FUNCTION json_serialize; +DROP FUNCTION jfile_make; +DROP FUNCTION jbin_array; +DROP FUNCTION jbin_array_add_values; +DROP FUNCTION jbin_array_add; +DROP FUNCTION jbin_array_delete; +DROP FUNCTION jbin_object; +DROP FUNCTION jbin_object_nonull; +DROP FUNCTION jbin_object_add; +DROP FUNCTION jbin_object_delete; +DROP FUNCTION jbin_object_list; +DROP FUNCTION jbin_get_item; +DROP FUNCTION jbin_item_merge; +DROP FUNCTION jbin_file; + +--enable_query_log + diff --git a/storage/connect/tabjson.cpp b/storage/connect/tabjson.cpp index 7d014712bcb..8f7b9508e60 100644 --- a/storage/connect/tabjson.cpp +++ b/storage/connect/tabjson.cpp @@ -659,7 +659,7 @@ int TDBJSN::ReadDB(PGLOBAL g) if (!IsRead() && ((rc = ReadBuffer(g)) != RC_OK)) { // Deferred reading failed } else if (!(Row = ParseJson(g, To_Line, - strlen(To_Line), Pretty, &Comma))) { + strlen(To_Line), &Pretty, &Comma))) { rc = (Pretty == 1 && !strcmp(To_Line, "]")) ? RC_EF : RC_FX; } else { Row = FindRow(g); @@ -1384,7 +1384,7 @@ void JSONCOL::WriteColumn(PGLOBAL g) if (Nodes[Nod-1].Op == OP_XX) { s = Value->GetCharValue(); - if (!(jsp = ParseJson(g, s, (int)strlen(s), 0))) { + if (!(jsp = ParseJson(g, s, (int)strlen(s)))) { strcpy(g->Message, s); longjmp(g->jumper[g->jump_level], 666); } // endif jsp @@ -1522,7 +1522,7 @@ int TDBJSON::MakeDocument(PGLOBAL g) /* Parse the json file and allocate its tree structure. */ /*********************************************************************/ g->Message[0] = 0; - jsp = Top = ParseJson(g, memory, len, Pretty); + jsp = Top = ParseJson(g, memory, len, &Pretty); Txfp->CloseTableFile(g, false); Mode = mode; // Restore saved Mode From 7cd9af694ff81bb79cf85b0342038d7e26c46999 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 18 Oct 2015 15:55:32 +0200 Subject: [PATCH 34/39] Fix MDEV-8926 modified: storage/connect/ha_connect.cc modified: storage/connect/mysql-test/connect/r/datest.result modified: storage/connect/mysql-test/connect/t/datest.test --- storage/connect/ha_connect.cc | 11 ++++++++ .../mysql-test/connect/r/datest.result | 27 +++++++++++++++++++ .../connect/mysql-test/connect/t/datest.test | 12 +++++++++ 3 files changed, 50 insertions(+) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index dcfb6a3da8c..fd0a9a376ee 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -2529,6 +2529,17 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) !(colp[i]= tdbp->ColDB(g, (PSZ)pField->field->field_name, 0))) return NULL; // Column does not belong to this table + // These are not yet implemented (buggy) + switch (pField->field->type()) { + case MYSQL_TYPE_TIMESTAMP: + case MYSQL_TYPE_DATE: + case MYSQL_TYPE_TIME: + case MYSQL_TYPE_DATETIME: + case MYSQL_TYPE_YEAR: + case MYSQL_TYPE_NEWDATE: + return NULL; + } // endswitch type + if (trace) { htrc("Field index=%d\n", pField->field->field_index); htrc("Field name=%s\n", pField->field->field_name); diff --git a/storage/connect/mysql-test/connect/r/datest.result b/storage/connect/mysql-test/connect/r/datest.result index 203a7419a8e..586741f09ad 100644 --- a/storage/connect/mysql-test/connect/r/datest.result +++ b/storage/connect/mysql-test/connect/r/datest.result @@ -30,3 +30,30 @@ SELECT id, TIME(tim) FROM t1 LIMIT 1; id TIME(tim) 1 09:35:08.000000 DROP TABLE t1; +# +# Testing use of dates in where clause (MDEV-8926) +# +CREATE TABLE t1 (col1 DATE) ENGINE=CONNECT TABLE_TYPE=CSV; +Warnings: +Warning 1105 No file name. Table will use t1.csv +INSERT INTO t1 VALUES('2015-01-01'),('2015-02-01'),('2015-03-01'),('2015-04-01'); +SELECT * FROM t1 WHERE col1 = '2015-02-01'; +col1 +2015-02-01 +SELECT * FROM t1 WHERE col1 > '2015-02-01'; +col1 +2015-03-01 +2015-04-01 +SELECT * FROM t1 WHERE col1 >= '2015-02-01'; +col1 +2015-02-01 +2015-03-01 +2015-04-01 +SELECT * FROM t1 WHERE col1 < '2015-02-01'; +col1 +2015-01-01 +SELECT * FROM t1 WHERE col1 <= '2015-02-01'; +col1 +2015-01-01 +2015-02-01 +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/datest.test b/storage/connect/mysql-test/connect/t/datest.test index 7fe5fcea8ff..e9ee28ed550 100644 --- a/storage/connect/mysql-test/connect/t/datest.test +++ b/storage/connect/mysql-test/connect/t/datest.test @@ -14,3 +14,15 @@ SELECT id, DAYNAME(dat) FROM t1; SELECT id, DAYNAME(datim) FROM t1 LIMIT 1; SELECT id, TIME(tim) FROM t1 LIMIT 1; DROP TABLE t1; + +--echo # +--echo # Testing use of dates in where clause (MDEV-8926) +--echo # +CREATE TABLE t1 (col1 DATE) ENGINE=CONNECT TABLE_TYPE=CSV; +INSERT INTO t1 VALUES('2015-01-01'),('2015-02-01'),('2015-03-01'),('2015-04-01'); +SELECT * FROM t1 WHERE col1 = '2015-02-01'; +SELECT * FROM t1 WHERE col1 > '2015-02-01'; +SELECT * FROM t1 WHERE col1 >= '2015-02-01'; +SELECT * FROM t1 WHERE col1 < '2015-02-01'; +SELECT * FROM t1 WHERE col1 <= '2015-02-01'; +DROP TABLE t1; From 2445b1b212a45d4b80271664fc135967208a62f4 Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Tue, 20 Oct 2015 18:49:33 +0200 Subject: [PATCH 35/39] Typo --- storage/connect/ha_connect.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index fd0a9a376ee..fecf7f70796 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -169,7 +169,7 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.04.0003 September 15, 2015"; + char version[]= "Version 1.04.0003 October 20, 2015"; #if defined(__WIN__) char compver[]= "Version 1.04.0003 " __DATE__ " " __TIME__; char slash= '\\'; @@ -1134,7 +1134,10 @@ PTOS ha_connect::GetTableOptionStruct(TABLE_SHARE *s) { TABLE_SHARE *tsp= (tshp) ? tshp : (s) ? s : table_share; - return (tsp) ? tsp->option_struct : NULL; + return (tsp && (!tsp->db_plugin || + !stricmp(plugin_name(tsp->db_plugin)->str, "connect") || + !stricmp(plugin_name(tsp->db_plugin)->str, "partition"))) + ? tsp->option_struct : NULL; } // end of GetTableOptionStruct /****************************************************************************/ @@ -2529,7 +2532,7 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) !(colp[i]= tdbp->ColDB(g, (PSZ)pField->field->field_name, 0))) return NULL; // Column does not belong to this table - // These are not yet implemented (buggy) + // These types are not yet implemented (buggy) switch (pField->field->type()) { case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_DATE: From 1816eca57c6f29d3ff8230c65232fc2e0df8574f Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Wed, 21 Oct 2015 19:26:35 +0200 Subject: [PATCH 36/39] Fix MDEV-8882 modified: storage/connect/tabodbc.cpp --- storage/connect/tabodbc.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index e3df28476aa..22a026c77b6 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -323,10 +323,21 @@ PSZ TDBODBC::GetFile(PGLOBAL g) { if (Connect) { char *p1, *p2; + int i; size_t n; - if ((p1 = strstr(Connect, "DBQ="))) { - p1 += 4; // Beginning of file name + if (!(p1 = strstr(Connect, "DBQ="))) { + char *p, *lc = strlwr(PlugDup(g, Connect)); + + if ((p = strstr(lc, "database="))) + p1 = Connect + (p - lc); + + i = 9; + } else + i = 4; + + if (p1) { + p1 += i; // Beginning of file name p2 = strchr(p1, ';'); // End of file path/name // Make the File path/name from the connect string From de19721296076497967d0c3b38d07e8a3b08cd6e Mon Sep 17 00:00:00 2001 From: Buggynours Date: Sun, 25 Oct 2015 17:46:20 +0100 Subject: [PATCH 37/39] Fix of error and warnings when compiling on linux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit modifié : storage/connect/ha_connect.cc modifié : storage/connect/jsonudf.cpp nouveau fichier : storage/connect/mysql-test/connect/r/odbc_firebird.result modifié : storage/connect/mysql-test/connect/t/json.test nouveau fichier : storage/connect/mysql-test/connect/t/odbc_firebird.test modifié : storage/connect/tabodbc.cpp supprimé : storage/connect/Makefile --- storage/connect/Makefile | 1704 +++++++++++++++++ storage/connect/ha_connect.cc | 12 +- storage/connect/jsonudf.cpp | 35 +- .../mysql-test/connect/r/odbc_firebird.result | 100 + .../connect/mysql-test/connect/t/json.test | 2 +- .../mysql-test/connect/t/odbc_firebird.test | 31 + storage/connect/tabodbc.cpp | 2 +- 7 files changed, 1868 insertions(+), 18 deletions(-) create mode 100644 storage/connect/Makefile create mode 100644 storage/connect/mysql-test/connect/r/odbc_firebird.result create mode 100644 storage/connect/mysql-test/connect/t/odbc_firebird.test diff --git a/storage/connect/Makefile b/storage/connect/Makefile new file mode 100644 index 00000000000..56b801a116e --- /dev/null +++ b/storage/connect/Makefile @@ -0,0 +1,1704 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.0 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: +.PHONY : .NOTPARALLEL + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/olivier/mariadb/10.1 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/olivier/mariadb/10.1 + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Client\" \"ClientPlugins\" \"Common\" \"DataFiles\" \"DebugBinaries\" \"Development\" \"IniFiles\" \"ManPagesClient\" \"ManPagesDevelopment\" \"ManPagesServer\" \"ManPagesTest\" \"Mytop\" \"Readme\" \"Server\" \"Server_Scripts\" \"SharedLibraries\" \"SqlBench\" \"SupportFiles\" \"Test\" \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target package +package: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Run CPack packaging tool..." + cd /home/olivier/mariadb/10.1 && /usr/bin/cpack --config ./CPackConfig.cmake +.PHONY : package + +# Special rule for the target package +package/fast: package +.PHONY : package/fast + +# Special rule for the target package_source +package_source: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Run CPack packaging tool for source..." + cd /home/olivier/mariadb/10.1 && /usr/bin/cpack --config ./CPackSourceConfig.cmake /home/olivier/mariadb/10.1/CPackSourceConfig.cmake +.PHONY : package_source + +# Special rule for the target package_source +package_source/fast: package_source +.PHONY : package_source/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test +.PHONY : test/fast + +# The main all target +all: cmake_check_build_system + cd /home/olivier/mariadb/10.1 && $(CMAKE_COMMAND) -E cmake_progress_start /home/olivier/mariadb/10.1/CMakeFiles /home/olivier/mariadb/10.1/storage/connect/CMakeFiles/progress.marks + cd /home/olivier/mariadb/10.1 && $(MAKE) -f CMakeFiles/Makefile2 storage/connect/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/olivier/mariadb/10.1/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f CMakeFiles/Makefile2 storage/connect/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/olivier/mariadb/10.1 && $(MAKE) -f CMakeFiles/Makefile2 storage/connect/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f CMakeFiles/Makefile2 storage/connect/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/olivier/mariadb/10.1 && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +storage/connect/CMakeFiles/connect.dir/rule: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f CMakeFiles/Makefile2 storage/connect/CMakeFiles/connect.dir/rule +.PHONY : storage/connect/CMakeFiles/connect.dir/rule + +# Convenience name for target. +connect: storage/connect/CMakeFiles/connect.dir/rule +.PHONY : connect + +# fast build rule for target. +connect/fast: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/build +.PHONY : connect/fast + +# Convenience name for target. +storage/connect/CMakeFiles/connect_embedded.dir/rule: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f CMakeFiles/Makefile2 storage/connect/CMakeFiles/connect_embedded.dir/rule +.PHONY : storage/connect/CMakeFiles/connect_embedded.dir/rule + +# Convenience name for target. +connect_embedded: storage/connect/CMakeFiles/connect_embedded.dir/rule +.PHONY : connect_embedded + +# fast build rule for target. +connect_embedded/fast: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/build +.PHONY : connect_embedded/fast + +array.o: array.cpp.o +.PHONY : array.o + +# target to build an object file +array.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/array.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/array.cpp.o +.PHONY : array.cpp.o + +array.i: array.cpp.i +.PHONY : array.i + +# target to preprocess a source file +array.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/array.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/array.cpp.i +.PHONY : array.cpp.i + +array.s: array.cpp.s +.PHONY : array.s + +# target to generate assembly for a file +array.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/array.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/array.cpp.s +.PHONY : array.cpp.s + +blkfil.o: blkfil.cpp.o +.PHONY : blkfil.o + +# target to build an object file +blkfil.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/blkfil.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/blkfil.cpp.o +.PHONY : blkfil.cpp.o + +blkfil.i: blkfil.cpp.i +.PHONY : blkfil.i + +# target to preprocess a source file +blkfil.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/blkfil.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/blkfil.cpp.i +.PHONY : blkfil.cpp.i + +blkfil.s: blkfil.cpp.s +.PHONY : blkfil.s + +# target to generate assembly for a file +blkfil.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/blkfil.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/blkfil.cpp.s +.PHONY : blkfil.cpp.s + +colblk.o: colblk.cpp.o +.PHONY : colblk.o + +# target to build an object file +colblk.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/colblk.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/colblk.cpp.o +.PHONY : colblk.cpp.o + +colblk.i: colblk.cpp.i +.PHONY : colblk.i + +# target to preprocess a source file +colblk.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/colblk.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/colblk.cpp.i +.PHONY : colblk.cpp.i + +colblk.s: colblk.cpp.s +.PHONY : colblk.s + +# target to generate assembly for a file +colblk.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/colblk.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/colblk.cpp.s +.PHONY : colblk.cpp.s + +connect.o: connect.cc.o +.PHONY : connect.o + +# target to build an object file +connect.cc.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/connect.cc.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/connect.cc.o +.PHONY : connect.cc.o + +connect.i: connect.cc.i +.PHONY : connect.i + +# target to preprocess a source file +connect.cc.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/connect.cc.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/connect.cc.i +.PHONY : connect.cc.i + +connect.s: connect.cc.s +.PHONY : connect.s + +# target to generate assembly for a file +connect.cc.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/connect.cc.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/connect.cc.s +.PHONY : connect.cc.s + +csort.o: csort.cpp.o +.PHONY : csort.o + +# target to build an object file +csort.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/csort.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/csort.cpp.o +.PHONY : csort.cpp.o + +csort.i: csort.cpp.i +.PHONY : csort.i + +# target to preprocess a source file +csort.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/csort.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/csort.cpp.i +.PHONY : csort.cpp.i + +csort.s: csort.cpp.s +.PHONY : csort.s + +# target to generate assembly for a file +csort.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/csort.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/csort.cpp.s +.PHONY : csort.cpp.s + +filamap.o: filamap.cpp.o +.PHONY : filamap.o + +# target to build an object file +filamap.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamap.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamap.cpp.o +.PHONY : filamap.cpp.o + +filamap.i: filamap.cpp.i +.PHONY : filamap.i + +# target to preprocess a source file +filamap.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamap.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamap.cpp.i +.PHONY : filamap.cpp.i + +filamap.s: filamap.cpp.s +.PHONY : filamap.s + +# target to generate assembly for a file +filamap.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamap.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamap.cpp.s +.PHONY : filamap.cpp.s + +filamdbf.o: filamdbf.cpp.o +.PHONY : filamdbf.o + +# target to build an object file +filamdbf.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamdbf.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamdbf.cpp.o +.PHONY : filamdbf.cpp.o + +filamdbf.i: filamdbf.cpp.i +.PHONY : filamdbf.i + +# target to preprocess a source file +filamdbf.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamdbf.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamdbf.cpp.i +.PHONY : filamdbf.cpp.i + +filamdbf.s: filamdbf.cpp.s +.PHONY : filamdbf.s + +# target to generate assembly for a file +filamdbf.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamdbf.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamdbf.cpp.s +.PHONY : filamdbf.cpp.s + +filamfix.o: filamfix.cpp.o +.PHONY : filamfix.o + +# target to build an object file +filamfix.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamfix.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamfix.cpp.o +.PHONY : filamfix.cpp.o + +filamfix.i: filamfix.cpp.i +.PHONY : filamfix.i + +# target to preprocess a source file +filamfix.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamfix.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamfix.cpp.i +.PHONY : filamfix.cpp.i + +filamfix.s: filamfix.cpp.s +.PHONY : filamfix.s + +# target to generate assembly for a file +filamfix.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamfix.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamfix.cpp.s +.PHONY : filamfix.cpp.s + +filamtxt.o: filamtxt.cpp.o +.PHONY : filamtxt.o + +# target to build an object file +filamtxt.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamtxt.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamtxt.cpp.o +.PHONY : filamtxt.cpp.o + +filamtxt.i: filamtxt.cpp.i +.PHONY : filamtxt.i + +# target to preprocess a source file +filamtxt.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamtxt.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamtxt.cpp.i +.PHONY : filamtxt.cpp.i + +filamtxt.s: filamtxt.cpp.s +.PHONY : filamtxt.s + +# target to generate assembly for a file +filamtxt.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamtxt.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamtxt.cpp.s +.PHONY : filamtxt.cpp.s + +filamvct.o: filamvct.cpp.o +.PHONY : filamvct.o + +# target to build an object file +filamvct.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamvct.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamvct.cpp.o +.PHONY : filamvct.cpp.o + +filamvct.i: filamvct.cpp.i +.PHONY : filamvct.i + +# target to preprocess a source file +filamvct.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamvct.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamvct.cpp.i +.PHONY : filamvct.cpp.i + +filamvct.s: filamvct.cpp.s +.PHONY : filamvct.s + +# target to generate assembly for a file +filamvct.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamvct.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamvct.cpp.s +.PHONY : filamvct.cpp.s + +filamzip.o: filamzip.cpp.o +.PHONY : filamzip.o + +# target to build an object file +filamzip.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamzip.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamzip.cpp.o +.PHONY : filamzip.cpp.o + +filamzip.i: filamzip.cpp.i +.PHONY : filamzip.i + +# target to preprocess a source file +filamzip.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamzip.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamzip.cpp.i +.PHONY : filamzip.cpp.i + +filamzip.s: filamzip.cpp.s +.PHONY : filamzip.s + +# target to generate assembly for a file +filamzip.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filamzip.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filamzip.cpp.s +.PHONY : filamzip.cpp.s + +filter.o: filter.cpp.o +.PHONY : filter.o + +# target to build an object file +filter.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filter.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filter.cpp.o +.PHONY : filter.cpp.o + +filter.i: filter.cpp.i +.PHONY : filter.i + +# target to preprocess a source file +filter.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filter.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filter.cpp.i +.PHONY : filter.cpp.i + +filter.s: filter.cpp.s +.PHONY : filter.s + +# target to generate assembly for a file +filter.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/filter.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/filter.cpp.s +.PHONY : filter.cpp.s + +fmdlex.o: fmdlex.c.o +.PHONY : fmdlex.o + +# target to build an object file +fmdlex.c.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/fmdlex.c.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/fmdlex.c.o +.PHONY : fmdlex.c.o + +fmdlex.i: fmdlex.c.i +.PHONY : fmdlex.i + +# target to preprocess a source file +fmdlex.c.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/fmdlex.c.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/fmdlex.c.i +.PHONY : fmdlex.c.i + +fmdlex.s: fmdlex.c.s +.PHONY : fmdlex.s + +# target to generate assembly for a file +fmdlex.c.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/fmdlex.c.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/fmdlex.c.s +.PHONY : fmdlex.c.s + +ha_connect.o: ha_connect.cc.o +.PHONY : ha_connect.o + +# target to build an object file +ha_connect.cc.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/ha_connect.cc.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/ha_connect.cc.o +.PHONY : ha_connect.cc.o + +ha_connect.i: ha_connect.cc.i +.PHONY : ha_connect.i + +# target to preprocess a source file +ha_connect.cc.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/ha_connect.cc.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/ha_connect.cc.i +.PHONY : ha_connect.cc.i + +ha_connect.s: ha_connect.cc.s +.PHONY : ha_connect.s + +# target to generate assembly for a file +ha_connect.cc.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/ha_connect.cc.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/ha_connect.cc.s +.PHONY : ha_connect.cc.s + +inihandl.o: inihandl.c.o +.PHONY : inihandl.o + +# target to build an object file +inihandl.c.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/inihandl.c.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/inihandl.c.o +.PHONY : inihandl.c.o + +inihandl.i: inihandl.c.i +.PHONY : inihandl.i + +# target to preprocess a source file +inihandl.c.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/inihandl.c.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/inihandl.c.i +.PHONY : inihandl.c.i + +inihandl.s: inihandl.c.s +.PHONY : inihandl.s + +# target to generate assembly for a file +inihandl.c.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/inihandl.c.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/inihandl.c.s +.PHONY : inihandl.c.s + +json.o: json.cpp.o +.PHONY : json.o + +# target to build an object file +json.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/json.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/json.cpp.o +.PHONY : json.cpp.o + +json.i: json.cpp.i +.PHONY : json.i + +# target to preprocess a source file +json.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/json.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/json.cpp.i +.PHONY : json.cpp.i + +json.s: json.cpp.s +.PHONY : json.s + +# target to generate assembly for a file +json.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/json.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/json.cpp.s +.PHONY : json.cpp.s + +jsonudf.o: jsonudf.cpp.o +.PHONY : jsonudf.o + +# target to build an object file +jsonudf.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/jsonudf.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/jsonudf.cpp.o +.PHONY : jsonudf.cpp.o + +jsonudf.i: jsonudf.cpp.i +.PHONY : jsonudf.i + +# target to preprocess a source file +jsonudf.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/jsonudf.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/jsonudf.cpp.i +.PHONY : jsonudf.cpp.i + +jsonudf.s: jsonudf.cpp.s +.PHONY : jsonudf.s + +# target to generate assembly for a file +jsonudf.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/jsonudf.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/jsonudf.cpp.s +.PHONY : jsonudf.cpp.s + +maputil.o: maputil.cpp.o +.PHONY : maputil.o + +# target to build an object file +maputil.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/maputil.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/maputil.cpp.o +.PHONY : maputil.cpp.o + +maputil.i: maputil.cpp.i +.PHONY : maputil.i + +# target to preprocess a source file +maputil.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/maputil.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/maputil.cpp.i +.PHONY : maputil.cpp.i + +maputil.s: maputil.cpp.s +.PHONY : maputil.s + +# target to generate assembly for a file +maputil.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/maputil.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/maputil.cpp.s +.PHONY : maputil.cpp.s + +mycat.o: mycat.cc.o +.PHONY : mycat.o + +# target to build an object file +mycat.cc.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/mycat.cc.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/mycat.cc.o +.PHONY : mycat.cc.o + +mycat.i: mycat.cc.i +.PHONY : mycat.i + +# target to preprocess a source file +mycat.cc.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/mycat.cc.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/mycat.cc.i +.PHONY : mycat.cc.i + +mycat.s: mycat.cc.s +.PHONY : mycat.s + +# target to generate assembly for a file +mycat.cc.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/mycat.cc.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/mycat.cc.s +.PHONY : mycat.cc.s + +myconn.o: myconn.cpp.o +.PHONY : myconn.o + +# target to build an object file +myconn.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/myconn.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/myconn.cpp.o +.PHONY : myconn.cpp.o + +myconn.i: myconn.cpp.i +.PHONY : myconn.i + +# target to preprocess a source file +myconn.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/myconn.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/myconn.cpp.i +.PHONY : myconn.cpp.i + +myconn.s: myconn.cpp.s +.PHONY : myconn.s + +# target to generate assembly for a file +myconn.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/myconn.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/myconn.cpp.s +.PHONY : myconn.cpp.s + +myutil.o: myutil.cpp.o +.PHONY : myutil.o + +# target to build an object file +myutil.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/myutil.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/myutil.cpp.o +.PHONY : myutil.cpp.o + +myutil.i: myutil.cpp.i +.PHONY : myutil.i + +# target to preprocess a source file +myutil.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/myutil.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/myutil.cpp.i +.PHONY : myutil.cpp.i + +myutil.s: myutil.cpp.s +.PHONY : myutil.s + +# target to generate assembly for a file +myutil.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/myutil.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/myutil.cpp.s +.PHONY : myutil.cpp.s + +odbconn.o: odbconn.cpp.o +.PHONY : odbconn.o + +# target to build an object file +odbconn.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/odbconn.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/odbconn.cpp.o +.PHONY : odbconn.cpp.o + +odbconn.i: odbconn.cpp.i +.PHONY : odbconn.i + +# target to preprocess a source file +odbconn.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/odbconn.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/odbconn.cpp.i +.PHONY : odbconn.cpp.i + +odbconn.s: odbconn.cpp.s +.PHONY : odbconn.s + +# target to generate assembly for a file +odbconn.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/odbconn.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/odbconn.cpp.s +.PHONY : odbconn.cpp.s + +osutil.o: osutil.c.o +.PHONY : osutil.o + +# target to build an object file +osutil.c.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/osutil.c.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/osutil.c.o +.PHONY : osutil.c.o + +osutil.i: osutil.c.i +.PHONY : osutil.i + +# target to preprocess a source file +osutil.c.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/osutil.c.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/osutil.c.i +.PHONY : osutil.c.i + +osutil.s: osutil.c.s +.PHONY : osutil.s + +# target to generate assembly for a file +osutil.c.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/osutil.c.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/osutil.c.s +.PHONY : osutil.c.s + +plgdbutl.o: plgdbutl.cpp.o +.PHONY : plgdbutl.o + +# target to build an object file +plgdbutl.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/plgdbutl.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/plgdbutl.cpp.o +.PHONY : plgdbutl.cpp.o + +plgdbutl.i: plgdbutl.cpp.i +.PHONY : plgdbutl.i + +# target to preprocess a source file +plgdbutl.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/plgdbutl.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/plgdbutl.cpp.i +.PHONY : plgdbutl.cpp.i + +plgdbutl.s: plgdbutl.cpp.s +.PHONY : plgdbutl.s + +# target to generate assembly for a file +plgdbutl.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/plgdbutl.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/plgdbutl.cpp.s +.PHONY : plgdbutl.cpp.s + +plugutil.o: plugutil.c.o +.PHONY : plugutil.o + +# target to build an object file +plugutil.c.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/plugutil.c.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/plugutil.c.o +.PHONY : plugutil.c.o + +plugutil.i: plugutil.c.i +.PHONY : plugutil.i + +# target to preprocess a source file +plugutil.c.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/plugutil.c.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/plugutil.c.i +.PHONY : plugutil.c.i + +plugutil.s: plugutil.c.s +.PHONY : plugutil.s + +# target to generate assembly for a file +plugutil.c.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/plugutil.c.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/plugutil.c.s +.PHONY : plugutil.c.s + +rcmsg.o: rcmsg.c.o +.PHONY : rcmsg.o + +# target to build an object file +rcmsg.c.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/rcmsg.c.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/rcmsg.c.o +.PHONY : rcmsg.c.o + +rcmsg.i: rcmsg.c.i +.PHONY : rcmsg.i + +# target to preprocess a source file +rcmsg.c.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/rcmsg.c.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/rcmsg.c.i +.PHONY : rcmsg.c.i + +rcmsg.s: rcmsg.c.s +.PHONY : rcmsg.s + +# target to generate assembly for a file +rcmsg.c.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/rcmsg.c.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/rcmsg.c.s +.PHONY : rcmsg.c.s + +reldef.o: reldef.cpp.o +.PHONY : reldef.o + +# target to build an object file +reldef.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/reldef.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/reldef.cpp.o +.PHONY : reldef.cpp.o + +reldef.i: reldef.cpp.i +.PHONY : reldef.i + +# target to preprocess a source file +reldef.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/reldef.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/reldef.cpp.i +.PHONY : reldef.cpp.i + +reldef.s: reldef.cpp.s +.PHONY : reldef.s + +# target to generate assembly for a file +reldef.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/reldef.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/reldef.cpp.s +.PHONY : reldef.cpp.s + +tabcol.o: tabcol.cpp.o +.PHONY : tabcol.o + +# target to build an object file +tabcol.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabcol.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabcol.cpp.o +.PHONY : tabcol.cpp.o + +tabcol.i: tabcol.cpp.i +.PHONY : tabcol.i + +# target to preprocess a source file +tabcol.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabcol.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabcol.cpp.i +.PHONY : tabcol.cpp.i + +tabcol.s: tabcol.cpp.s +.PHONY : tabcol.s + +# target to generate assembly for a file +tabcol.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabcol.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabcol.cpp.s +.PHONY : tabcol.cpp.s + +tabdos.o: tabdos.cpp.o +.PHONY : tabdos.o + +# target to build an object file +tabdos.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabdos.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabdos.cpp.o +.PHONY : tabdos.cpp.o + +tabdos.i: tabdos.cpp.i +.PHONY : tabdos.i + +# target to preprocess a source file +tabdos.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabdos.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabdos.cpp.i +.PHONY : tabdos.cpp.i + +tabdos.s: tabdos.cpp.s +.PHONY : tabdos.s + +# target to generate assembly for a file +tabdos.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabdos.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabdos.cpp.s +.PHONY : tabdos.cpp.s + +tabfix.o: tabfix.cpp.o +.PHONY : tabfix.o + +# target to build an object file +tabfix.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabfix.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabfix.cpp.o +.PHONY : tabfix.cpp.o + +tabfix.i: tabfix.cpp.i +.PHONY : tabfix.i + +# target to preprocess a source file +tabfix.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabfix.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabfix.cpp.i +.PHONY : tabfix.cpp.i + +tabfix.s: tabfix.cpp.s +.PHONY : tabfix.s + +# target to generate assembly for a file +tabfix.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabfix.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabfix.cpp.s +.PHONY : tabfix.cpp.s + +tabfmt.o: tabfmt.cpp.o +.PHONY : tabfmt.o + +# target to build an object file +tabfmt.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabfmt.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabfmt.cpp.o +.PHONY : tabfmt.cpp.o + +tabfmt.i: tabfmt.cpp.i +.PHONY : tabfmt.i + +# target to preprocess a source file +tabfmt.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabfmt.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabfmt.cpp.i +.PHONY : tabfmt.cpp.i + +tabfmt.s: tabfmt.cpp.s +.PHONY : tabfmt.s + +# target to generate assembly for a file +tabfmt.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabfmt.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabfmt.cpp.s +.PHONY : tabfmt.cpp.s + +tabjson.o: tabjson.cpp.o +.PHONY : tabjson.o + +# target to build an object file +tabjson.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabjson.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabjson.cpp.o +.PHONY : tabjson.cpp.o + +tabjson.i: tabjson.cpp.i +.PHONY : tabjson.i + +# target to preprocess a source file +tabjson.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabjson.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabjson.cpp.i +.PHONY : tabjson.cpp.i + +tabjson.s: tabjson.cpp.s +.PHONY : tabjson.s + +# target to generate assembly for a file +tabjson.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabjson.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabjson.cpp.s +.PHONY : tabjson.cpp.s + +table.o: table.cpp.o +.PHONY : table.o + +# target to build an object file +table.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/table.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/table.cpp.o +.PHONY : table.cpp.o + +table.i: table.cpp.i +.PHONY : table.i + +# target to preprocess a source file +table.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/table.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/table.cpp.i +.PHONY : table.cpp.i + +table.s: table.cpp.s +.PHONY : table.s + +# target to generate assembly for a file +table.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/table.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/table.cpp.s +.PHONY : table.cpp.s + +tabmul.o: tabmul.cpp.o +.PHONY : tabmul.o + +# target to build an object file +tabmul.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabmul.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabmul.cpp.o +.PHONY : tabmul.cpp.o + +tabmul.i: tabmul.cpp.i +.PHONY : tabmul.i + +# target to preprocess a source file +tabmul.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabmul.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabmul.cpp.i +.PHONY : tabmul.cpp.i + +tabmul.s: tabmul.cpp.s +.PHONY : tabmul.s + +# target to generate assembly for a file +tabmul.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabmul.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabmul.cpp.s +.PHONY : tabmul.cpp.s + +tabmysql.o: tabmysql.cpp.o +.PHONY : tabmysql.o + +# target to build an object file +tabmysql.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabmysql.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabmysql.cpp.o +.PHONY : tabmysql.cpp.o + +tabmysql.i: tabmysql.cpp.i +.PHONY : tabmysql.i + +# target to preprocess a source file +tabmysql.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabmysql.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabmysql.cpp.i +.PHONY : tabmysql.cpp.i + +tabmysql.s: tabmysql.cpp.s +.PHONY : tabmysql.s + +# target to generate assembly for a file +tabmysql.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabmysql.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabmysql.cpp.s +.PHONY : tabmysql.cpp.s + +taboccur.o: taboccur.cpp.o +.PHONY : taboccur.o + +# target to build an object file +taboccur.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/taboccur.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/taboccur.cpp.o +.PHONY : taboccur.cpp.o + +taboccur.i: taboccur.cpp.i +.PHONY : taboccur.i + +# target to preprocess a source file +taboccur.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/taboccur.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/taboccur.cpp.i +.PHONY : taboccur.cpp.i + +taboccur.s: taboccur.cpp.s +.PHONY : taboccur.s + +# target to generate assembly for a file +taboccur.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/taboccur.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/taboccur.cpp.s +.PHONY : taboccur.cpp.s + +tabodbc.o: tabodbc.cpp.o +.PHONY : tabodbc.o + +# target to build an object file +tabodbc.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabodbc.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabodbc.cpp.o +.PHONY : tabodbc.cpp.o + +tabodbc.i: tabodbc.cpp.i +.PHONY : tabodbc.i + +# target to preprocess a source file +tabodbc.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabodbc.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabodbc.cpp.i +.PHONY : tabodbc.cpp.i + +tabodbc.s: tabodbc.cpp.s +.PHONY : tabodbc.s + +# target to generate assembly for a file +tabodbc.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabodbc.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabodbc.cpp.s +.PHONY : tabodbc.cpp.s + +tabpivot.o: tabpivot.cpp.o +.PHONY : tabpivot.o + +# target to build an object file +tabpivot.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabpivot.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabpivot.cpp.o +.PHONY : tabpivot.cpp.o + +tabpivot.i: tabpivot.cpp.i +.PHONY : tabpivot.i + +# target to preprocess a source file +tabpivot.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabpivot.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabpivot.cpp.i +.PHONY : tabpivot.cpp.i + +tabpivot.s: tabpivot.cpp.s +.PHONY : tabpivot.s + +# target to generate assembly for a file +tabpivot.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabpivot.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabpivot.cpp.s +.PHONY : tabpivot.cpp.s + +tabsys.o: tabsys.cpp.o +.PHONY : tabsys.o + +# target to build an object file +tabsys.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabsys.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabsys.cpp.o +.PHONY : tabsys.cpp.o + +tabsys.i: tabsys.cpp.i +.PHONY : tabsys.i + +# target to preprocess a source file +tabsys.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabsys.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabsys.cpp.i +.PHONY : tabsys.cpp.i + +tabsys.s: tabsys.cpp.s +.PHONY : tabsys.s + +# target to generate assembly for a file +tabsys.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabsys.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabsys.cpp.s +.PHONY : tabsys.cpp.s + +tabtbl.o: tabtbl.cpp.o +.PHONY : tabtbl.o + +# target to build an object file +tabtbl.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabtbl.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabtbl.cpp.o +.PHONY : tabtbl.cpp.o + +tabtbl.i: tabtbl.cpp.i +.PHONY : tabtbl.i + +# target to preprocess a source file +tabtbl.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabtbl.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabtbl.cpp.i +.PHONY : tabtbl.cpp.i + +tabtbl.s: tabtbl.cpp.s +.PHONY : tabtbl.s + +# target to generate assembly for a file +tabtbl.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabtbl.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabtbl.cpp.s +.PHONY : tabtbl.cpp.s + +tabutil.o: tabutil.cpp.o +.PHONY : tabutil.o + +# target to build an object file +tabutil.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabutil.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabutil.cpp.o +.PHONY : tabutil.cpp.o + +tabutil.i: tabutil.cpp.i +.PHONY : tabutil.i + +# target to preprocess a source file +tabutil.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabutil.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabutil.cpp.i +.PHONY : tabutil.cpp.i + +tabutil.s: tabutil.cpp.s +.PHONY : tabutil.s + +# target to generate assembly for a file +tabutil.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabutil.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabutil.cpp.s +.PHONY : tabutil.cpp.s + +tabvct.o: tabvct.cpp.o +.PHONY : tabvct.o + +# target to build an object file +tabvct.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabvct.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabvct.cpp.o +.PHONY : tabvct.cpp.o + +tabvct.i: tabvct.cpp.i +.PHONY : tabvct.i + +# target to preprocess a source file +tabvct.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabvct.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabvct.cpp.i +.PHONY : tabvct.cpp.i + +tabvct.s: tabvct.cpp.s +.PHONY : tabvct.s + +# target to generate assembly for a file +tabvct.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabvct.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabvct.cpp.s +.PHONY : tabvct.cpp.s + +tabvir.o: tabvir.cpp.o +.PHONY : tabvir.o + +# target to build an object file +tabvir.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabvir.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabvir.cpp.o +.PHONY : tabvir.cpp.o + +tabvir.i: tabvir.cpp.i +.PHONY : tabvir.i + +# target to preprocess a source file +tabvir.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabvir.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabvir.cpp.i +.PHONY : tabvir.cpp.i + +tabvir.s: tabvir.cpp.s +.PHONY : tabvir.s + +# target to generate assembly for a file +tabvir.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabvir.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabvir.cpp.s +.PHONY : tabvir.cpp.s + +tabxcl.o: tabxcl.cpp.o +.PHONY : tabxcl.o + +# target to build an object file +tabxcl.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabxcl.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabxcl.cpp.o +.PHONY : tabxcl.cpp.o + +tabxcl.i: tabxcl.cpp.i +.PHONY : tabxcl.i + +# target to preprocess a source file +tabxcl.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabxcl.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabxcl.cpp.i +.PHONY : tabxcl.cpp.i + +tabxcl.s: tabxcl.cpp.s +.PHONY : tabxcl.s + +# target to generate assembly for a file +tabxcl.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/tabxcl.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/tabxcl.cpp.s +.PHONY : tabxcl.cpp.s + +user_connect.o: user_connect.cc.o +.PHONY : user_connect.o + +# target to build an object file +user_connect.cc.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/user_connect.cc.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/user_connect.cc.o +.PHONY : user_connect.cc.o + +user_connect.i: user_connect.cc.i +.PHONY : user_connect.i + +# target to preprocess a source file +user_connect.cc.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/user_connect.cc.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/user_connect.cc.i +.PHONY : user_connect.cc.i + +user_connect.s: user_connect.cc.s +.PHONY : user_connect.s + +# target to generate assembly for a file +user_connect.cc.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/user_connect.cc.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/user_connect.cc.s +.PHONY : user_connect.cc.s + +valblk.o: valblk.cpp.o +.PHONY : valblk.o + +# target to build an object file +valblk.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/valblk.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/valblk.cpp.o +.PHONY : valblk.cpp.o + +valblk.i: valblk.cpp.i +.PHONY : valblk.i + +# target to preprocess a source file +valblk.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/valblk.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/valblk.cpp.i +.PHONY : valblk.cpp.i + +valblk.s: valblk.cpp.s +.PHONY : valblk.s + +# target to generate assembly for a file +valblk.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/valblk.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/valblk.cpp.s +.PHONY : valblk.cpp.s + +value.o: value.cpp.o +.PHONY : value.o + +# target to build an object file +value.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/value.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/value.cpp.o +.PHONY : value.cpp.o + +value.i: value.cpp.i +.PHONY : value.i + +# target to preprocess a source file +value.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/value.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/value.cpp.i +.PHONY : value.cpp.i + +value.s: value.cpp.s +.PHONY : value.s + +# target to generate assembly for a file +value.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/value.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/value.cpp.s +.PHONY : value.cpp.s + +xindex.o: xindex.cpp.o +.PHONY : xindex.o + +# target to build an object file +xindex.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/xindex.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/xindex.cpp.o +.PHONY : xindex.cpp.o + +xindex.i: xindex.cpp.i +.PHONY : xindex.i + +# target to preprocess a source file +xindex.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/xindex.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/xindex.cpp.i +.PHONY : xindex.cpp.i + +xindex.s: xindex.cpp.s +.PHONY : xindex.s + +# target to generate assembly for a file +xindex.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/xindex.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/xindex.cpp.s +.PHONY : xindex.cpp.s + +xobject.o: xobject.cpp.o +.PHONY : xobject.o + +# target to build an object file +xobject.cpp.o: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/xobject.cpp.o + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/xobject.cpp.o +.PHONY : xobject.cpp.o + +xobject.i: xobject.cpp.i +.PHONY : xobject.i + +# target to preprocess a source file +xobject.cpp.i: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/xobject.cpp.i + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/xobject.cpp.i +.PHONY : xobject.cpp.i + +xobject.s: xobject.cpp.s +.PHONY : xobject.s + +# target to generate assembly for a file +xobject.cpp.s: + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect.dir/build.make storage/connect/CMakeFiles/connect.dir/xobject.cpp.s + cd /home/olivier/mariadb/10.1 && $(MAKE) -f storage/connect/CMakeFiles/connect_embedded.dir/build.make storage/connect/CMakeFiles/connect_embedded.dir/xobject.cpp.s +.PHONY : xobject.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... connect" + @echo "... connect_embedded" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... package" + @echo "... package_source" + @echo "... rebuild_cache" + @echo "... test" + @echo "... array.o" + @echo "... array.i" + @echo "... array.s" + @echo "... blkfil.o" + @echo "... blkfil.i" + @echo "... blkfil.s" + @echo "... colblk.o" + @echo "... colblk.i" + @echo "... colblk.s" + @echo "... connect.o" + @echo "... connect.i" + @echo "... connect.s" + @echo "... csort.o" + @echo "... csort.i" + @echo "... csort.s" + @echo "... filamap.o" + @echo "... filamap.i" + @echo "... filamap.s" + @echo "... filamdbf.o" + @echo "... filamdbf.i" + @echo "... filamdbf.s" + @echo "... filamfix.o" + @echo "... filamfix.i" + @echo "... filamfix.s" + @echo "... filamtxt.o" + @echo "... filamtxt.i" + @echo "... filamtxt.s" + @echo "... filamvct.o" + @echo "... filamvct.i" + @echo "... filamvct.s" + @echo "... filamzip.o" + @echo "... filamzip.i" + @echo "... filamzip.s" + @echo "... filter.o" + @echo "... filter.i" + @echo "... filter.s" + @echo "... fmdlex.o" + @echo "... fmdlex.i" + @echo "... fmdlex.s" + @echo "... ha_connect.o" + @echo "... ha_connect.i" + @echo "... ha_connect.s" + @echo "... inihandl.o" + @echo "... inihandl.i" + @echo "... inihandl.s" + @echo "... json.o" + @echo "... json.i" + @echo "... json.s" + @echo "... jsonudf.o" + @echo "... jsonudf.i" + @echo "... jsonudf.s" + @echo "... maputil.o" + @echo "... maputil.i" + @echo "... maputil.s" + @echo "... mycat.o" + @echo "... mycat.i" + @echo "... mycat.s" + @echo "... myconn.o" + @echo "... myconn.i" + @echo "... myconn.s" + @echo "... myutil.o" + @echo "... myutil.i" + @echo "... myutil.s" + @echo "... odbconn.o" + @echo "... odbconn.i" + @echo "... odbconn.s" + @echo "... osutil.o" + @echo "... osutil.i" + @echo "... osutil.s" + @echo "... plgdbutl.o" + @echo "... plgdbutl.i" + @echo "... plgdbutl.s" + @echo "... plugutil.o" + @echo "... plugutil.i" + @echo "... plugutil.s" + @echo "... rcmsg.o" + @echo "... rcmsg.i" + @echo "... rcmsg.s" + @echo "... reldef.o" + @echo "... reldef.i" + @echo "... reldef.s" + @echo "... tabcol.o" + @echo "... tabcol.i" + @echo "... tabcol.s" + @echo "... tabdos.o" + @echo "... tabdos.i" + @echo "... tabdos.s" + @echo "... tabfix.o" + @echo "... tabfix.i" + @echo "... tabfix.s" + @echo "... tabfmt.o" + @echo "... tabfmt.i" + @echo "... tabfmt.s" + @echo "... tabjson.o" + @echo "... tabjson.i" + @echo "... tabjson.s" + @echo "... table.o" + @echo "... table.i" + @echo "... table.s" + @echo "... tabmul.o" + @echo "... tabmul.i" + @echo "... tabmul.s" + @echo "... tabmysql.o" + @echo "... tabmysql.i" + @echo "... tabmysql.s" + @echo "... taboccur.o" + @echo "... taboccur.i" + @echo "... taboccur.s" + @echo "... tabodbc.o" + @echo "... tabodbc.i" + @echo "... tabodbc.s" + @echo "... tabpivot.o" + @echo "... tabpivot.i" + @echo "... tabpivot.s" + @echo "... tabsys.o" + @echo "... tabsys.i" + @echo "... tabsys.s" + @echo "... tabtbl.o" + @echo "... tabtbl.i" + @echo "... tabtbl.s" + @echo "... tabutil.o" + @echo "... tabutil.i" + @echo "... tabutil.s" + @echo "... tabvct.o" + @echo "... tabvct.i" + @echo "... tabvct.s" + @echo "... tabvir.o" + @echo "... tabvir.i" + @echo "... tabvir.s" + @echo "... tabxcl.o" + @echo "... tabxcl.i" + @echo "... tabxcl.s" + @echo "... user_connect.o" + @echo "... user_connect.i" + @echo "... user_connect.s" + @echo "... valblk.o" + @echo "... valblk.i" + @echo "... valblk.s" + @echo "... value.o" + @echo "... value.i" + @echo "... value.s" + @echo "... xindex.o" + @echo "... xindex.i" + @echo "... xindex.s" + @echo "... xobject.o" + @echo "... xobject.i" + @echo "... xobject.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/olivier/mariadb/10.1 && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index fecf7f70796..eaa47c58711 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -169,7 +169,7 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.04.0003 October 20, 2015"; + char version[]= "Version 1.04.0003 October 25, 2015"; #if defined(__WIN__) char compver[]= "Version 1.04.0003 " __DATE__ " " __TIME__; char slash= '\\'; @@ -1114,7 +1114,7 @@ int GetIntegerTableOption(PGLOBAL g, PTOS options, char *opname, int idef) else if (!stricmp(opname, "Compressed")) opval= (options->compressed); - if (opval == NO_IVAL) { + if (opval == (unsigned)NO_IVAL) { char *pv; if ((pv= GetListOption(g, opname, options->oplist))) @@ -2222,7 +2222,8 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, const key_range *kr) { const uchar *ptr; - uint i, rem, len, klen, stlen; +//uint i, rem, len, klen, stlen; + uint i, rem, len, stlen; bool nq, both, oom= false; OPVAL op; Field *fp; @@ -2255,7 +2256,8 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, else oom|= qry->Append(" WHERE ("); - klen= len= ranges[i]->length; +// klen= len= ranges[i]->length; + len= ranges[i]->length; rem= kfp->user_defined_key_parts; ptr= ranges[i]->key; @@ -2541,6 +2543,8 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) case MYSQL_TYPE_YEAR: case MYSQL_TYPE_NEWDATE: return NULL; + default: + break; } // endswitch type if (trace) { diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 4d029ce9a7c..a36a6e479c9 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -15,9 +15,14 @@ #include "jsonudf.h" +#if defined(UNIX) || defined(UNIV_LINUX) +#define _O_RDONLY O_RDONLY +#endif + + #define MEMFIX 4096 #if defined(connect_EXPORTS) -#define PUSH_WARNING(M) \ +#define PUSH_WARNING(M) \ push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M) #else #define PUSH_WARNING(M) htrc(M) @@ -1356,7 +1361,11 @@ static char *GetJsonFile(PGLOBAL g, char *fn) char *str; int h, n, len; +#if defined(UNIX) || defined(UNIV_LINUX) + h= open(fn, O_RDONLY); +#else h= open(fn, _O_RDONLY, _O_TEXT); +#endif if (h == -1) { sprintf(g->Message, "Error %d opening %s", errno, fn); @@ -1504,7 +1513,7 @@ char *jsonvalue(UDF_INIT *initid, UDF_ARGS *args, char *result, return str; } // end of JsonValue -void JsonValue_deinit(UDF_INIT* initid) +void jsonvalue_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); } // end of jsonvalue_deinit @@ -2804,12 +2813,12 @@ my_bool jsonlocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Fourth argument is not an integer (memory)"); return true; } else - more = (ulong)*(longlong*)args->args[2]; + more += (ulong)*(longlong*)args->args[2]; CalcLen(args, false, reslen, memlen); if (IsJson(args, 0) != 3) - memlen += 1000; // TODO: calculate this + memlen += more; // TODO: calculate this return JsonInit(initid, args, message, true, reslen, memlen); } // end of jsonlocate_init @@ -2905,7 +2914,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, return NULL; } // end of jsonlocate -void json_locate_deinit(UDF_INIT* initid) +void jsonlocate_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); } // end of jsonlocate_deinit @@ -2931,14 +2940,14 @@ my_bool json_locate_all_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Fourth argument is not an integer (memory)"); return true; } else - more = (ulong)*(longlong*)args->args[2]; + more += (ulong)*(longlong*)args->args[2]; - CalcLen(args, false, reslen, memlen); + CalcLen(args, false, reslen, memlen); - if (IsJson(args, 0) != 3) - memlen += 1000; // TODO: calculate this + if (IsJson(args, 0) != 3) + memlen += more; // TODO: calculate this - return JsonInit(initid, args, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of json_locate_all_init char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3237,6 +3246,8 @@ char *jfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result, case INT_RESULT: pretty = (int)*(longlong*)args->args[i]; break; + default: + PUSH_WARNING("Unexpected argument type in jfile_make"); } // endswitch arg_type if (fn) { @@ -3397,12 +3408,12 @@ char *jbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!CheckMemory(g, initid, args, 2, false, true)) { int *x = NULL; uint n = 2; - PJSON jsp; +// PJSON jsp; PJVAL jvp; PJAR arp; jvp = MakeValue(g, args, 0, &top); - jsp = jvp->GetJson(); +// jsp = jvp->GetJson(); x = GetIntArgPtr(g, args, n); if (CheckPath(g, args, top, jvp, n)) diff --git a/storage/connect/mysql-test/connect/r/odbc_firebird.result b/storage/connect/mysql-test/connect/r/odbc_firebird.result new file mode 100644 index 00000000000..7688c188f59 --- /dev/null +++ b/storage/connect/mysql-test/connect/r/odbc_firebird.result @@ -0,0 +1,100 @@ +SET NAMES utf8; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Bad connection string'; +ERROR HY000: SQLDriverConnect: [unixODBC][Driver Manager]Data source name not found, and no default driver specified +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Sources; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `Name` varchar(256) NOT NULL, + `Description` varchar(256) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Sources' +SELECT * FROM t1; +Name Description +Firebird Firebird +DROP TABLE t1; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Drivers; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `Description` char(128) NOT NULL, + `Attributes` varchar(256) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='ODBC' `CATFUNC`='Drivers' +SELECT * FROM t1; +Description Attributes +Firebird Description=Firebird ODBC Driver in usr;Driver=/usr/local/lib/libOdbcFb.so;Setup=/usr/local/lib/libOdbcFb.so;FileUsage=1; +DROP TABLE t1; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Tables CONNECTION='Not important'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `Table_Cat` char(128) NOT NULL, + `Table_Schema` char(128) NOT NULL, + `Table_Name` char(128) NOT NULL, + `Table_Type` char(16) NOT NULL, + `Remark` char(255) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='Not important' `TABLE_TYPE`='ODBC' `CATFUNC`='Tables' +DROP TABLE t1; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Columns CONNECTION='Not important'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `Table_Cat` char(128) NOT NULL, + `Table_Schema` char(128) NOT NULL, + `Table_Name` char(128) NOT NULL, + `Column_Name` char(128) NOT NULL, + `Data_Type` smallint(6) NOT NULL, + `Type_Name` char(30) NOT NULL, + `Column_Size` int(10) NOT NULL, + `Buffer_Length` int(10) NOT NULL, + `Decimal_Digits` smallint(6) NOT NULL, + `Radix` smallint(6) NOT NULL, + `Nullable` smallint(6) NOT NULL, + `Remarks` char(255) NOT NULL +) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='Not important' `TABLE_TYPE`='ODBC' `CATFUNC`='Columns' +DROP TABLE t1; +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC TABNAME='EMPLOYEE' CONNECTION='DSN=Firebird;UID=SYSDBA;PWD=manager'; +SELECT * FROM t1; +EMP_NO FIRST_NAME LAST_NAME PHONE_EXT HIRE_DATE DEPT_NO JOB_CODE JOB_GRADE JOB_COUNTRY SALARY FULL_NAME +2 Robert Nelson 250 1988-12-28 00:00:00 600 VP 2 USA 105900.00 Nelson, Robert +4 Bruce Young 233 1988-12-28 00:00:00 621 Eng 2 USA 97500.00 Young, Bruce +5 Kim Lambert 22 1989-02-06 00:00:00 130 Eng 2 USA 102750.00 Lambert, Kim +8 Leslie Johnson 410 1989-04-05 00:00:00 180 Mktg 3 USA 64635.00 Johnson, Leslie +9 Phil Forest 229 1989-04-17 00:00:00 622 Mngr 3 USA 75060.00 Forest, Phil +11 K. J. Weston 34 1990-01-17 00:00:00 130 SRep 4 USA 86292.94 Weston, K. J. +12 Terri Lee 256 1990-05-01 00:00:00 000 Admin 4 USA 53793.00 Lee, Terri +14 Stewart Hall 227 1990-06-04 00:00:00 900 Finan 3 USA 69482.63 Hall, Stewart +15 Katherine Young 231 1990-06-14 00:00:00 623 Mngr 3 USA 67241.25 Young, Katherine +20 Chris Papadopoulos 887 1990-01-01 00:00:00 671 Mngr 3 USA 89655.00 Papadopoulos, Chris +24 Pete Fisher 888 1990-09-12 00:00:00 671 Eng 3 USA 81810.19 Fisher, Pete +28 Ann Bennet 5 1991-02-01 00:00:00 120 Admin 5 England 22935.00 Bennet, Ann +29 Roger De Souza 288 1991-02-18 00:00:00 623 Eng 3 USA 69482.63 De Souza, Roger +34 Janet Baldwin 2 1991-03-21 00:00:00 110 Sales 3 USA 61637.81 Baldwin, Janet +36 Roger Reeves 6 1991-04-25 00:00:00 120 Sales 3 England 33620.63 Reeves, Roger +37 Willie Stansbury 7 1991-04-25 00:00:00 120 Eng 4 England 39224.06 Stansbury, Willie +44 Leslie Phong 216 1991-06-03 00:00:00 623 Eng 4 USA 56034.38 Phong, Leslie +45 Ashok Ramanathan 209 1991-08-01 00:00:00 621 Eng 3 USA 80689.50 Ramanathan, Ashok +46 Walter Steadman 210 1991-08-09 00:00:00 900 CFO 1 USA 116100.00 Steadman, Walter +52 Carol Nordstrom 420 1991-10-02 00:00:00 180 PRel 4 USA 42742.50 Nordstrom, Carol +61 Luke Leung 3 1992-02-18 00:00:00 110 SRep 4 USA 68805.00 Leung, Luke +65 Sue Anne O'Brien 877 1992-03-23 00:00:00 670 Admin 5 USA 31275.00 O'Brien, Sue Anne +71 Jennifer M. Burbank 289 1992-04-15 00:00:00 622 Eng 3 USA 53167.50 Burbank, Jennifer M. +72 Claudia Sutherland NULL 1992-04-20 00:00:00 140 SRep 4 Canada 100914.00 Sutherland, Claudia +83 Dana Bishop 290 1992-06-01 00:00:00 621 Eng 3 USA 62550.00 Bishop, Dana +85 Mary S. MacDonald 477 1992-06-01 00:00:00 100 VP 2 USA 111262.50 MacDonald, Mary S. +94 Randy Williams 892 1992-08-08 00:00:00 672 Mngr 4 USA 56295.00 Williams, Randy +105 Oliver H. Bender 255 1992-10-08 00:00:00 000 CEO 1 USA 212850.00 Bender, Oliver H. +107 Kevin Cook 894 1993-02-01 00:00:00 670 Dir 2 USA 111262.50 Cook, Kevin +109 Kelly Brown 202 1993-02-04 00:00:00 600 Admin 5 USA 27000.00 Brown, Kelly +110 Yuki Ichida 22 1993-02-04 00:00:00 115 Eng 3 Japan 6000000.00 Ichida, Yuki +113 Mary Page 845 1993-04-12 00:00:00 671 Eng 4 USA 48000.00 Page, Mary +114 Bill Parker 247 1993-06-01 00:00:00 623 Eng 5 USA 35000.00 Parker, Bill +118 Takashi Yamamoto 23 1993-07-01 00:00:00 115 SRep 4 Japan 7480000.00 Yamamoto, Takashi +121 Roberto Ferrari 1 1993-07-12 00:00:00 125 SRep 4 Italy 99000000.00 Ferrari, Roberto +127 Michael Yanowski 492 1993-08-09 00:00:00 100 SRep 4 USA 44000.00 Yanowski, Michael +134 Jacques Glon NULL 1993-08-23 00:00:00 123 SRep 4 France 390500.00 Glon, Jacques +136 Scott Johnson 265 1993-09-13 00:00:00 623 Doc 3 USA 60000.00 Johnson, Scott +138 T.J. Green 218 1993-11-01 00:00:00 621 Eng 4 USA 36000.00 Green, T.J. +141 Pierre Osborne NULL 1994-01-03 00:00:00 121 SRep 4 Switzerland 110000.00 Osborne, Pierre +144 John Montgomery 820 1994-03-30 00:00:00 672 Eng 5 USA 35000.00 Montgomery, John +145 Mark Guckenheimer 221 1994-05-02 00:00:00 622 Eng 5 USA 32000.00 Guckenheimer, Mark +DROP TABLE t1; diff --git a/storage/connect/mysql-test/connect/t/json.test b/storage/connect/mysql-test/connect/t/json.test index fa962d3b302..b743071b1be 100644 --- a/storage/connect/mysql-test/connect/t/json.test +++ b/storage/connect/mysql-test/connect/t/json.test @@ -135,7 +135,7 @@ CREATE TABLE t1 Year int(4) FIELD_FORMAT='DATEPUB', INDEX IX(ISBN) ) -ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=320 OPTION_LIST='Pretty=0'; +ENGINE=CONNECT TABLE_TYPE=JSON FILE_NAME='bib0.json' LRECL=350 OPTION_LIST='Pretty=0'; SHOW INDEX FROM t1; SELECT * FROM t1; DESCRIBE SELECT * FROM t1 WHERE ISBN = '9782212090819'; diff --git a/storage/connect/mysql-test/connect/t/odbc_firebird.test b/storage/connect/mysql-test/connect/t/odbc_firebird.test new file mode 100644 index 00000000000..f354512b1c2 --- /dev/null +++ b/storage/connect/mysql-test/connect/t/odbc_firebird.test @@ -0,0 +1,31 @@ +--source have_odbc.inc + +SET NAMES utf8; + +# MS ODBC and unixODBC return different error message text, +# so disable displaying error messages +#--disable_result_log ONCE +--error ER_UNKNOWN_ERROR +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='Bad connection string'; + +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Sources; +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Drivers; +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Tables CONNECTION='Not important'; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CATFUNC=Columns CONNECTION='Not important'; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC TABNAME='EMPLOYEE' CONNECTION='DSN=Firebird;UID=SYSDBA;PWD=manager'; +SELECT * FROM t1; +DROP TABLE t1; diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index 22a026c77b6..fd9a049a05a 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -513,7 +513,7 @@ bool TDBODBC::MakeInsert(PGLOBAL g) { char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3]; int len = 0; - bool b = false, oom; + bool b = false, oom = false; PTABLE tablep = To_Table; PCOL colp; From abe87bb011069ca9354b183dc72b2566b13ee8be Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 25 Oct 2015 21:11:04 +0100 Subject: [PATCH 38/39] Fix error and warnings raised by gcc on Linux: Define O_RDONLY in jsonudf.cpp Correct wrong deinit function names Make Locate functions use the variable more Avoid signed/unsigned warning in ha_connect.cc GetIntegerTableOption Initialize oom in tabodbc MakeInsert modified: storage/connect/ha_connect.cc modified: storage/connect/jsonudf.cpp modified: storage/connect/tabodbc.cpp --- storage/connect/ha_connect.cc | 12 ++++++++---- storage/connect/jsonudf.cpp | 35 ++++++++++++++++++++++------------- storage/connect/tabodbc.cpp | 2 +- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index fecf7f70796..f4121ea0f18 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -169,7 +169,7 @@ #define JSONMAX 10 // JSON Default max grp size extern "C" { - char version[]= "Version 1.04.0003 October 20, 2015"; + char version[]= "Version 1.04.0003 October 25, 2015"; #if defined(__WIN__) char compver[]= "Version 1.04.0003 " __DATE__ " " __TIME__; char slash= '\\'; @@ -1114,7 +1114,7 @@ int GetIntegerTableOption(PGLOBAL g, PTOS options, char *opname, int idef) else if (!stricmp(opname, "Compressed")) opval= (options->compressed); - if (opval == NO_IVAL) { + if (opval == (ulonglong)NO_IVAL) { char *pv; if ((pv= GetListOption(g, opname, options->oplist))) @@ -2222,7 +2222,8 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, const key_range *kr) { const uchar *ptr; - uint i, rem, len, klen, stlen; +//uint i, rem, len, klen, stlen; + uint i, rem, len, stlen; bool nq, both, oom= false; OPVAL op; Field *fp; @@ -2255,7 +2256,8 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, else oom|= qry->Append(" WHERE ("); - klen= len= ranges[i]->length; +// klen= len= ranges[i]->length; + len= ranges[i]->length; rem= kfp->user_defined_key_parts; ptr= ranges[i]->key; @@ -2541,6 +2543,8 @@ PFIL ha_connect::CondFilter(PGLOBAL g, Item *cond) case MYSQL_TYPE_YEAR: case MYSQL_TYPE_NEWDATE: return NULL; + default: + break; } // endswitch type if (trace) { diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 4d029ce9a7c..0b40f1d18cf 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -15,10 +15,13 @@ #include "jsonudf.h" +#if defined(UNIX) || defined(UNIV_LINUX) +#define _O_RDONLY O_RDONLY +#endif + #define MEMFIX 4096 #if defined(connect_EXPORTS) -#define PUSH_WARNING(M) \ -push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M) +#define PUSH_WARNING(M) push_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, 0, M) #else #define PUSH_WARNING(M) htrc(M) #endif @@ -1356,7 +1359,11 @@ static char *GetJsonFile(PGLOBAL g, char *fn) char *str; int h, n, len; +#if defined(UNIX) || defined(UNIV_LINUX) + h= open(fn, O_RDONLY); +#else h= open(fn, _O_RDONLY, _O_TEXT); +#endif if (h == -1) { sprintf(g->Message, "Error %d opening %s", errno, fn); @@ -1504,7 +1511,7 @@ char *jsonvalue(UDF_INIT *initid, UDF_ARGS *args, char *result, return str; } // end of JsonValue -void JsonValue_deinit(UDF_INIT* initid) +void jsonvalue_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); } // end of jsonvalue_deinit @@ -2804,12 +2811,12 @@ my_bool jsonlocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Fourth argument is not an integer (memory)"); return true; } else - more = (ulong)*(longlong*)args->args[2]; + more += (ulong)*(longlong*)args->args[2]; CalcLen(args, false, reslen, memlen); if (IsJson(args, 0) != 3) - memlen += 1000; // TODO: calculate this + memlen += more; // TODO: calculate this return JsonInit(initid, args, message, true, reslen, memlen); } // end of jsonlocate_init @@ -2905,7 +2912,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, return NULL; } // end of jsonlocate -void json_locate_deinit(UDF_INIT* initid) +void jsonlocate_deinit(UDF_INIT* initid) { JsonFreeMem((PGLOBAL)initid->ptr); } // end of jsonlocate_deinit @@ -2931,14 +2938,14 @@ my_bool json_locate_all_init(UDF_INIT *initid, UDF_ARGS *args, char *message) strcpy(message, "Fourth argument is not an integer (memory)"); return true; } else - more = (ulong)*(longlong*)args->args[2]; + more += (ulong)*(longlong*)args->args[2]; - CalcLen(args, false, reslen, memlen); + CalcLen(args, false, reslen, memlen); - if (IsJson(args, 0) != 3) - memlen += 1000; // TODO: calculate this + if (IsJson(args, 0) != 3) + memlen += more; // TODO: calculate this - return JsonInit(initid, args, message, true, reslen, memlen); + return JsonInit(initid, args, message, true, reslen, memlen); } // end of json_locate_all_init char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, @@ -3237,6 +3244,8 @@ char *jfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result, case INT_RESULT: pretty = (int)*(longlong*)args->args[i]; break; + default: + PUSH_WARNING("Unexpected argument type in jfile_make"); } // endswitch arg_type if (fn) { @@ -3397,12 +3406,12 @@ char *jbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, if (!CheckMemory(g, initid, args, 2, false, true)) { int *x = NULL; uint n = 2; - PJSON jsp; +// PJSON jsp; PJVAL jvp; PJAR arp; jvp = MakeValue(g, args, 0, &top); - jsp = jvp->GetJson(); +// jsp = jvp->GetJson(); x = GetIntArgPtr(g, args, n); if (CheckPath(g, args, top, jvp, n)) diff --git a/storage/connect/tabodbc.cpp b/storage/connect/tabodbc.cpp index 22a026c77b6..fd9a049a05a 100644 --- a/storage/connect/tabodbc.cpp +++ b/storage/connect/tabodbc.cpp @@ -513,7 +513,7 @@ bool TDBODBC::MakeInsert(PGLOBAL g) { char *schmp = NULL, *catp = NULL, buf[NAM_LEN * 3]; int len = 0; - bool b = false, oom; + bool b = false, oom = false; PTABLE tablep = To_Table; PCOL colp; From 0a852591dbaee4c33ab87d92d70a56cab225a2ca Mon Sep 17 00:00:00 2001 From: Olivier Bertrand Date: Sun, 8 Nov 2015 14:54:56 +0100 Subject: [PATCH 39/39] PATCH-P0-FIX-UPSTREAM: Fix possible buffer overflow (MDEV-8317) Maintainer: Michal Hrusecky (modified by O. Bertrand --> adding and using the XSTR macro) modified: storage/connect/tabxml.cpp --- storage/connect/tabxml.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 49fa9a1c554..9c47829d5bc 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -60,6 +60,7 @@ extern "C" char version[]; #endif // !__WIN__ #define TYPE_UNKNOWN 12 /* Must be greater than other types */ +#define XSTR(M) sizeof(M) - strlen(M) - 1 /* To avoid overflow*/ /***********************************************************************/ /* Class and structure used by XMLColumns. */ @@ -225,30 +226,30 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) more: if (vp->atp) { strncpy(colname, vp->atp->GetName(g), sizeof(colname)); - strncat(xcol->Name, colname, 64); + strncat(xcol->Name, colname, XSTR(xcol->Name)); switch (vp->atp->GetText(g, buf, sizeof(buf))) { case RC_INFO: PushWarning(g, txmp); case RC_OK: - strncat(fmt, "@", sizeof(fmt)); + strncat(fmt, "@", XSTR(fmt)); break; default: goto err; } // enswitch rc if (j) - strncat(fmt, colname, sizeof(fmt)); + strncat(fmt, colname, XSTR(fmt)); } else { if (tdp->Usedom && node->GetType() != 1) continue; strncpy(colname, node->GetName(g), sizeof(colname)); - strncat(xcol->Name, colname, 64); + strncat(xcol->Name, colname, XSTR(xcol->Name)); if (j) - strncat(fmt, colname, sizeof(fmt)); + strncat(fmt, colname, XSTR(fmt)); if (j < lvl && ok) { vp = lvlp[j+1]; @@ -266,9 +267,10 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) if (!vp->atp) node = vp->nl->GetItem(g, vp->k++, node); - strncat(strncat(fmt, colname, 125), "/", 125); - strncat(xcol->Name, "_", 64); - j++; + strncat(fmt, colname, XSTR(fmt)); + strncat(fmt, "/", XSTR(fmt)); + strncat(xcol->Name, "_", XSTR(xcol->Name)); + j++; vp->n = (int)strlen(xcol->Name); vp->m = (int)strlen(fmt); goto more;