← Back to team overview

sslug-teknik team mailing list archive

Re: Brug af expect ?

 

Hej

Brian Ipsen wrote:
Hej,
SQL ....
Hvis flere resultater kommer retur efter en query, så skal jeg have mulighed
for at loop'e igennem dem, og bearbejde dem linie efter linie.
Jeg har mere eller mindre et script i bash, som klarer det i øjeblikket -
men vil gerne over i expect, da jeg tror det kan give bedre performance...

Uanset om du bruger expect elelr ej, hvordan ved du så når du er nået til
sidste linje af et resultat ?

> Any hints ?

Jeg bruger istedet perl og perl-modulet DBI.

  use DBI;
  #use strict;
  my $dbh = DBI->connect("DBI:mysql:database=$my_dbn;host=localhost",
    $my_dbuser, $my_dbpasswd, {RaiseError => 0, AutoCommit => 0});
  my $sth = $dbh->prepare("SELECT * FROM something WHERE someotherthing = 'somethirdthing'");
  $sth->execute();
  while (my $ref = $sth->fetchrow_arrayref) {
     do_something_with($$ref[0]);
  }
  $sth->finish();

  do_something_more;

  $dbh->disconnect();

Simpelt, hurtigt og effektivt.  Eneste catch er, at man lige skal lære Perl,
men det skader jo nok ikke.

Fåes ikke meget hurtigere med mindre du vil
buge C/C++, men det er også meget let.

        // Init MySQL
        MYSQL* handle = mysql_init(NULL);
        if (!handle) {
//              fprintf(stderr, "Failed to init mysql\n");
                return 0;
        }
        // Connect to db
        if (!mysql_real_connect(handle, host, user, passwd, db, port, socket, flag)) {
//              fprintf(stderr, "Failed to connect to mysql\n");
                mysql_close(handle);
                return 0;
        }
        sprintf(query, "SELECT %s,%s FROM %s WHERE %s <= %u AND %s >= %u AND %s = 'A' AND %s = 'Y'",
                start, end, table, start, addr, end, addr, allowdeny, enabled);

        // First we query
        if (mysql_real_query(handle, query, (unsigned long) strlen(query)) == 0) {

                // Then we prepare the result
                if ((result = mysql_use_result(handle)) != NULL) {

                        // Now see if we matched anything
                        validated = mysql_fetch_row(result) ? 1 : 0;

                        // Now free result again
                        mysql_free_result(result);
                } // else fprintf(stderr, "Failed to prepare result of query\n");
        } // else fprintf(stderr, "Failed to query database\n");

        mysql_close(handle);

Man kan sikkert også bruge Tk/Tcl, men den har jeg ikke lige på stående fod.

--PMM



Follow ups

References