Warning: include_once(/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php): failed to open stream: No such file or directory in /var/www/html/fields/dbp15/local/config.php on line 4

Warning: include_once(): Failed opening '/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php' for inclusion (include_path='.:/opt/php/lib/php') in /var/www/html/fields/dbp15/local/config.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fields/dbp15/local/config.php:4) in /var/www/html/pmwiki-2.2.86/pmwiki.php on line 1250
Datenbankpraktikum SS 2015 - D - DMS

Data Manipulation Statements

Insert

Das Insert Statement fügt Daten in eine Tabelle ein. Anfangend von dem Schlüsselwortpaar 'INSERT INTO' sucht der Parser in einer Schleife nach Strings, falls der Token '(' erkannt wurde. Die Schleife endet mit dem Erreichen des Tokens ')'. Diese Strings repräsentieren die zu manipulierenden Spalten. Hiernach muss der Parser das Schlüsselwort 'VALUES' erkennen, gefolgt von einer Reihe Objekten, getrennt durch den Delimiter ',' und eingeschlossen in runden Klammern.

pub struct InsertStatement {
    pub tablename: String,
    pub columns: Vec<String>,
    pub values: Vec<Object<T>>
}

Where

Bevor die restlichen Data Manipulation Statements erklärt werden können, muss vorher erläutert werden wie die where-clauses geparsed werden. Zuallererst muss vergewissert werden, dass where-clauses aus mehreren Bedingungsblöcken bestehen kann, weshalb wir es als Option implementieren können. Dazu wäre eine Arraydatenstruktur empfehlenswert, jedoch ist auch die Anordnung wichtig, weil wir die Schlüsselwörter 'and' und 'or' verwenden und dadurch die Reihenfolge der Berechnung sich verändert. 'and' Klausen haben eine höhere Priorität als 'or' weshalb wir uns dazu entschieden haben daraus einen binären Baum zu erstellen durch den wir rekursiv die Bedingungsblöcke abarbeiten können. Dabei kann ein Bedingungsblock ein Blatt oder ein 'and'/or' Block sein. Bei einem Blatt haben wir nur eine Bedingung, die 'true' oder 'false' zurück gibtwährend Letzteres zwei weitere Bedingungsblöcke rekursiv vergleicht. Eine Bedingung selbst kann in unserer Implementierung nur einzelne Spalten mit Literalen oder Spalten vergleichen, statt Literal mit Literal.

pub enum Conditions {
    Leaf(Condition),
    And(Conditions, Conditions),
    Or(Conditions, Conditions)
}
pub struct Condition {
    pub columnname: String,
    pub operation: CompType,
    pub comparison: Object<T>
}
pub enum CompType {
    Equal,
    NotEqual,
    GreaterThan,
    SmallerThan,
    GreaterOrEqual,
    SmallerOrEqual
}

Update

Auch für das Update Statement erwarten wir einen zu verändernden Tabellennamen gefolgt von einer Zuweisung, die in einem Vektor als Pseudobedingungsblock festgehalten wird. Auf der gleichen Ebene wird auch ein richtiger Bedingungsblock als Option gespeichert und zur Weitergabe vorbereitet.

pub struct UpdateStmt {
    pub tablename: String,
    pub set: Vec<Condition>,
    pub condition: Option<Conditions>
}

Delete

Das Delete Statement ähnelt dem Update, mit dem Unterschied, dass wir keine Zuweisung benötigen.

pub struct DeleteStatement {
    pub tablename: String,
    pub condition: Option<Conditions>
}

Select

Das komplexeste der Manipulation Statements, das Select Statement, musste teils anders abgearbeitet werden. Hierfür brauchen wir am Anfang vom Parsen eine Reihe von Targets, die die zu Suchenden Spalten darstellen. Wie auch vorher werden die als Vektor festgehalten. Das Abarbeiten der Spaltennamen und Aliase wurde gelöst indem Zeichenketten bis zu Delimitern ausgelesen wurden. Zu Delimitern zählen hier Punkte, Schlüsselwörter und '*', da hier jede Spalte ausgewählt werden soll. Danach wird nach dem 'from' Schlüsselwort eine Reihe von Tabellennamen ausgelesen, auch getrennt von Delimitern und in einen Vektor gespeichert. Darauf folgend wird eine where-clause geparsed bis wir entweder ans Ende der Query oder an ein weiteres Schlüsselwort kommen. Als nächstes Schlüsselwort wurde ein optionales 'order_by' angegeben, welches ein Vektor von der Sort Klasse erwartet, bestehend aus Spaltennamen und dem Schlüsselwort 'asc' oder 'desc'. Zuallererst gibt es ein optionales Limit, welches nach dem zugehörigen Schlüsselwort entweder eine oder zwei getrennt durch den Delimiter ',' Zahlen parsed.

pub struct SelectStatement {
    pub selected_columns: Vec<Target>,
    pub tablename: Vec<String>,
    pub condition: Option<Conditions>,
    pub order_by: Vec<Sort>,
    pub limit: Option<int>,
}

Autor: Quoc Tri Tran
Gruppe: Quoc Tri Tran, Hendrik Langebrake


Page last modified on September 24, 2015, at 02:38 PM