nfs-ganesha 1.4

posixdb_connect.c

Go to the documentation of this file.
00001 #ifdef HAVE_CONFIG_H
00002 #include "config.h"
00003 #endif
00004 
00005 #include "posixdb_internal.h"
00006 
00007 fsal_posixdb_status_t fsal_posixdb_initPreparedQueries(fsal_posixdb_conn * p_conn);
00008 
00009 fsal_posixdb_status_t fsal_posixdb_connect(fsal_posixdb_conn_params_t * dbparams,
00010                                            fsal_posixdb_conn ** p_conn)
00011 {
00012   ConnStatusType st;
00013 
00014   *p_conn = PQsetdbLogin(dbparams->host,        /* Hostname */
00015                          dbparams->port,        /* Port number */
00016                          NULL,  /* Options */
00017                          NULL,  /* tty */
00018                          dbparams->dbname,      /* Database name */
00019                          dbparams->login,       /* Login */
00020                          NULL   /* Password is in a file */
00021       );
00022   if((st = PQstatus(*p_conn)) == CONNECTION_OK)
00023     {
00024       /*
00025          prepared statements
00026        */
00027       return fsal_posixdb_initPreparedQueries(*p_conn);
00028     }
00029   else
00030     {
00031       LogEvent(COMPONENT_FSAL, "ERROR: could not connect to database : %s",
00032                PQerrorMessage(*p_conn));
00033       PQfinish(*p_conn);
00034       ReturnCodeDB(ERR_FSAL_POSIXDB_BADCONN, (int)st);
00035       /* error message available with PQerrorMessage(dbconn) */
00036     }
00037 }
00038 
00039 fsal_posixdb_status_t fsal_posixdb_disconnect(fsal_posixdb_conn * p_conn)
00040 {
00041   PQfinish(p_conn);
00042   ReturnCodeDB(ERR_FSAL_POSIXDB_NOERR, 0);
00043 }
00044 
00045 fsal_posixdb_status_t fsal_posixdb_initPreparedQueries(fsal_posixdb_conn * p_conn)
00046 {
00047   PGresult *p_res;
00048 
00049 #ifdef _PGSQL8
00050   p_res = PQprepare(p_conn,
00051                     "buildOnePath",
00052                     "SELECT '/' || name, handleidparent, handletsparent FROM Parent WHERE handleid=$1::bigint AND handlets=$2::int",
00053                     2, NULL);
00054   CheckCommand(p_res);
00055   PQclear(p_res);
00056 
00057 #ifdef _WITH_PLPGSQL
00058   p_res = PQprepare(p_conn, "buildOnePathPL", "SELECT buildOnePath($1::bigint, $2::int)",       /* handleid, handlets */
00059                     2, NULL);
00060   CheckCommand(p_res);
00061   PQclear(p_res);
00062 #endif
00063 
00064   p_res = PQprepare(p_conn, "lookupPaths", "SELECT name, handleidparent, handletsparent \
00065                       FROM Parent \
00066                       WHERE handleid=$1::bigint AND handleTs=$2::int", 2, NULL);
00067   CheckCommand(p_res);
00068   PQclear(p_res);
00069 
00070   p_res = PQprepare(p_conn,
00071                     "lookupPathsExt",
00072                     "SELECT Parent.name, Parent.handleidparent, Parent.handletsparent, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00073                       FROM Parent LEFT JOIN Handle ON Parent.handleidparent = Handle.handleid AND Parent.handletsparent=Handle.handleTs\
00074                       WHERE Parent.handleid=$1::bigint AND Parent.handleTs=$2::int",
00075                     2, NULL);
00076   CheckCommand(p_res);
00077   PQclear(p_res);
00078 
00079   p_res = PQprepare(p_conn,
00080                     "lookupHandleByName",
00081                     "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00082                       FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \
00083                       WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text",
00084                     3, NULL);
00085   CheckCommand(p_res);
00086   PQclear(p_res);
00087 
00088   p_res = PQprepare(p_conn,
00089                     "lookupHandleByNameFU",
00090                     "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00091                       FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \
00092                       WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text \
00093                       FOR UPDATE", 3, NULL);
00094   CheckCommand(p_res);
00095   PQclear(p_res);
00096 
00097   p_res = PQprepare(p_conn,
00098                     "lookupRootHandle",
00099                     "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00100                       FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \
00101                       WHERE Parent.handleidparent=Parent.handleid AND Parent.handletsparent=Parent.handlets",
00102                     0, NULL);
00103   CheckCommand(p_res);
00104   PQclear(p_res);
00105 
00106   p_res = PQprepare(p_conn,
00107                     "lookupHandleByInodeFU",
00108                     "SELECT handleId, handleTs, nlink, ctime, ftype\
00109                       FROM Handle \
00110                       WHERE deviceid=$1::bigint AND inode=$2::bigint \
00111                       FOR UPDATE", 2, NULL);
00112   CheckCommand(p_res);
00113   PQclear(p_res);
00114 
00115   p_res = PQprepare(p_conn,
00116                     "lookupHandleFU",
00117                     "SELECT Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00118                       FROM Handle \
00119                       WHERE handleid=$1::bigint AND handleTs=$2::int \
00120                       FOR UPDATE", 2, NULL);
00121   CheckCommand(p_res);
00122   PQclear(p_res);
00123 
00124   p_res = PQprepare(p_conn,
00125                     "lookupHandle",
00126                     "SELECT Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00127                       FROM Handle \
00128                       WHERE handleid=$1::bigint AND handleTs=$2::int \
00129                       ", 2, NULL);
00130   CheckCommand(p_res);
00131   PQclear(p_res);
00132 
00133   p_res = PQprepare(p_conn, "updateHandle", "UPDATE Handle \
00134                       SET ctime=$4::int, nlink=$3::smallint \
00135                       WHERE handleid=$1::bigint AND handleTs=$2::int", 4, NULL);
00136   CheckCommand(p_res);
00137   PQclear(p_res);
00138 
00139   p_res = PQprepare(p_conn, "updateHandleNlink", "UPDATE Handle \
00140                       SET nlink=$3::smallint \
00141                       WHERE handleid=$1::bigint AND handleTs=$2::int", 3, NULL);
00142   CheckCommand(p_res);
00143   PQclear(p_res);
00144 
00145   p_res = PQprepare(p_conn, "lookupParent", "SELECT handleid, handlets \
00146                       FROM Parent \
00147                       WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text ", 3, NULL);
00148   CheckCommand(p_res);
00149   PQclear(p_res);
00150 
00151   p_res = PQprepare(p_conn,
00152                     "lookupChildrenFU",
00153                     "SELECT Handle.handleid, Handle.handlets, Handle.ftype, Parent.name, Handle.nlink \
00154                       FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\
00155                       WHERE Parent.handleidparent=$1::bigint AND Parent.handletsparent=$2::int \
00156                         AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets) \
00157                       FOR UPDATE", 2, NULL);
00158   CheckCommand(p_res);
00159   PQclear(p_res);
00160 
00161   p_res = PQprepare(p_conn,
00162                     "lookupChildren",
00163                     "SELECT Handle.handleid, Handle.handlets, Parent.name, Handle.inode, Handle.deviceid, Handle.nlink, Handle.ctime, Handle.ftype \
00164                       FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\
00165                       WHERE Parent.handleidparent=$1::bigint AND Parent.handletsparent=$2::int \
00166                         AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets)",
00167                     2, NULL);
00168   CheckCommand(p_res);
00169   PQclear(p_res);
00170 
00171   p_res = PQprepare(p_conn, "countChildren", "SELECT count(*) \
00172                       FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\
00173                       WHERE Parent.handleidparent=$1::bigint AND Parent.handletsparent=$2::int \
00174                         AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets)", 2, NULL);
00175   CheckCommand(p_res);
00176   PQclear(p_res);
00177 
00178   p_res = PQprepare(p_conn,
00179                     "insertHandle",
00180                     "INSERT INTO Handle(deviceid, inode, handleTs, nlink, ctime, ftype) \
00181                       VALUES ($1::int, $2::bigint, $3::bigint, $4::smallint, $5::int, $6::int)", 6, NULL);
00182   CheckCommand(p_res);
00183   PQclear(p_res);
00184 
00185   p_res = PQprepare(p_conn, "updateParent", "UPDATE Parent \
00186                      SET handleidparent=$4::bigint, handletsparent=$5::int, name=$6::text \
00187                      WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text", 5, NULL);
00188   CheckCommand(p_res);
00189   PQclear(p_res);
00190 
00191   p_res = PQprepare(p_conn,
00192                     "insertParent",
00193                     "INSERT INTO Parent(handleidparent, handletsparent, name, handleid, handlets) \
00194                      VALUES($1::bigint, $2::int, $3::text, $4::bigint, $5::int)",
00195                     5, NULL);
00196   CheckCommand(p_res);
00197   PQclear(p_res);
00198 
00199   p_res = PQprepare(p_conn,
00200                     "deleteParent",
00201                     "DELETE FROM Parent WHERE handleidparent=$1::bigint AND handletsparent=$2::int AND name=$3::text",
00202                     3, NULL);
00203   CheckCommand(p_res);
00204   PQclear(p_res);
00205 
00206   p_res = PQprepare(p_conn,
00207                     "deleteHandle",
00208                     "DELETE FROM Handle WHERE handleid=$1::bigint AND handlets=$2::int",
00209                     2, NULL);
00210   CheckCommand(p_res);
00211   PQclear(p_res);
00212 
00213 #else
00214   /* For PostgreSQL versions < 8 that do not have PQprepare functions */
00215   p_res = PQexec(p_conn,
00216                  "PREPARE \"buildOnePath\"(bigint, int) AS "
00217                  "SELECT '/' || name, handleidparent, handletsparent FROM Parent WHERE handleid=$1 AND handlets=$2");
00218   CheckCommand(p_res);
00219   PQclear(p_res);
00220 
00221 #ifdef _WITH_PLPGSQL
00222   p_res = PQexec(p_conn,
00223                  "PREPARE \"buildOnePathPL\"(bigint, int) AS "
00224                  "SELECT buildOnePath($1, $2)" /* handleid, handlets */ );
00225   CheckCommand(p_res);
00226   PQclear(p_res);
00227 #endif
00228 
00229   p_res = PQexec(p_conn,
00230                  "PREPARE \"lookupPaths\"(bigint, int) AS "
00231                  "SELECT name, handleidparent, handletsparent \
00232                       FROM Parent \
00233                       WHERE handleid=$1 AND handleTs=$2");
00234   CheckCommand(p_res);
00235   PQclear(p_res);
00236 
00237   p_res = PQexec(p_conn,
00238                  "PREPARE \"lookupPathsExt\"(bigint, int) AS "
00239                  "SELECT Parent.name, Parent.handleidparent, Parent.handletsparent, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00240                       FROM Parent LEFT JOIN Handle ON Parent.handleidparent = Handle.handleid AND Parent.handletsparent=Handle.handleTs\
00241                       WHERE Parent.handleid=$1 AND Parent.handleTs=$2");
00242   CheckCommand(p_res);
00243   PQclear(p_res);
00244 
00245   p_res = PQexec(p_conn,
00246                  "PREPARE \"lookupHandleByName\"(bigint, int, text) AS "
00247                  "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00248                       FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \
00249                       WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3");
00250   CheckCommand(p_res);
00251   PQclear(p_res);
00252 
00253   p_res = PQexec(p_conn,
00254                  "PREPARE \"lookupHandleByNameFU\"(bigint, int, text) AS "
00255                  "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00256                       FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \
00257                       WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3 \
00258                       FOR UPDATE");
00259   CheckCommand(p_res);
00260   PQclear(p_res);
00261 
00262   p_res = PQexec(p_conn,
00263                  "PREPARE \"lookupRootHandle\" AS "
00264                  "SELECT Parent.handleid, Parent.handlets, Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00265                       FROM Parent INNER JOIN Handle ON Parent.handleid = Handle.handleid AND Parent.handlets=Handle.handleTs \
00266                       WHERE Parent.handleidparent=Parent.handleid AND Parent.handletsparent=Parent.handlets");
00267   CheckCommand(p_res);
00268   PQclear(p_res);
00269 
00270   p_res = PQexec(p_conn,
00271                  "PREPARE \"lookupHandleByInodeFU\"(bigint, int) AS "
00272                  "SELECT handleId, handleTs, nlink, ctime, ftype\
00273                       FROM Handle \
00274                       WHERE deviceid=$1 AND inode=$2 \
00275                       FOR UPDATE");
00276   CheckCommand(p_res);
00277   PQclear(p_res);
00278 
00279   p_res = PQexec(p_conn,
00280                  "PREPARE \"lookupHandleFU\"(bigint, int) AS "
00281                  "SELECT Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00282                       FROM Handle \
00283                       WHERE handleid=$1 AND handleTs=$2 \
00284                       FOR UPDATE");
00285   CheckCommand(p_res);
00286   PQclear(p_res);
00287 
00288   p_res = PQexec(p_conn,
00289                  "PREPARE \"lookupHandle\"(bigint, int) AS "
00290                  "SELECT Handle.deviceId, Handle.inode, Handle.nlink, Handle.ctime, Handle.ftype \
00291                       FROM Handle \
00292                       WHERE handleid=$1 AND handleTs=$2");
00293   CheckCommand(p_res);
00294   PQclear(p_res);
00295 
00296   p_res = PQexec(p_conn,
00297                  "PREPARE \"updateHandle\"(bigint, int, smallint, int) AS "
00298                  "UPDATE Handle \
00299                       SET ctime=$4, nlink=$3 \
00300                       WHERE handleid=$1 AND handleTs=$2");
00301   CheckCommand(p_res);
00302   PQclear(p_res);
00303 
00304   p_res = PQexec(p_conn,
00305                  "PREPARE \"updateHandleNlink\"(bigint, int, smallint) AS "
00306                  "UPDATE Handle \
00307                       SET nlink=$3 \
00308                       WHERE handleid=$1 AND handleTs=$2");
00309   CheckCommand(p_res);
00310   PQclear(p_res);
00311 
00312   p_res = PQexec(p_conn,
00313                  "PREPARE \"lookupParent\"(bigint, int, text) AS "
00314                  "SELECT handleid, handlets \
00315                       FROM Parent \
00316                       WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3");
00317   CheckCommand(p_res);
00318   PQclear(p_res);
00319 
00320   p_res = PQexec(p_conn,
00321                  "PREPARE \"lookupChildrenFU\"(bigint, int) AS "
00322                  "SELECT Handle.handleid, Handle.handlets, Handle.ftype, Parent.name, Handle.nlink \
00323                       FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\
00324                       WHERE Parent.handleidparent=$1 AND Parent.handletsparent=$2 \
00325                         AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets) \
00326                       FOR UPDATE");
00327   CheckCommand(p_res);
00328   PQclear(p_res);
00329 
00330   p_res = PQexec(p_conn,
00331                  "PREPARE \"lookupChildren\"(bigint, int) AS "
00332                  "SELECT Handle.handleid, Handle.handlets, Parent.name, Handle.inode, Handle.deviceid, Handle.nlink, Handle.ctime, Handle.ftype \
00333                       FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\
00334                       WHERE Parent.handleidparent=$1 AND Parent.handletsparent=$2 \
00335                         AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets)");
00336   CheckCommand(p_res);
00337   PQclear(p_res);
00338 
00339   p_res = PQexec(p_conn, "PREPARE \"countChildren\"(bigint, int) AS " "SELECT count(*) \
00340                       FROM Parent INNER JOIN Handle ON Handle.handleid=Parent.handleid AND Handle.handlets=Parent.handlets\
00341                       WHERE Parent.handleidparent=$1 AND Parent.handletsparent=$2 \
00342                         AND NOT (Parent.handleidparent = Parent.handleid AND Parent.handletsparent = Parent.handlets)");
00343   CheckCommand(p_res);
00344   PQclear(p_res);
00345 
00346   p_res = PQexec(p_conn,
00347                  "PREPARE \"insertHandle\"(int, bigint, bigint, smallint, int, int) AS "
00348                  "INSERT INTO Handle(deviceid, inode, handleTs, nlink, ctime, ftype) \
00349                       VALUES ($1, $2, $3, $4, $5, $6)");
00350   CheckCommand(p_res);
00351   PQclear(p_res);
00352 
00353   p_res = PQexec(p_conn,
00354                  "PREPARE \"updateParent\"(bigint, int, text, bigint, int, text) AS "
00355                  "UPDATE Parent \
00356                      SET handleidparent=$4, handletsparent=$5, name=$6 \
00357                      WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3");
00358   CheckCommand(p_res);
00359   PQclear(p_res);
00360 
00361   p_res = PQexec(p_conn,
00362                  "PREPARE \"insertParent\"(bigint, int, text, bigint, int) AS "
00363                  "INSERT INTO Parent(handleidparent, handletsparent, name, handleid, handlets) \
00364                      VALUES($1, $2, $3, $4, $5)");
00365   CheckCommand(p_res);
00366   PQclear(p_res);
00367 
00368   p_res = PQexec(p_conn,
00369                  "PREPARE \"deleteParent\"(bigint, int, text) AS "
00370                  "DELETE FROM Parent WHERE handleidparent=$1 AND handletsparent=$2 AND name=$3");
00371   CheckCommand(p_res);
00372   PQclear(p_res);
00373 
00374   p_res = PQexec(p_conn,
00375                  "PREPARE \"deleteHandle\"(bigint, int) AS "
00376                  "DELETE FROM Handle WHERE handleid=$1::bigint AND handlets=$2::int");
00377   CheckCommand(p_res);
00378   PQclear(p_res);
00379 
00380 #endif
00381 
00382   ReturnCodeDB(ERR_FSAL_POSIXDB_NOERR, 0);
00383 }